недопустимое использование массива с неопределенными границами - PullRequest
0 голосов
/ 18 марта 2010

У меня был вопрос в моей программе. Когда я передаю массив 3D int CodedGreen в функцию Green_Decode_Tree. Отображается сообщение об ошибке «недопустимое использование массива с неопределенными границами». В чем ошибка в моей программе? Спасибо за вашу помощь.

for(i=0;i<256;i++){
          for(j=0;j<256;j++){
    Decode_Tree(green[0], CodedGreen,0,i,j);
          }
      }

void Green_Decode_Tree(node* tree, int code[][][], int num,int row,int col)
{
    int i;
    i=num;

    if((tree->left == NULL) && (tree->right == NULL)){
        fprintf(DecodGreen,"%s\n", tree->ch);
    }
    else
    {
        if(code[row][col][num]==1){
            i++;
            Green_Decode_Tree(tree->left,code,i,row,col);
        }
        else if (code[row][col][num]==0){
            i++;
            Green_Decode_Tree(tree->right,code,i,row,col);
        }

    }

}

Ответы [ 2 ]

6 голосов
/ 18 марта 2010

я открою вам секрет. 2d (и 3d) массивы представлены как массивы памяти лайнера. если у вас есть массив NxM, и вы обращаетесь к нему как a[i][j], он фактически транслируется в a[i*M + j], как вы могли заметить, что компилятор должен знать M здесь, чтобы выполнить это преобразование, иначе он не сможет его преобразовать. Так вот что он просит. Вы должны предоставить все, кроме первых размеров в массиве: int code[][M][N]

5 голосов
/ 18 марта 2010

Помните, что в большинстве контекстов выражения массива имеют свои типы, неявно преобразуемые ("распад") из "N-элементного массива T" в "указатель на T" и вычисляющие адрес первого элемента. Когда вы передаете CodedGreen (тип int [X][Y][Z]) в Green_Decode_Tree, функция получает значение указателя типа int (*)[Y][Z].

Итак, ваш прототип для Green_Decode_Tree должен быть

void Green_Decode_Tree(node *tree, int (*code)[Y][Z], int num, int row, int col)

Обратите внимание, что в контексте объявления параметров функции int *a является синонимом int a[] (без размера), поэтому int (*code)[Y][Z] также можно записать как int code[][Y][Z]. Я предпочитаю использовать указатель нотации, так как это то, что функция фактически получает, но любая из них будет работать. Обратите внимание, что в вашей функции она будет выглядеть так:

if (code[row][num][col] == 1)

, так как подстрочный оператор неявно разыменовывает указатель (т.е. code[row] == *(code+row)).

Это может быть полезно:

Declaration         Expression        Type            Decays to
-----------         ----------        ----            ---------
T a[X];                      a        T [X]           T *
                            &a        T (*)[X]   

T b[X][Y];                   b        T [X][Y]        T (*)[Y]
                            &b        T (*)[X][Y]
                          b[i]        T [Y]           T *
                         &b[i]        T (*)[Y]

T c[X][Y][Z];                c        T [X][Y][Z]     T (*)[Y][Z]
                            &c        T (*)[X][Y][Z]  
                          c[i]        T [Y][Z]        T (*)[Z]
                         &c[i]        T (*)[Y][Z]
                       c[i][j]        T [Z]           T *

Выражения a, b, b[i], c, c[i] и c[i][j] являются выражениями массива, поэтому их типы будут переходить в типы указателей в большинстве контекстов. Исключения составляют случаи, когда выражения массива являются операндами операторов sizeof или address-of & (как показано в таблице) или когда выражение массива является строковым литералом, используемым для инициализации другого массива в объявлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...