C/Visual C - Como se debe pasar una matriz?

 
Vista:

Como se debe pasar una matriz?

Publicado por eduardo (2 intervenciones) el 29/10/2007 20:45:37
Deseo recorrer una matriz cuadrada de 2x2 tipo int usando aritmetica de punteros
tengo la funcion mostrar_matriz( matriz ) hasta donde yo sé esto es equivalente
-pasar la dirección de la matriz
-pasar la dirección del primer elemento
La declaración mostrar_matriz tiene la sgte forma:

void mostrar_matriz( int *p ) /* recibe la dirección de la matriz o del 1er
elemento que es lo mismo */

pero cuando en main() hago mostrar_matriz( matriz ) me arroja
[Warning] In function `main':
[Warning] passing arg 1 of `mostrar_matriz' from incompatible pointer type

Pero si hago mostrar_matriz( &matriz[0][0] ) no arroja warning

Entonces si quiero pasar la dirección de la matriz o del primer elemento
¿debo hacerlo de manera explicita?, y porque esto no ocurre cuando se pasa un
array de una dimensión...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Como se debe pasar una matriz?

Publicado por Tom (619 intervenciones) el 29/10/2007 20:50:08
¿ Cómo declaras matriz ?

¿ int *matriz; ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como se debe pasar una matriz?

Publicado por eduardo (2 intervenciones) el 29/10/2007 20:53:50
int matriz[ FILA ][ COLUMNA ] ;

FILA, COLUMNA constantes simbolicas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como se debe pasar una matriz?

Publicado por Tom (619 intervenciones) el 29/10/2007 21:06:40
Pues lo mejor que puedes hacer es:

int mostrar_matriz(int matriz[FILA][COLUMNA]) { ... };

De cualquier manera, en tu caso ese warning del compilador no es demasiado peligroso y tu programa funcionaría tal y como está (puedes probar "mostrar_matriz((int*)matriz);")

El problema es más filosófico que otra cosa. La variable matriz, efectivamente contiene un puntero a una zona de memoria, pero el compilador protesta porque en dicha zona no hay un entero (int*), sino una lista de enteros (int[]).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como se debe pasar una matriz?

Publicado por fernando.gomez (1603 intervenciones) el 29/10/2007 23:32:18
Pero es que una matriz cuadrada de enteros (i.e. int matriz[10][10]) no es un puntero a int, sino un doble puntero. Es decir, en lugar de un int* es un int**.

Así, tu prototipo debería ser:

void mostrar_matriz( int** p )
{
...
}

Y por ejemplo, para obtener la primera fila, tendrías que hacer algo como:

void mostrar_matriz(int** p)
{
int* fila = p[0];
...etc..
}

y te sigues con la aritmética normalita.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como se debe pasar una matriz?

Publicado por Tom (619 intervenciones) el 30/10/2007 08:51:27
Sin ánimo de crear un flame :-)
No se trata de un doble puntero. Es un puntero nada más. Todos los int de la matriz están en posiciones contiguas de la memoria:

#include <stdio.h>

int main(int argc, char*argv[]) {
int i, j;
int m[3][7];

for(i = 0; i < 3; i++) {
for(j = 0; j < 7; j++) {
m[i][j] = 10 * i + j;
}
}
int *mp = (int*)m;
for(i = 0; i < 3; i++) {
for(j = 0; j < 7; j++) {
printf("%d ", *(mp++));
}
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar