Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Просто хочется понять в чём я ошибся... / 25 сообщений из 29, страница 1 из 2
30.04.2014, 10:18
    #38629804
Маслов Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
Добрый день, коллеги!
Решал я тут недавно тестовое задаение в заморскую компанию и они мне сказали, что я не прошёл его. Комментариев от них, что именно я сделал не так я не получил. Возможно, общими усилиями, мы сможем найти ошибки?!

Всё, что мы видим - это лишь иллюзия ...
...
Рейтинг: 0 / 0
30.04.2014, 11:40
    #38629932
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
Аттачмент трудно квотировать. Не поленись отформатировать и опубликовать в удобном
для форумчан виде.
...
Рейтинг: 0 / 0
30.04.2014, 11:56
    #38629956
Маслов Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
Я бы не хотел код и вопросы выкладывать в открытом виде, так как SQL.RU очень хорошо индексируется.
Хотя свой код, можно.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
I can rewrite this function with parameters which transfer by link.
void GetSomeIDs( int* &val )
{
	…
   	if ( !val )
      	   val = new int[8];
…
}
example of run this function
int *pVal  = NULL;
GetSomeIDs( pVal );
After started this function pVal will contain new address(pointer to new memory vector). You should free memory in the end of use.



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
Maybe I don’t understood questions but my mind code below can realize functionality  described in your question

typedef struct {
   char* alias;   /* '\0'-terminated C string */
   int   specific_id;
   } aliasID;

int *array = NULL;

/* How many structures should be pointed to by the array
 */
int GetNumberOfAliases(void)
{
   if ( array ) {
      int i = 0;
      while ( array [i++] != 0 );
      return i;
   }
   return -1;
}
//---------------------------------------------------------------------------
/* Get a pointer to the next structure.  The structure itself
 * will be filled with data.
 * Caller is responsible for the cleanup of the returned structure
 *     and its content. The latter are allocated in
 *     dynamic memory.
 */
