Discussion:
Sintaxis para una matriz
(demasiado antiguo para responder)
a***@tutopia.com
2005-12-07 17:32:47 UTC
Permalink
Hola:
Este es mi problema.
Quiero pasar el puntero a una matriz a una funcion, pero... como le
declaro las dimensiones?

Por ejemplo algo asi:
//----------------------------------------------------
double Q[20][30];

void Func(double A[][30]){
//.................
A[3][20]=10. ;
//.................
}

void main(void){

Func(Q);
}
//----------------------------------------------------

Eso anda, pero la funcion Func() debe ser generica, no puedo fijarla
como en el ejemplo a 30 columnas.


Saludos.
Eduardo.
Oscar Garcia
2005-12-07 19:04:06 UTC
Permalink
Post by a***@tutopia.com
Este es mi problema.
Quiero pasar el puntero a una matriz a una funcion, pero... como le
declaro las dimensiones?
double Q[20][30];
void Func(double A[][30]){
Eso anda, pero la funcion Func() debe ser generica, no puedo fijarla
como en el ejemplo a 30 columnas.
Entonces no puedes usar ese tipo de estructura.

Cuando pasas este tipo de parámetros, se pasan todos los datos por la
pila y no un puntero a los datos.

Si quieres implementar matrices de cualquier dimensión entonces debes
hacer esto:

double ***Q;

Donde Q apuntará a una matriz de punteros que apuntan a una matriz de
doubles.

double **crear_matriz (int x, int y) {
double **matriz = (double **) malloc (sizeof (double *) * y);
while (--y >= 0) {
matriz[y] = (double *) malloc (sizeof (double) * x);
}
return matriz;
}

Ojo que como puedes comprobar la estructura no guarda las dimensiones
de la matriz (debes manejarla con precaución).

Existen formas más complejas como crear estructuras, tipos de datos,
etc..

Un saludo.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
F
2005-12-07 22:09:55 UTC
Permalink
De una forma o otra vas a tener que pasar las dimensiones de la matriz a la
funcion, ya C, nunca sabe cuando mide un array si no se le pasa las
dimensiones

Yo encapsulo el matriz dentro de una estrucutra

typedef struct {
int x,y;
double **value;
} matriz;

y paso ese argumento, de esta forma siempre se las dimensiones

void Func(matriz* a){ // Puntero a una estructura de tipo matriz
//.................
//primer y ultimo numero igual a 10
a->value[0][0]=10 ;
a->value[a->x-1][a->y-1]=100;
printf ("valores ultimo y primero: %.0f %0.f\n",
a->value[0][0],a->value[a->x-1][a->y-1]);

//.................
}

Siempre hay que crear la estrucutrua y liberarla

matriz* p=crearMatriz(10,10);
liberarMatriz (p);

El codigo completo seria asi


(nota que esta solucion no es unica)

#include <stdio.h>
#include <stdlib.h>

typedef struct {
int x,y;
double **value;
} matriz;


matriz *crearMatriz(int x,int y){

//Crea una matriz y la devuelve;
matriz* p= malloc (sizeof(matriz)) ;
p->value= malloc (x* sizeof(double*)) ;
p->x=x;
p->y=y;
int i;
for (i=0;i<y;i++) p->value[i]= (double*) malloc (y* sizeof(double)) ;

return p;
}

void liberarMatriz (matriz* p){
//Libera una matriz
int i;
for (i=0;i<p->y;i++) free(p->value[i]);
free(p->value);
free (p);

}


void Func(matriz* a){
//.................
//primer y ultimo numero igual a 10
a->value[0][0]=10 ;
a->value[a->x-1][a->y-1]=100;
printf ("valores ultimo y primero: %.0f %0.f\n",
a->value[0][0],a->value[a->x-1][a->y-1]);

//.................
}


int main(int argc, char *argv[])
{


matriz* p=crearMatriz(10,10);
Func(p);
liberarMatriz (p);

system("PAUSE");
return 0;
}
Post by a***@tutopia.com
Este es mi problema.
Quiero pasar el puntero a una matriz a una funcion, pero... como le
declaro las dimensiones?
//----------------------------------------------------
double Q[20][30];
void Func(double A[][30]){
//.................
A[3][20]=10. ;
//.................
}
void main(void){
Func(Q);
}
//----------------------------------------------------
Eso anda, pero la funcion Func() debe ser generica, no puedo fijarla
como en el ejemplo a 30 columnas.
Saludos.
Eduardo.
a***@tutopia.com
2005-12-08 13:13:05 UTC
Permalink
Gracias Oscar Garcia y F por responder.
Me quitaron las dudas, mi ilusion era escribir A[xx][yy] y que el
compilador supiera que el elemento estaba en la posicion (yy +
xx*Ncolumnas)*sizeof(double) con Ncolumnas en una variable.
Lastima... se veia tan simple, habra que usar los otros metodos.

Saludos.
Eduardo.
Oscar Garcia
2005-12-08 14:29:03 UTC
Permalink
Post by a***@tutopia.com
Gracias Oscar Garcia y F por responder.
Me quitaron las dudas, mi ilusion era escribir A[xx][yy] y que el
compilador supiera que el elemento estaba en la posicion (yy +
xx*Ncolumnas)*sizeof(double) con Ncolumnas en una variable.
Lastima... se veia tan simple, habra que usar los otros metodos.
Con mi sistema el acceso a los datos es con matriz[y][x] (y si cambias
el orden del bucle de reserva de memoria sería matriz[x][y]).

También con el de F, aunque antes debes acceder al elemento de la
estructura que contiene los datos.

La ventaja de usar estructuras respecto a usar directamente el puntero
a un array de punteros es que en la estructura creas ese mismo puntero
a array de punteros, pero también almacenas el tamaño de la matriz.

Un saludo.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
a***@tutopia.com
2005-12-08 15:12:18 UTC
Permalink
Post by Oscar Garcia
Con mi sistema el acceso a los datos es con matriz[y][x] (y si cambias
el orden del bucle de reserva de memoria sería matriz[x][y]).
También con el de F, aunque antes debes acceder al elemento de la
estructura que contiene los datos.
La ventaja de usar estructuras respecto a usar directamente el puntero
a un array de punteros es que en la estructura creas ese mismo puntero
a array de punteros, pero también almacenas el tamaño de la matriz.
Es verdad, lo tendre en cuenta.

Saludis.
Eduardo.
Post by Oscar Garcia
Un saludo.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Loading...