Memoria para una matriz de datos.

Started by KeoH, March 28, 2013, 07:30:45 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

KeoH

Wenas ... ando trabajando en mi motor de tileado isometrico y necesito crear dinamicamente una variable que contenga una matriz. El tañaño del la matriz no es fijo, ese el el problema. Intento explicar.

Necesito algo como esto:

int matriz[X][Y];


Donde X e Y son el numero de elementos que tiene la matriz por filas y columnas. El problema es que no sé como hacerlo con la instrucción calloc. Actualmente consigo hacer esto:

global
   int* matriz;
end


.
.
.
matriz = calloc(X, sizeof(int));

con lo que consigo un array matriz[X] ... pero no se como conseguir una matriz .. ¿ideas? ¿Me he explicado?


kim-elet-o

Hace tiempo que no toco memoria dinamica en BennuGd, pero si no mal recuerdo, primero tenias que pedir memoria con un tamaño igual al tamaño que va ocupar la matriz, y luego podias acceder a esta como si fuera una matriz usando la anotaciones de memoria dinamica.

No se si te he sido de ayuda, pero es que no me acuerdo ahora como se hacia exactamente.


|/
|\im-elet-o el yayo programador.

DCelso

#2
Int ** matriz;

...

matriz = calloc(x,sizeof(int*));

for i=0 to x-1 do
  matriz[ i ]= calloc(y, sizeof(int));
end


Y y puedes acceder a tu matriz [x1][y1]

Acuerdate de hacer lo inverso.para liberarlo. Primero bucles de free y luego un free para el array de arrays.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

KeoH

Probaré lo que dice DCelso .. Kim .. es eso lo q quiero hacer .. reservar ese espacio en memoria antes de usarlo xD pero no sabia como hacerlo en el caso de matrices.

DCelso .. segun tu codigo ... lo que hay q hacer es combertir en un array cada elemento del array?? es eso? esos arrays sería posible q fueran de tamaños distintos? Probaré a ver q pasa xDD

Gracias a los dos :3

DCelso

#4
Exacto,
oye, vi un fallo en mi código, me faltaba usar la variable i del bucle :D [ el foro este la quita, tuve que meter espacios entre los corchetes para que se vea]. espero que te hayas dado cuenta antes de reaizarlo ;)
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

KeoH


Estoy intentando hacer la función que comenté, para crear matrices .. pero algo falla .. porque me da violacion de segmento .. le he puesto say() en el bucle y lo hace .. lo que pasa es que despues no puedo acceder a los elementos de la matriz .. me da la violacion de segmento ...

function CL_CreateMatrix(int pointer matriz, int numX, int numY)
private
int i;
end
begin
matriz = calloc(numY, sizeof(int*));
from i=0 to numY-1;
matriz[i] = calloc(numX, sizeof(int*));
end
end

Uso la funcion de esta manera:

CL_CreateMatrix(&[nivel].tile.idProcesoTile, [nivel].columnasDeTiles, [nivel].filasDeTiles);



Esta llamada esta dentro de otra funcion. La matriz está dentro de una estructura de datos donde se pasa por parametros a esta ultima función xD no se si me explico ... vamos q me pego la tarde violando segmentos

kim-elet-o

Hmmmm como accedes a un elemento de la matriz?.


|/
|\im-elet-o el yayo programador.

KeoH

en la linea siguiente del codigo intento acceder a un elemento de la matriz para probar:

say([nivel].tile.idProcesoTile[2][5]);


kim-elet-o

#8
Hola Keoh,

Perdona que haya tardado en responderte, pero estos dias estado reaprendiendo punteros en Bennugd y en C/C++, y por fin he podido encontrar la solucion a tu problema, bueno dos soluciones.
Bueno primero dare un poquitin de teoria C/C++, en C/C++ hay tres formas de pasar parametros a una funcion, por valor, por referencia, y por direccion, los dos que nos interesan el por referencia y por direccion.

Por referencia es cuando el parametro de la funcion en el se pasa el dato es un enlace a la variable del dato, todas las modificaciones que se hagan en el parametro se realizaran sobre la variable enlazada, ejemplo cabecera:
void AddOne(int &y)

http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/


Por direccion es cuando el parametro de la funcion en el se pasa el dato es puntero que guarda la direccion de la variable del dato, en este caso para modificar el dato se debe utilizar la notacion para punteros para modificar los datos de la variable pasada por direccion, ejemplo cabecera:
void AddOne(int *y)

http://www.learncpp.com/cpp-tutorial/74-passing-arguments-by-address/


En Bennu se utiliza el paso por direccion (se le llama paso por referencia por costumbre, cuando se enseña C/C++, los profesores para no confundir al alumno tambien el paso por direccion le llaman por referencia), y el error en tu funcion es que en vez de crear el array dinamico bidimensional en la variable pasada por direccion, machacas dicha direccion con la direccion del array de punteros que se crea con el primer calloc(), para este error hay dos soluciones:

1.- Atacar directamente la direccion de la variable pasada a la funcion para ello hay que usar la notacion de punteros:

Function CL_CreateMatrix(int **matriz, int numX, int numY)
Private
   int i;
Begin
   *matriz = calloc(numY, sizeof(int*));
   From i=0 to numY-1;
      *(*(matriz) + i) = calloc(numX, sizeof(int));
   End
End


2.- usar un puntero de trabajo, y luego asignar el contenido de dicho puntero a la direccion de la variable pasada en el parametro:

Function CL_CreateMatrix(int *matriz, int numX, int numY)
Private
   int i;
   int **matrizTemp;
Begin
   matrizTemp = calloc(numY, sizeof(int*));
   from i=0 to numY-1;
      matrizTemp[i] = calloc(numX, sizeof(int));
   end

   *matriz = matrizTemp;
End


para acceder fuera de la funcion a los elementos del array dinamico puedes usar la notacion de arrays.

Bueno espero haberte ayudado un poco.

P.D: Tengo los punteros un poco oxidados si he tenido algun error, estoy encantado que se me corrija amablemente.
|/
|\im-elet-o el yayo programador.

SplinterGU

deberia ser



Function CL_CreateMatrix(int **matriz, int numX, int numY)
Private
   int i;
   int *matrizTemp;
Begin
   matrizTemp = calloc(numY, sizeof(int*));
   from i=0 to numY-1;
      matrizTemp[i] = calloc(numX, sizeof(int));
   end
   *matriz = matrizTemp;
End


se puede evitar usar la variable temporal tambien, pero bueno
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

KeoH

xDD esq a mi los punteros me marean xD no se q tienen ... criptonita xD Veré a ver q sale .. Gracias por la ayuda :3