//---------------------------------------------------------------------------
aliasID * GetNextAlias(void)
{
   aliasID *paliasID = (aliasID *)malloc (sizeof(aliasID));
   if ( array ) {
      int vCnt = GetNumberOfAliases();
      array = (int *)realloc ( array, (vCnt + 1) * sizeof(int) );
      if (array) {
         array[ vCnt - 1 ] = (int) paliasID;
         array[ vCnt ] = 0;
      } else {
          free( (aliasID *) paliasID );
          return NULL;
      }

   }
   else {
      array = (int *)malloc ( sizeof (int) * 2 );
      if ( array ) {
         array[0] = (int) paliasID;
         array[1] = 0;
      } else {
         free( (aliasID *) paliasID );
         return NULL;
      }
   }
   return paliasID;
}
//---------------------------------------------------------------------------
int* GetSomeIDs(int arrSize, int &vSize )
{
   for (int i = 0; i < arrSize; i++ ) {
      aliasID * val = GetNextAlias();
      if ( val ) {
         val->alias = new char [10];
         sprintf(val->alias, "val%d\0", i);
         val->specific_id = i;
      } else
         printf("Error memory allocate");
   }
   vSize = GetNumberOfAliases() - 1;
   return array;
}void main ()
{
   int vSize = 0;
   int *val = GetSomeIDs( 8, vSize );
   if ( vSize == 8)
      printf ("all is good");
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
void FreeArray()
{
   int vSize = 0, i = 0;
   int *val = GetSomeIDs( 2, vSize );
   char specific_id_buf[11] = {'\0'};

   while ( val[i] != 0 ) {
      printf( ((aliasID * )val[i])->alias );
      free (((aliasID * )val[i])->alias);
      ((aliasID * )val[i])->alias = NULL;
      memset(specific_id_buf, '\0', 11);
      sprintf( specific_id_buf, "specific_id = %d", ((aliasID * )val[i])->specific_id );
      aliasID *pVal = (aliasID * )val[i];
      free( pVal );
      val[i++] = 0;
   }
   free ((int *) val);
   val = NULL;
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
typedef void (*anyfunc)( int &val );

void UserFunc ( int &val ){ val++; }

void RecalcArray(int *val, anyfunc func )
{
   int i = 0;
   while ( val[i] != 0 ) {
      func (val[i++]);
   }
}

void main()
{
   int val[10] = {1,2,3,4,6,7,8,9,0};
   RecalcArray (val, UserFunc);
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
ListID* AddToList ( ListID *pList, int arr_val )
{
   if ( pList ) {
      ListID *cList = new ListID;
      cList->arr_id = arr_val;
      cList->prevVal = pList;
      cList->nextVal = NULL;
      pList->nextVal = cList;
      return cList;
   } else {
      pList = new ListID;
      pList->arr_id = arr_val;
      pList->prevVal = NULL;
      pList->nextVal = NULL;
      return pList;
   }
}
ListID* ConvertArrayToList( int *array )
{
   int i = 0;
   ListID* lHead = NULL;
   while ( array[i] != 0 )
      lHead = AddToList ( lHead, array[i++] );
   return lHead;
}
void main ()
{
   int val[10] = {1,2,3,4,5,6,7,8,9,0};
   ListID *lPointer = ConvertArrayToList( val ); // return pointer on last list item
}
...
Рейтинг: 0 / 0
01.05.2014, 00:59
    #38630747
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
Возможно, общими усилиями, мы сможем найти ошибки?!


Главная ошибка, в общем, она и единственная: ты не врубаешся. В язык С++.
...
Рейтинг: 0 / 0
01.05.2014, 10:40
    #38630812
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
Маслов Андрей
Код: plaintext
1.
After started this function pVal will contain new address(pointer to new memory vector). You should free memory in the end of use.


и с английским плохо
...
Рейтинг: 0 / 0
02.05.2014, 09:46
    #38631240
Strangecat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
Маслов Андрей
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
val = new int[8];
aliasID *paliasID = (aliasID *)malloc (sizeof(aliasID));
printf ("all is good");
void main()
free( (aliasID *) paliasID );

         val->alias = new char [10];  //int_max = 2 147 483 647
         sprintf(val->alias, "val%d\0", i);





Задания не читал. Глянул код по диагонали, не вдаваясь в подробности что он делает.

За new[] надо бить тапками по рукам. В с++ есть чудо контейнеры с божественным raii.
Тоже самое про магическое число 8.

За malloc в си++ можно и канделябрам по голове получить.

printf'у не хватает \n в конце, что важно так как некоторые реализации пока не дождутся \n, ничего не выведут на экран(буферизация).

void main() это не стандарт ни разу.

нафига в free( (aliasID *) paliasID ); делать приведение типа paliasID к самому себе же?

в последнем примере (sprintf) a) возможен выход за пределы буфера в 10 символов (например, для i = 10 000 000 - 8 символов + 3 символа val + 1 завершающий ноль ) и зачем \0 ты добавил неясно. \0 в стринговых литералах по умолчанию.
...
Рейтинг: 0 / 0
02.05.2014, 09:51
    #38631244
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
Strangecat,

Зря не читали задание. Там в самом начале такой толстый намек на то, что код-то надо переписывать чуть более чем полностью. ТС этого так и не понял.
...
Рейтинг: 0 / 0
02.05.2014, 12:12
    #38631306
luislom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
StrangecatЗа new[] надо бить тапками по рукам. В с++ есть чудо контейнеры с божественным raii.
Тоже самое про магическое число 8.

За malloc в си++ можно и канделябрам по голове получить.



Можно спросить у мастера в этом отдельно взятом государстве, а заглядывал ли он
в исходники реализаций всемогущих и распрекрасных С++ контейнеров, с божественным RAII?
Или, о великий, думает что там нет new[], malloc, и не знает как там реализована эта RAII, и что
это нельзя повторить самому, буквально одним своим конструктором своего объекта.
...
Рейтинг: 0 / 0
02.05.2014, 12:44
    #38631327
Маслов Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
StrangecatМаслов Андрей
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
val = new int[8];
aliasID *paliasID = (aliasID *)malloc (sizeof(aliasID));
printf ("all is good");
void main()
free( (aliasID *) paliasID );

         val->alias = new char [10];  //int_max = 2 147 483 647
         sprintf(val->alias, "val%d\0", i);





Задания не читал. Глянул код по диагонали, не вдаваясь в подробности что он делает.

За new[] надо бить тапками по рукам. В с++ есть чудо контейнеры с божественным raii.
Тоже самое про магическое число 8.

За malloc в си++ можно и канделябрам по голове получить.

printf'у не хватает \n в конце, что важно так как некоторые реализации пока не дождутся \n, ничего не выведут на экран(буферизация).

void main() это не стандарт ни разу.

нафига в free( (aliasID *) paliasID ); делать приведение типа paliasID к самому себе же?

в последнем примере (sprintf) a) возможен выход за пределы буфера в 10 символов (например, для i = 10 000 000 - 8 символов + 3 символа val + 1 завершающий ноль ) и зачем \0 ты добавил неясно. \0 в стринговых литералах по умолчанию.
Вы задание читали?
...
Рейтинг: 0 / 0
02.05.2014, 12:51
    #38631333
Маслов Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
MasterZivStrangecat,

Зря не читали задание. Там в самом начале такой толстый намек на то, что код-то надо переписывать чуть более чем полностью. ТС этого так и не понял.
Спасибо за комментарий, но я бы хотел получить более подробный ответ. "Обосрать" решение не сложно, а вот предложить свое?!

Кстати, для всех остальных, С++ это хорошо, но если внимательно почитать задание, то Вы увидите, что реализация необходима на чистом С!
...
Рейтинг: 0 / 0
02.05.2014, 13:06
    #38631340
Маслов Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
StrangecatМаслов Андрей
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
val = new int[8];
aliasID *paliasID = (aliasID *)malloc (sizeof(aliasID));
printf ("all is good");
void main()
free( (aliasID *) paliasID );

         val->alias = new char [10];  //int_max = 2 147 483 647
         sprintf(val->alias, "val%d\0", i);





Задания не читал. Глянул код по диагонали, не вдаваясь в подробности что он делает.

За new[] надо бить тапками по рукам. В с++ есть чудо контейнеры с божественным raii.
Тоже самое про магическое число 8.

За malloc в си++ можно и канделябрам по голове получить.

printf'у не хватает \n в конце, что важно так как некоторые реализации пока не дождутся \n, ничего не выведут на экран(буферизация).

void main() это не стандарт ни разу.

нафига в free( (aliasID *) paliasID ); делать приведение типа paliasID к самому себе же?

в последнем примере (sprintf) a) возможен выход за пределы буфера в 10 символов (например, для i = 10 000 000 - 8 символов + 3 символа val + 1 завершающий ноль ) и зачем \0 ты добавил неясно. \0 в стринговых литералах по умолчанию.

