what example ejemplo define cppreference c arrays gcc struct

example - typedef struct c ejemplo



GCC: el tipo de matriz tiene un tipo de elemento incompleto (2)

El compilador necesita saber el tamaño de la segunda dimensión en su matriz bidimensional. Por ejemplo:

void print_graph(g_node graph_node[], double weight[][5], int nodes);

He declarado una estructura e intento pasar una matriz de esas estructuras (así como una doble matriz de dobles y un entero) a una función. Recibo un mensaje de "el tipo de matriz tiene un tipo de elemento incompleto" de gcc cuando lo compilo. ¿En qué me he equivocado al pasar la estructura a la función?

typedef struct graph_node { int X; int Y; int active; } g_node; void print_graph(g_node graph_node[], double weight[][], int nodes);

También he intentado struct g_node graph_node[] , pero me sale lo mismo.


Es la matriz que está causando problemas en:

void print_graph(g_node graph_node[], double weight[][], int nodes);

La segunda y posteriores dimensiones deben ser dadas:

void print_graph(g_node graph_node[], double weight[][32], int nodes);

O simplemente puede dar un puntero a puntero:

void print_graph(g_node graph_node[], double **weight, int nodes);

Sin embargo, aunque parecen similares, son muy diferentes internamente.

Si está usando C99, puede usar arreglos de diferentes calidades. Citando un ejemplo del estándar C99 (sección §6.7.5.2 Declaradores de matrices):

void fvla(int m, int C[m][m]); // valid: VLA with prototype scope void fvla(int m, int C[m][m]) // valid: adjusted to auto pointer to VLA { typedef int VLA[m][m]; // valid: block scope typedef VLA struct tag { int (*y)[n]; // invalid: y not ordinary identifier int z[n]; // invalid: z not ordinary identifier }; int D[m]; // valid: auto VLA static int E[m]; // invalid: static block scope VLA extern int F[m]; // invalid: F has linkage and is VLA int (*s)[m]; // valid: auto pointer to VLA extern int (*r)[m]; // invalid: r has linkage and points to VLA static int (*q)[m] = &B; // valid: q is a static block pointer to VLA }

Pregunta en los comentarios

[...] En mi main (), la variable que estoy tratando de pasar a la función es una double array[][] , entonces, ¿cómo pasaría eso a la función? Pasar array[0][0] a este me da un tipo de argumento incompatible, al igual que &array y &array[0][0] .

En tu main() , la variable debería ser:

double array[10][20];

o algo ligeramente similar; tal vez

double array[][20] = { { 1.0, 0.0, ... }, ... };

Deberías poder pasar eso con un código como este:

typedef struct graph_node { int X; int Y; int active; } g_node; void print_graph(g_node graph_node[], double weight[][20], int nodes); int main(void) { g_node g[10]; double array[10][20]; int n = 10; print_graph(g, array, n); return 0; }

Eso compila (a código de objeto) limpiamente con GCC 4.2 (i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (basado en Apple Inc. build 5658) (LLVM build 2336.9.00)) y también con GCC 4.7.0 en Mac OS X 10.7.3 usando la línea de comando:

/usr/bin/gcc -O3 -g -std=c99 -Wall -Wextra -c zzz.c