2015-08-13 4 views
-2
typedef struct _set{ 
    int root; 
    int rank; 
}Set; 

void Kruskal(Graph* g) 

{ 
     Set uni[g->nv]; 
     Edge result[g->nv - 1]; 
     int i; 
     int count = 0; 
     int num = 0; 
     int aRoot, bRoot; 

     for(i = 0; i < g->nv; i++){ 
      uni[i].root = i; 
      uni[i].rank = 0; 
     } 

     QuickSort(g, 0, g->ne-1); 

     while(count != (g->nv-1) && num != g->ne){ 
      WeightedUnion(uni, g->path[num].src, g->path[num].dest); 
      aRoot = Find(uni, g->path[num].src); 
      bRoot = Find(uni, g->path[num].dest); 

      if(aRoot != bRoot){ 
       result[num] = g->path[num]; 
       count++; 
      } 
      num++; 
     } 
     if(count != g->nv-1){ 
      printf("No spanning tree\n"); 
     } 
     else{ 
      for(i = 0; i <= count; i++){ 
       printf("[%d] %d - %d : %d\n",i+1,result[i].src,result[i].dest,result[i].weight); 
      } 
     } 
    } 

Это моя часть кода. Проблема в том, что я не могу инициализировать 'uni [g-> nv]'. Вы можете увидеть цикл «за» рядом с областью переменных. И я был уверен, что эта репутация должна инициализировать этот массив, но результата не было. Этот массив не включал никаких других значений. просто пусто. Я не могу найти свою проблему. Пожалуйста, скажите мне мою проблему или ошибки.Инициализация структуры массива в c

  • Я запустил свой код в Xcode. Возможно, эта информация полезна
+1

@StillLearning: Ну, для меня это явно код C. Почему вы думаете, что это не так? – ckruczek

+1

Если вам нужен элемент 'g-> nv'thth' uni', определите его как 'uni [g-> nv + 1]'. – alk

+2

«Проблема в том, что я не могу инициализировать' uni [g-> nv] '" - почему бы и нет? Эта петля прекрасна. Пожалуйста, объясните, какая у вас проблема. –

ответ

3

Вы используете массив переменной длины (VLA), который представляет собой массив с длиной, динамически зависящей от выражения во время выполнения. Поскольку размер не известен во время компиляции, вы не можете инициализировать их с помощью выражения инициализатора, но должны делать это с помощью цикла for, как вы это делаете.

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

Так что не используйте VLA, как и для больших данных неизвестного размера. Вместо этого используйте указатель и malloc, чтобы выделить нужную вам память.

+0

Спасибо. Хотя мой вопрос неясен, вы даете мне ответ. Это действительно полезно для меня. –

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