2013-11-09 4 views
1

У меня есть следующий код:Ошибка с с кодом

int b = 10; // maximum branching 

typedef struct depth * depth; 

struct depth{ 
    int number ; 
    depth child[b] ;//<---- Error here 
}; 

и следующее сообщение об ошибке:

variably modified ‘child’ at file scope 
+0

Вы не можете иметь размер переменной массива. – lurker

+0

Вы не можете использовать переменную в объявлении массива. попробуйте использовать указатель и malloc позже. –

ответ

1

Попробуйте вместо этого:

#define MAX_BRANCHING 10 

int b = MAX_BRANCHING; // maximum branching 

typedef struct depth * depth; 

struct depth{ 
    int number ; 
    depth child[MAX_BRANCHING] ;//<---- Error here 
}; 

"переменной длины массивы" (Власе) были введены в C99 и C11, но их использование является «условным» (составителям не требуется для реализации этой функции). В C++ предпочтительным методом является использование «const int». В C я бы рекомендовал использовать #define. ИМХО ...

http://en.wikipedia.org/wiki/Variable-length_array

+0

Кроме «const», у вас есть два варианта: 1) сделать «глубину» максимальным возможным размером или 2) сделать «глубину» указателем и проинтегрировать его с помощью 'malloc (b * sizeof (int))' во время выполнения , – paulsm4

+1

mmmmm, b должен быть введен пользователем, я не могу сделать его постоянным !! –

+1

Хорошо, спасибо, я сделаю максимально возможный размер, но я думаю, что это влияет на пространство, я имею в виду, что это займет больше места, так как я хочу закодировать «Первый алгоритм глубины» –

0

Sructs не может иметь динамические элементы так попробуйте Const ИНТ б = 10;

+0

Это тоже не сработает. – lurker

1

Если b не может быть постоянным, и вы не хотите использовать выделения кучи для массива ребенка, вы можете использовать это, довольно своеобразно обходной путь (подсказка: рассмотреть не использовать это, но, используя распределение кучи для массив):

typedef struct depth *depth_p; 

struct depth 
{ 
    int number; 
    depth_p child[0]; 
}; 

уловка, что следующее заявление остается в силе:

depth_p d = get_depth(); 
d->child[5]; // <-- this is still valid 

для того, чтобы использовать это, необходимо создать экземпляры depth_p в этом (и о олько это) способ:

depth_p create_depth(int num_children) 
{ 
    return (depth_p)malloc(
     sizeof(struct depth) + num_children * sizeof(depth_p) 
    ); 
} 

Во-первых, это выделяет память для всех других членов (int number) с sizeof(struct depth). Затем он выделяет дополнительных памяти на нужное количество детей по с добавлениемnum_children * sizeof(depth_p).

Не забудьте бесплатно получить depth ссылки с free.

Смежные вопросы