C/Visual C - Matriz por referencia

 
Vista:

Matriz por referencia

Publicado por Edgar (2 intervenciones) el 17/05/2005 19:42:50
Hola!

Quiero pasar una matriz por referencia en C y no lo consigo... Lo que he hecho es :

int entrarxy(float *par]); //declaración de la función
main()
{
float par[40][2];
error=entrarxy(&par); // Llamada a la función
}

int entrarxy (float *par)
{
.........
}

Seguro que hago algo mal. Alguien me da una ayuda? Gracias!
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:Matriz por referencia

Publicado por fernando.gomez (1603 intervenciones) el 17/05/2005 22:24:13
Seguro que sí anda algo mal. Veo que ya tienes el concepto de matriz asociado a un puntero, lo cuál es bueno. Así que la explicación será breve. Cuando tu declaras una matriz (vector bidimensional), lo que sucede realmente es que declaras un vector (en tu caso de 40 elementos) y que cada uno de esos (40) elementos es en realidad un vector (de 2 elementos). Como verás, no es que necesites pasarle la dirección de memoria a tu arreglo, sino que simplemente el parámetro es un puntero (el vector de 40 elementos) a un puntero (el vector de 2 elementos). Por tanto, tu código debería quedar así:

int entrarxy(float** par]); //declaración de la función
main()
{
float par[40][2];
error=entrarxy(par); // Llamada a la función
}

Ahora, por otro lado, también puedes hacer la llamada específica:

int entraxy(float par[][]);

o si quieres especificar el tamaño de la matriz,

int entraxy(float par[40][20]);

Salutes.
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:Aun así no funciona

Publicado por Edgar (2 intervenciones) el 18/05/2005 00:51:35
Gracias por la ayuda. La cosa ha mejorado, pero el programa se cuelga. Me da 2 warnings en la llamada a función:
float ** ' differs in levels of indirection from 'float [40][2]
different types for formal and actual parameter 1
El código que tengo ahora es este

int entrarxy(float** par); //declaración de la función

main()
{
int error;

float par[40][2];
par[0][0]=10;
error=entrarxy(par); // Llamada a la función
printf("i",par[1][1]);
}

int entrarxy (float** par)
{
par[1][1]=25;
return 0;
}
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:Aun así no funciona

Publicado por fernando.gomez (1603 intervenciones) el 18/05/2005 22:57:30
Hice el siguiente ejercicio y me funcionó:

int entrarxy(float par[40][2]); //declaración de la función

int main() {
int error;
float par[40][2];

for (int i = 0; i < 40; i++) {
for (int j = 0; j < 2; j++) {
par[i][j] = (float)i*j;
}
}

error = entrarxy(par); // Llamada a la función
cin >> i;

return error;
}

int entrarxy (float par[40][2]) {
cout << "Resultado de matrices " << endl;
for (int i = 0; i < 40; i++) {
for (int j = 0; j < 2; j++) {
cout << "Elemento " << i << "," << j << ": " << par[i][j] << endl;
}
}

return 0;
}

Mientras investigo eso de float** que según yo debería funcionar...
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

Matrices y punteros...

Publicado por Yensi Vega (2 intervenciones) el 19/05/2005 00:12:53
hola, tengo la solucion para pasar matrices como parametros sin ningun problema, y es usando punteros doble, en el caso de matrices bidimencionales, pudiendose extender para matrices multidimiensionales.

TIPO_DEVUELTO nombre_funcion( TIPO ** array, int dim_x, int dim_y);
// TIPO_DEVUELTO puede ser cualquiera (int, float, etc, incluso estructuras)
// TIPO de igual manera, puede ser cualquiera

main(){
int dimX, int dimY;
// inicializar dimX y dimY con las dimensiones del arreglo a pasar
.....

TIPO **param_array;
param_array = new TIPO *[ dimX ];
// tambien es valido con malloc
int i;
for ( i=0; i < dimX ; i++)
param_array[ i ] = new TIPO[ dimY ]
// llenar param_array como cualquier otro arreglo, por ejemplo:
param_array[ 0 ] [ 0 ] = valor;
................
// llamada a tu funcion
val_retornado = nombre_funcion ( param_array, dimX, dimY);
.....
// liberar memoria
for( i= 0; i< dimX; i++)
delete param_array [i];
delete []param_array;
// se pudo haber hecho con free, si se hubiese usado malloc para asingar memoria
return 0;
}

TIPO_DEVUELTO nombre_funcion( TIPO ** array, int dim_x, int dim_y){
manejar a array como cualquier otro arreglo, pero dentro de dim_x y dim_y
}

Existen soluciones mas elegantes, con la programacion Orientada a Objetos, que es la que uso. Ademas es mas seguro debido a que hay mas control cuando se tratan aplicaciones grandes con asignaciones de memoria dinamica.

Yensi Vega Luján
Bachiller en Ciencias de la Computacion
Universidad de Trujillo - Perú
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:Matrices y punteros...

Publicado por el_baina (9 intervenciones) el 22/05/2005 01:35:46

pues yo para pasar matrices por referencia o cualquier otro cosa utilizo el &, es decir ago asi:

//definicion del tipo matriz
typedef int matriz[20][20];

// cabecera de la funcion
void funcion (matriz &m);

// llamada al a funcion dentro de un main
void main(...){

matriz A; //declaracion de la matriz
nombre_funcion(A); // llamada a la funcion
.
.
.}

a mi siempre me ha funcionado el & para pasar por referencia
además me parece que las matrices siempre se pasan por referencia aunque no le pongas el & ( funcion(matriz m) ) tambien se pasan por referencia porque el compilador de C no hace una copia de la matriz y simplemente pasa la direccion de la matriz original
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