<!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>