"void main() это не стандарт ни разу"
Рас кройте более подробно эту строку, что вы тут имели ввиду?!
...
Рейтинг: 0 / 0
02.05.2014, 13:10
    #38631342
Маслов Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
MasterZivВозможно, общими усилиями, мы сможем найти ошибки?!


Главная ошибка, в общем, она и единственная: ты не врубаешся. В язык С++.
А должен, если просят использовать "Plain C"?!
...
Рейтинг: 0 / 0
02.05.2014, 13:13
    #38631345
Маслов Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
И коллеги,без обид, давайте комментировать четко с учетом задания! Я ни сколько не сомневаюсь в вашем опыте и профессионализме, по этой причине и выложил задание на этот форум. Так что давайте не будем меряться "писька...", а просто вместе решим задание и найдем ошибки с учетом нашего опыта и знаний!!!
Заранее спасибо!
...
Рейтинг: 0 / 0
02.05.2014, 13:15
    #38631346
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
Маслов АндрейА должен, если просят использовать "Plain C"?!
Должен, поскольку твой код это сосем не "plain C", в котором нет ни оператора new, ни
параметров-ссылок.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.05.2014, 13:18
    #38631348
Маслов Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
Dimitry SibiryakovМаслов АндрейА должен, если просят использовать "Plain C"?!
Должен, поскольку твой код это сосем не "plain C", в котором нет ни оператора new, ни
параметров-ссылок.

Спасибо, с new понятно, собственно в других заданиях было четко указано про использование plain c, кроме этого. Но как в таком случае вы бы решили втрое задание?
...
Рейтинг: 0 / 0
02.05.2014, 13:27
    #38631351
