[C] Errors passing bidimensional array to a funcion

  • Thread starter Thread starter colt
  • Start date Start date
  • Tags Tags
    Array Errors
Click For Summary
SUMMARY

The discussion centers on errors encountered when passing a bidimensional array to functions in C. The primary issue arises from the use of an undeclared variable 'n' in the function parameters, which leads to compilation errors. The solution involves correctly declaring the array dimensions in the function definitions and avoiding the use of array dimensions in function calls. The conversation emphasizes the importance of understanding array decay to pointers and the nuances of C99 standards regarding variable-length arrays.

PREREQUISITES
  • Understanding of C programming language syntax
  • Familiarity with C99 standards, particularly variable-length arrays
  • Knowledge of function declaration and definition in C
  • Concept of array decay to pointers in function calls
NEXT STEPS
  • Study the C99 standard for variable-length arrays and their implications
  • Learn about function parameter passing in C, focusing on arrays
  • Explore the C FAQ, particularly sections on arrays and pointers
  • Review best practices for declaring and using multidimensional arrays in C
USEFUL FOR

C programmers, software developers working with C, and students learning about function parameters and array handling in C.

colt
Messages
20
Reaction score
0
Hi I have these functions:

Code:
void posicaoIfElse (int e [][n], int i, int j, int k, int m, int n) {
...
...
}
void posicaoFormula (int e [][n], int i, int j, int k, int m, int n) {
...
...
}

that I calls through
Code:
posicaoFormula (e,i,j,k,m,n);
printf ("\n");
posicaoIfElse (a,i,j,k,m,n);

which produces together these error messages:
rede.c:3: error: 'n' undeclared here (not in a function)
rede.c:68: error: 'n' undeclared here (not in a function)
rede.c: In function 'main':
rede.c:160: error: type of formal parameter 1 is incomplete
rede.c:162: error: type of formal parameter 1 is incomplete

the funtion parameters that I am passing are:
Code:
int m = 7;
int n = m+1;
int e [n][n];
int a [n][n];
int i,j,k;

what I am doing wrong? Thanks for any help.
 
Last edited by a moderator:
Technology news on Phys.org
Assuming this is C99 where variable length arrays are permitted, in short, it hasn't seen 'n' yet by the time you reference it with the array. The compiler is parsing the arguments left to right and needs to know what 'n' is in order to use it for the array. So put those variables before the array in the function definition/declaration.

That should work. Just keep in mind it's from the C99 standard, and not technically present in the C90 spec.
 
No it wasn't C99. Anyway I putted 'n' as the first parameter and now I am getting these two error messages:

rede.c: In function 'main':
rede.c:183: error: expected expression before ']' token
rede.c:183: warning: passing argument 3 of 'contaOcorrenciasIfElse' makes pointer from integer without a cast
rede.c:161: note: expected 'int *' but argument is of type 'int'
rede.c:184: error: expected expression before ']' token
rede.c:184: warning: passing argument 3 of 'contaOcorrenciasFormula' makes pointer from integer without a cast
rede.c:165: note: expected 'int *' but argument is of type 'int'

The lines 183 and 184 are:
Code:
contaOcorrenciasIfElse  (n,a[][n], ocorrenciasA [n], i,j);   
  contaOcorrenciasFormula (n,e[][n], ocorrenciasE [n], i,j);

If I pass C99 as option to the compiler, it doesn't change anything.
 
colt said:
The lines 183 and 184 are:
Code:
contaOcorrenciasIfElse  (n,a[][n], ocorrenciasA [n], i,j);   
  contaOcorrenciasFormula (n,e[][n], ocorrenciasE [n], i,j);

If I pass C99 as option to the compiler, it doesn't change anything.

You don't want the [][n] parts (and later, the [n]) when you actually call the function. Just during declaration and definition of the function. If it's an nxn function, I'd put the whole thing in the declaration and definition, e.g. int blah[n][n], just to make things as explicit as possible when you declare and define, personally.

Hopefully the warnings make sense now. The first error is complaining about expecting some sort of expression between those first square brackets (which shouldn't be there anyways). The warning means it is expecting a pointer in the third parameter, but you're trying to dereference an element in that array, which would be an int and not a pointer. The compiler rightfully complains.

It's useful to know about array decaying to pointers in function calls. I'd suggest reading a large part of this C FAQ: http://www.lysator.liu.se/c/c-faq/c-2.html.

Quick fun fact, consider that array is by definition equivalent to *(array + i) (Reading the actual C99 spec is rather instructive). Which means that i[array] is equivalent to *(i + array), which works out the same since addition is commutative. They both work the same way. So accessing element 9 in an array 'x' that you'd normally want to write as x[9] will do the same thing if you write 9[x]. I'm strongly suggesting you not do that, but I just hope it gives you some insight into how they work internally.

I'll also add that pointers and arrays are not exactly the same thing. Study up on these details. The FAQ should explain a bit, I think.

Anyways, this was a little rushed (tired and need to go to bed), but someone correct me if I messed something up. It happens.
 
Last edited:
If it's an nxn function, I'd put the whole thing in the declaration and definition, e.g. int blah[n][n], just to make things as explicit as possible when you declare and define, personally.

What do you mean by nxn function?

Anyway, thanks for the help.
 
colt said:
What do you mean by nxn function?

Anyway, thanks for the help.

Oops, I meant n x n array. By that, I mean if n = 5, it would be a 5 x 5 array, for example.

And you're welcome.
 

Similar threads

  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 25 ·
Replies
25
Views
3K
  • · Replies 22 ·
Replies
22
Views
4K
Replies
20
Views
2K
  • · Replies 23 ·
Replies
23
Views
2K
Replies
12
Views
2K
  • · Replies 39 ·
2
Replies
39
Views
5K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 2 ·
Replies
2
Views
1K
  • · Replies 22 ·
Replies
22
Views
3K