Как перераспределить массив указателей на функции? - PullRequest
1 голос
/ 01 февраля 2012

Прямо к коду:

#define PRO_SIGNAL( func, param ) (*func)(param)
void PRO_SIGNAL( paint[0], Pro_Window* );

signal->paint = realloc( signal->paint, sizeof( void (*)(Pro_Window*) ) * signal->paint_count );

Ошибка:

error: incompatible types when assigning to type 'void (*[])(struct Pro_Window *)' from type 'void *'|

Ответы [ 3 ]

3 голосов
/ 01 февраля 2012

Похоже, что вы присваиваете массиву не указатель.

Из выходного сообщения об ошибке:

'void (*[])(struct Pro_Window *)' from type 'void *'| 

Обратите внимание на [] там (и это, конечно, не 'лямбда!), а не *

Если это "расширяемая" структура, вам нужно перераспределить всю структуру, а не только член массива.

Кстати, совет: еслиСбой realloc возвращает указатель NULL, и если вы присваиваете его переменной, на которую ссылается realloc, исходная память, на которую он указывал, будет потеряна навсегда.Поэтому всегда сначала перераспределяйте в temp, проверяйте значение и затем присваивайте исходный указатель, если он работал.

1 голос
/ 01 февраля 2012

Вы не показываете нам определение singal->paint, но из сообщения об ошибке я делаю вывод, что оно объявлено как массив указателей на функции, что означает, что signal - это struct с гибким массивом (paint[] ). Вы не можете присвоить массиву, вам нужно перераспределить целое struct.

0 голосов
/ 01 февраля 2012

Не уверен, что вы пытаетесь сделать, но это прекрасно работает здесь:

#include <stdlib.h>

int main(int argc, char ** argv)
{
        void (**foobar) (int a, int b);
        void (**tmp) (int a, int b);
        foobar = NULL;
        if (!(foobar = malloc(sizeof(*foobar)*4))
            return 1;
        if (!(tmp = realloc(foobar, sizeof(*foobar)*5)) {
            free(foobar);
            return 1;
        } else {
            foobar = tmp;
        }
        free(foobar);
        return 0;
}

Итак, либо вы пытаетесь realloc массив, как говорит Кевин, либо, возможно, вы компилируете в режиме C ++, где я считаю, что приведение не является неявным.

Редактировать : Я добавил обработку ошибок.

...