[C con Clase] Punteros a Matrices como argumento a función
Miguel Olave
molavec en gmail.com
Dom Nov 21 16:52:36 CET 2010
Ricardo:
Estoy agradecido enormemente por tu ingeniosa solución, ya que al final
recorriste la matrices moviendo sólo el puntero a float. Además, gracias
por ampliar la solución con una explicación del malloc. Siempre son
bienvenidas este tipo de explicaciones ya que sirve para más soluciones en
el futuro.
Miguel.
2010/11/20 Ricardo Torres <rictor en cuhrt.com>
> Hola Miguel
>
> El 20/11/10 10:44, Miguel Olave escribió:
>
> Estimados:
>
> Como siempre es un agrado recurrir a esta lista, pues de seguro sé que
> enontraré una solución para un problema, creo, fácil de resolver para muchos
> de ustedes pero desde ayer estoy pegado y no me puedo destrabar.
>
> espero poder ayudarte!
>
>
> Lo que ocurre es que quiero realizar funciones con matrices de diversos
> tamaños pero no sé como pasarle estas como argumento a una función.
>
> He aquí un ejmplo sencillo de una de las formas de como lo he tratado de
> hacer.
>
> n: número de filas
> M: número de columnas
>
> he tomado tu ejemplo y he creado uno que creo hace lo que necesitas y
> perdón me me fijé en tu definición de n y M y en el ejemplo que te muestro n
> con columnas y m son renglones
>
> --- matrices.c ----------------------
>
> #include <stdio.h>
> #include <math.h>
> #include <stdlib.h>
>
> void print_matrix(float *pm, int n, int m)
> {
> /*
> pm - puntero al inicio de la matriz de nxm
> n - número de columnas
> m - número de renglones
> */
> int i, j;
> /* Se recorrent renglones */
>
> for (j=0; j<m; j++){
> /* Primero se recorren columnas */
>
> for (i=0; i<n; i++){
> /* j*n es el inicio de cada renglon, i es la columna */
> printf("%f\t",*(pm+i+j*n));
>
> }
> printf("\n");
> }
> }
>
> void main(int argc, char* argv[]){
>
> int i, j;
> float p[2][2] = { {1, 2}, {2, 1} };
> float q[2][3] = { {1, 2, 3}, {3, 2, 1} };
>
> printf("matriz p:\n");
> printf("-----------\n");
>
> print_matrix(p,2,2);
> printf("-----------\n");
>
> printf("matriz q:\n");
> printf("-----------\n");
> print_matrix(q,3,2);
>
> printf("-----------\n");
>
> }
> ---------------------------------------
>
> Nota: Se me ocurre que la mejor solución debe ser mediante punteros pues de
> otro modo debería usar malloc.
>
> He compilado este programa y efectivamente aparece el siguiente warning:
> --- wraning -----------------------
> matrices.c:32: warning: passing argument 1 of ‘print_matrix’ from
> incompatible pointer type
> matrices.c:5: note: expected ‘float *’ but argument is of type ‘float
> (*)[2]’
> matrices.c:37: warning: passing argument 1 of ‘print_matrix’ from
> incompatible pointer type
> matrices.c:5: note: expected ‘float *’ but argument is of type ‘float
> (*)[3]’
> --------------------------------------
>
> Y la salida es la siguiente
> --- salida -------------------------
> matriz p:
> -----------
> 1.000000 2.000000
> 2.000000 1.000000
> -----------
> matriz q:
> -----------
> 1.000000 2.000000 3.000000
> 3.000000 2.000000 1.000000
> -----------
> -------------------------------------
>
> Como verás, funciona de forma correcta
>
>
>
> Nota 2: en Ejemplos he visto que las matrices las definen como m[][5], o
> sea, sólo con el campo de las columnas llenado. No estiendo esa notación.
> ¿Qué pasa con las filas? (he visto que incluso lo hacen para matrices que no
> son cuadradas).
>
> si tenemos la matriz
> --- matriz --
> 1, 2, 3
> 3, 2, 1
> --------------
> En C sería
> int m1[][3] = { {1, 2, 3}, {3, 2, 1} };
>
> Esto define una variable de tipo int constante llamada m1. Por ejemplo, yo
> podría obtener el elemento m1[1][1] que daría como resultado un 2.
>
> Una forma alternativa con punteros y malloc se podría hacer algo como
>
> int m2 = (int *) malloc(3x2); /* Reservamos memoria para 6 enteros */
>
> En realidad este es un vector no una matriz, pero haciendo las cuentas
> correspondientes se puede usar como una matriz, veamos:
>
> Si nuestra matriz es de 3x2, quiere decir que tenemos 3 columnas y 2
> renglones
> m2[0] = 1; /* Se guarda el valor de la posición 0,0 */
> Una forma de calcular la posición en el vector en base a la columna "i" y
> renglón "j" sería con i+j*n
>
> Si nos imaginamos el vector m2 sería algo como
> [ ][ ][ ][ ][ ][ ] <- espacio de memoria
> 0 1 2 3 4 5 <- dirección de memoria
> | ren 0 || ren 1 | <- organización x renglones, cada renglón es de longitud
> 3
>
> Renglón 0 inicia en m2[0], con 0 = 0*3
> Renglón 1 inicia en m2[3], con 3 = 1*3
> Renglón j inicia en m2[y], con y = j*3 para renglones de longitud 3
> Renglón j inicia en m2[y], con y = j*n para renglones de longitud n
>
> Para el caso de las columnas sería
> Renglón 0, columna 0: m2[0], con 0 = 0*3 + 0
> Renglón 0, columna 1: m2[1], con 1 = 0*3 + 1
> Renglón 1, columna 1: m2[4], con 4 = 1*3 + 1
> Renglón j, columna i: m2[k], con k = j*n + i para renglones de longitud n
>
> Otra forma con vectores sería usando un puntero a punteros, creo que se
> podría crear algo como esto, si me equivoco x favor corriganme, thx)
>
> int m3 = (void *) malloc(2); /* Reservamos memoria para 2 renglones, no
> estoy seguro si es asi, pero sería la idea */
> int m3[0] = (int *) malloc(3); /* Reservamos memoria para 3 enteros para
> el renglón 0 */
> int m3[1] = (int *) malloc(3); /* Reservamos memoria para 3 enteros para
> el renglón 1 */
>
> Y para asignar los valores sería
> m3[0][0] = 1; /* renglón 0, columna 0 */
> m3[0][1] = 2; /* renglón 0, columna 1 */
> m3[j][i] = k; /* renglón j, columna i */
>
> Espero te sea de utilidad y no haberte enredado más!!
>
> Saludos
> RT
>
>
>
>
> ESOP!!
>
> Espero sus respuestas.
>
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.nethttp://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20101121/84e10017/attachment.html>
Más información sobre la lista de distribución Cconclase