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

Всё, что мы видим - это лишь иллюзия ...
...
Рейтинг: 0 / 0
Просто хочется понять в чём я ошибся...
    #38629932
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аттачмент трудно квотировать. Не поленись отформатировать и опубликовать в удобном
для форумчан виде.
...
Рейтинг: 0 / 0
Просто хочется понять в чём я ошибся...
    #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
Просто хочется понять в чём я ошибся...
    #38630747
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, общими усилиями, мы сможем найти ошибки?!


Главная ошибка, в общем, она и единственная: ты не врубаешся. В язык С++.
...
Рейтинг: 0 / 0
Просто хочется понять в чём я ошибся...
    #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
Просто хочется понять в чём я ошибся...
    #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
Просто хочется понять в чём я ошибся...
    #38631244
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Strangecat,

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

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



Можно спросить у мастера в этом отдельно взятом государстве, а заглядывал ли он
в исходники реализаций всемогущих и распрекрасных С++ контейнеров, с божественным RAII?
Или, о великий, думает что там нет new[], malloc, и не знает как там реализована эта RAII, и что
это нельзя повторить самому, буквально одним своим конструктором своего объекта.
...
Рейтинг: 0 / 0
Просто хочется понять в чём я ошибся...
    #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
Просто хочется понять в чём я ошибся...
    #38631333
Фотография Маслов Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivStrangecat,

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

Кстати, для всех остальных, С++ это хорошо, но если внимательно почитать задание, то Вы увидите, что реализация необходима на чистом С!
...
Рейтинг: 0 / 0
Просто хочется понять в чём я ошибся...
    #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
Просто хочется понять в чём я ошибся...
    #38631342
Фотография Маслов Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВозможно, общими усилиями, мы сможем найти ошибки?!


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

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

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

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

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

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

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

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

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

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

Короче, если не аллокается несколько гигов или не на ембеде, то проверять не надо.
...
Рейтинг: 0 / 0
Просто хочется понять в чём я ошибся...
    #38631406
luislom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Strangecat]
Хвалю.
Но без if(!*alloc(...)){} и try{ new... }catch(){} быдлокод детектед.
...
Рейтинг: 0 / 0
Просто хочется понять в чём я ошибся...
    #38631420
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
luislom, что у тебя будет в catch?
...
Рейтинг: 0 / 0
Просто хочется понять в чём я ошибся...
    #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
Просто хочется понять в чём я ошибся...
    #38631612
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не видел про С.
...
Рейтинг: 0 / 0
Просто хочется понять в чём я ошибся...
    #38632175
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, там как-то про С или нет особенно сразу не сказано.
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Просто хочется понять в чём я ошибся...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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