Массив-константа как аргумент в С (решено) (Вроде собирается, но с предупреждениями...)

Модератор: Модераторы разделов

nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Массив-константа как аргумент в С (решено)

Сообщение nick87720z »

В своем примере я определил одну универсальную функцию:

Код: Выделить всё

/** Disown some children from one parent.
 *  Note, children should follow in the same order, as they are added in.
 */
void
component_DisownChildren(
  struct Component ** children );

И макро-определение для более простых случаев:

Код: Выделить всё

#define component_DisownChild( child ) \
  component_DisownChildren( (struct Component **){child, NULL} )

В одной из функций уже задействовал (вообще-то, сейчас я вписал туда уже раскрытый вариант - пока не решу проблему):

Код: Выделить всё

void component_Delete( struct Component * ptr )
{
  if (ptr->parent)
    component_DisownChildren( (struct Component **){ptr, NULL} );
  free (ptr);
}

При сборке получаю следующие строчки:

Код: Выделить всё

component.c: In function ‘component_Delete’:
component.c:31: warning: initialization from incompatible pointer type
component.c:31: warning: excess elements in scalar initializer
component.c:31: warning: (near initialization for ‘(anonymous)’)

Что я выяснил:
- Если заменить (struct Component **) на (void *), изчезает первое предупреждение (вроде уже хоть какое-то решение).
- Остальные две, кстати, выскакивают для каждого следующего элемента (т.е., при 3-х элементах их всего 4)

Хотелось бы понять, какие тут правила работают.
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: Массив-константа как аргумент в С (решено)

Сообщение nick87720z »

Ну вот и решение нашлось:
Ошибка была в том, что я преобразовывал к указателю на массив (**), тогда как это должен быть сам массив '*[]'
Спасибо сказали: