<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
    <title></title>
  </head>
  <body text="#000000" bgcolor="#ffffff">
    Hola Miguel<br>
    <br>
    El 20/11/10 10:44, Miguel Olave escribió:
    <blockquote
      cite="mid:AANLkTi=cVOdo+6GmZXcR3RFa55e9czYi_pT2MEcKZgzf@mail.gmail.com"
      type="cite">Estimados:<br>
      <br>
         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.<br>
    </blockquote>
    espero poder ayudarte!<br>
    <blockquote
      cite="mid:AANLkTi=cVOdo+6GmZXcR3RFa55e9czYi_pT2MEcKZgzf@mail.gmail.com"
      type="cite">
      <br>
      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.<br>
      <br>
      He aquí un ejmplo sencillo de una de las formas de como lo he
      tratado de hacer.<br>
      <br>
      n: número de filas <br>
      M: número de columnas<br>
    </blockquote>
    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<br>
    <br>
    --- matrices.c ----------------------<br>
    #include <stdio.h><br>
    #include <math.h><br>
    #include <stdlib.h><br>
    <br>
    void print_matrix(float *pm, int n, int m)<br>
    {<br>
    /*<br>
       pm - puntero al inicio de la matriz de nxm<br>
       n  - número de columnas<br>
       m  - número de renglones<br>
    */<br>
        int i, j;<br>
        /* Se recorrent renglones */<br>
        for (j=0; j<m; j++){<br>
            /* Primero se recorren columnas */<br>
            for (i=0; i<n; i++){<br>
                /* j*n es el inicio de cada renglon, i es la columna */<br>
                printf("%f\t",*(pm+i+j*n));<br>
            }<br>
            printf("\n");<br>
        }<br>
    }<br>
    <br>
    void main(int argc, char* argv[]){<br>
    <br>
        int i, j;<br>
        float p[2][2] = { {1, 2}, {2, 1} };<br>
        float q[2][3] = { {1, 2, 3}, {3, 2, 1} };<br>
       <br>
        printf("matriz p:\n");<br>
        printf("-----------\n");<br>
        print_matrix(p,2,2);<br>
        printf("-----------\n");<br>
    <br>
        printf("matriz q:\n");<br>
        printf("-----------\n");<br>
        print_matrix(q,3,2);<br>
        printf("-----------\n");<br>
    <br>
    }<br>
    ---------------------------------------<br>
    <br>
    <blockquote
      cite="mid:AANLkTi=cVOdo+6GmZXcR3RFa55e9czYi_pT2MEcKZgzf@mail.gmail.com"
      type="cite">Nota: Se me ocurre que la mejor solución debe ser
      mediante punteros pues de otro modo debería usar malloc.<br>
    </blockquote>
    He compilado este programa y efectivamente aparece el siguiente
    warning:<br>
    --- wraning -----------------------<br>
    matrices.c:32: warning: passing argument 1 of ‘print_matrix’ from
    incompatible pointer type<br>
    matrices.c:5: note: expected ‘float *’ but argument is of type
    ‘float (*)[2]’<br>
    matrices.c:37: warning: passing argument 1 of ‘print_matrix’ from
    incompatible pointer type<br>
    matrices.c:5: note: expected ‘float *’ but argument is of type
    ‘float (*)[3]’<br>
    --------------------------------------<br>
    <br>
    Y la salida es la siguiente<br>
    --- salida -------------------------<br>
    matriz p:<br>
    -----------<br>
    1.000000    2.000000    <br>
    2.000000    1.000000    <br>
    -----------<br>
    matriz q:<br>
    -----------<br>
    1.000000    2.000000    3.000000    <br>
    3.000000    2.000000    1.000000    <br>
    -----------<br>
    -------------------------------------<br>
    <br>
    Como verás, funciona de forma correcta<br>
    <br>
    <blockquote
      cite="mid:AANLkTi=cVOdo+6GmZXcR3RFa55e9czYi_pT2MEcKZgzf@mail.gmail.com"
      type="cite">
      <br>
      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).<br>
    </blockquote>
    si tenemos la matriz<br>
    --- matriz --<br>
    1, 2, 3<br>
    3, 2, 1<br>
    --------------<br>
    En C sería<br>
        int m1[][3] = { {1, 2, 3}, {3, 2, 1} };<br>
    <br>
    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.<br>
    <br>
    Una forma alternativa con punteros y malloc se podría hacer algo
    como<br>
    <br>
      int m2 = (int *) malloc(3x2); /* Reservamos memoria para 6 enteros
    */<br>
    <br>
    En realidad este es un vector no una matriz, pero haciendo las
    cuentas correspondientes se puede usar como una matriz, veamos:<br>
    <br>
    Si nuestra matriz es de 3x2, quiere decir que tenemos 3 columnas y 2
    renglones<br>
      m2[0] = 1;  /* Se guarda el valor de la posición 0,0 */<br>
    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<br>
    <br>
    Si nos imaginamos el vector m2 sería algo como<br>
    <tt>[ ][ ][ ][ ][ ][ ] <- espacio de memoria<br>
       0  1  2  3  4  5  <- dirección de memoria<br>
      | ren 0 || ren 1 | <- organización x renglones, cada renglón es
      de longitud 3<br>
      <br>
      Renglón 0 inicia en m2[0], con 0 = 0*3<br>
    </tt><tt>Renglón 1 inicia en m2[3], con 3 = 1*3<br>
    </tt><tt>Renglón j inicia en m2[y], con y = j*3 para renglones de
      longitud 3<br>
    </tt><tt>Renglón j inicia en m2[y], con y = j*n para renglones de
      longitud n<br>
    </tt><br>
    Para el caso de las columnas sería<br>
    <tt>Renglón 0, columna 0: m2[0], con 0 = 0*3 + 0<br>
    </tt><tt>Renglón 0, columna 1: m2[1], con 1 = 0*3 + 1<br>
    </tt><tt>Renglón 1, columna 1: m2[4], con 4 = 1*3 + 1<br>
    </tt><tt>Renglón j, columna i: m2[k], con k = j*n + i para renglones
      de longitud n<br>
    </tt><br>
    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)<br>
    <br>
      int m3 = (void *) malloc(2); /* Reservamos memoria para 2
    renglones, no estoy seguro si es asi, pero sería la idea */<br>
      int m3[0] = (int *) malloc(3); /* Reservamos memoria para 3
    enteros para el renglón 0 */<br>
      int m3[1] = (int *) malloc(3); /* Reservamos memoria para 3
    enteros para el renglón 1 */<br>
    <br>
    Y para asignar los valores sería<br>
      m3[0][0] = 1; /* renglón 0, columna 0 */<br>
      m3[0][1] = 2; /* renglón 0, columna 1 */<br>
      m3[j][i] = k; /* renglón j, columna i */<br>
    <br>
    Espero te sea de utilidad y no haberte enredado más!!<br>
    <br>
    Saludos<br>
    RT<br>
    <br>
    <blockquote
      cite="mid:AANLkTi=cVOdo+6GmZXcR3RFa55e9czYi_pT2MEcKZgzf@mail.gmail.com"
      type="cite">
      <br>
    </blockquote>
    <br>
    <blockquote
      cite="mid:AANLkTi=cVOdo+6GmZXcR3RFa55e9czYi_pT2MEcKZgzf@mail.gmail.com"
      type="cite">
      <br>
      ESOP!!<br>
      <br>
      Espero sus respuestas.<br>
      <br>
      <br>
      <pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
Lista de correo Cconclase <a class="moz-txt-link-abbreviated" href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a>
<a class="moz-txt-link-freetext" href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a>
Bajas: <a class="moz-txt-link-freetext" href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a></pre>
    </blockquote>
    <br>
  </body>
</html>