smald
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
Маслов Андрей"void main() это не стандарт ни разу"
Рас кройте более подробно эту строку, что вы тут имели ввиду?!

По стандарту int main()
...
Рейтинг: 0 / 0
02.05.2014, 13:34
    #38631354
Маслов Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
smaldМаслов Андрей"void main() это не стандарт ни разу"
Рас кройте более подробно эту строку, что вы тут имели ввиду?!

По стандарту int main()
Спасибо
...
Рейтинг: 0 / 0
02.05.2014, 13:34
    #38631355
smald
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
И ещё не проверяются результаты запросов памяти, в случае использования new,
возможные исклуючения должны перехватываться.
...
Рейтинг: 0 / 0
02.05.2014, 14:07
    #38631373
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
smaldИ ещё не проверяются результаты запросов памяти, в случае использования new,
возможные исклуючения должны перехватываться.
Вот вить какая штука. А я их не перехватывал. Чё теперь делать?
...
Рейтинг: 0 / 0
02.05.2014, 14:36
    #38631389
Strangecat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
maytonsmaldИ ещё не проверяются результаты запросов памяти, в случае использования new,
возможные исклуючения должны перехватываться.
Вот вить какая штука. А я их не перехватывал. Чё теперь делать?

Разрешаю не перехватывать.

И так как тс хотел подробностей:

Во-первых, на линуксе выделение памяти врёт, и память успешно вернется даже если её нет, а потом будет романтическое свидание с out of memory killer.

Во-вторых, задолго до окончания памяти, система будет так своппится, что прогу убьют/комп заребутят (у меня как-то память кончалась, комп тормозил так что между нажатием клавиши и реакцией на экране проходило 5 секунд, я не выдержал - ресетнул нафиг).

В-третьих, если нет памяти на 10 интов, то усё пропало в любом случае и ничего нельзя сделать, кроме как дать деструкторам очистить что те успеют.

Сейчас не 1990-ые года, памяти много больше чем 640 кб.

Короче, если не аллокается несколько гигов или не на ембеде, то проверять не надо.
...
Рейтинг: 0 / 0
02.05.2014, 15:26
    #38631406
luislom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
[quot Strangecat]
Хвалю.
Но без if(!*alloc(...)){} и try{ new... }catch(){} быдлокод детектед.
...
Рейтинг: 0 / 0
02.05.2014, 15:46
    #38631420
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
luislom, что у тебя будет в catch?
...
Рейтинг: 0 / 0
02.05.2014, 16:12
    #38631433
smald
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
maytonluislom, что у тебя будет в catch?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
operator new (std::size_t sz) _GLIBCXX_THROW (std::bad_alloc)
43 	{
44 	void *p;
45 	
46 	/* malloc (0) is unpredictable; avoid it. */
47 	if (sz == 0)
48 	sz = 1;
49 	p = (void *) malloc (sz);
50 	while (p == 0)
51 	{
52 	new_handler handler = std::get_new_handler ();
53 	if (! handler)
54 	_GLIBCXX_THROW_OR_ABORT(bad_alloc());
55 	handler ();
56 	p = (void *) malloc (sz);
57 	}
58 	
59 	return p;
60 	}


Если такое не отхерачишь
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
operator new (std::size_t sz, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT
36 	{
37 	void *p;
38 	
39 	/* malloc (0) is unpredictable; avoid it. */
40 	if (sz == 0)
41 	sz = 1;
42 	p = (void *) malloc (sz);
43 	while (p == 0)
44 	{
45 	new_handler handler = std::get_new_handler ();
46 	if (! handler)
47 	return 0;
48 	__try
49 	{
50 	handler ();
51 	}
52 	__catch(const bad_alloc&)
53 	{
54 	return 0;
55 	}
56 	
57 	p = (void *) malloc (sz);
58 	}
59 	
60 	return p;
61 	}
  	ViewVC Help
Powered by ViewVC 1.1.22 	 
...
Рейтинг: 0 / 0
02.05.2014, 22:13
    #38631612
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
Я не видел про С.
...
Рейтинг: 0 / 0
04.05.2014, 03:03
    #38632175
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просто хочется понять в чём я ошибся...
Ну, там как-то про С или нет особенно сразу не сказано.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Просто хочется понять в чём я ошибся... / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]