0

i had a question in my program. When I pass the 3D int array CodedGreen to the function Green_Decode_Tree. An error message"invalid use of array with unspecified bounds" displayed. What is the mistake in my program? Thanks for your help.

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);
        }

    }

}
1

2 Answers 2

11

Remember that in most contexts, array expressions have their types implicitly converted ("decay") from "N-element array of T" to "pointer to T" and evaluate to the address of the first element. When you pass CodedGreen (type int [X][Y][Z]) to Green_Decode_Tree, what the function receives is a pointer value of type int (*)[Y][Z].

So your prototype for Green_Decode_Tree needs to be

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

Note that in the context of a function parameter declaration, int *a is synonymous with int a[] (no size), so int (*code)[Y][Z] could also be written as int code[][Y][Z]. I prefer using pointer notation, since that's what the function actually receives, but either will work. Note that in your function you will subscript it as normal:

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

since the subscript operator implicitly dereferences the pointer (i.e., code[row] == *(code+row)).

This may be helpful:

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 *

The expressions a, b, b[i], c, c[i], and c[i][j] are all array expressions, so their types will decay to pointer types in most contexts. The exceptions are when the array expressions are operands of the sizeof or address-of & operators (as is shown in the table), or when the array expression is a string literal being used to initialize another array in a declaration.

Sign up to request clarification or add additional context in comments.

Comments

10

i will reveal you a secret. 2d (and 3d) arrays are represented as liner memory arrays. when you have array NxM and access it like a[i][j] it is actually translated to a[i*M + j] as you might notice compiler must know M here to do this conversion, otherwise it will not be able to translate it. So thats what he asks. You must provide all except first sizes in array: int code[][M][N]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.