[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