PDA

Ver la versión completa : Una cosa muy sencilla... pero que no tengo idea de como hacer :P



Conderock
20/08/2005, 12:46
Estoy dando mis primeros pasos con el C y quería empezar haciendo algo tipo 3 en raya. La cosa es que quiero hacer un array bidimensional de tamaño variable para el tablero. ¿Como puedo hacer eso?

Ahora mismo tengo un array de tamaño fijo:

int a[10][10];

Al que puedo acceder facilmente usando las coordenadas a[x][y].

Pues querria hacer eso mismo pero de tamaño variable...

Gracias ;)

Karkayu
20/08/2005, 12:58
Para hacer lo que pides debes usar PUNTEROS (o apuntadores como traducen algunos libros sudamericanos).

Lo suyo es hacer una lista de listas usando punteros, de forma que simules una matriz dinamica.
Busca ejemplos por libros e internet pq no es plan de plantarte aqui todo el codigo... :chupete:

Sin embargo, piensa que el acceso a las posiciones de la matriz dinamica hecha con punteros no seran tan facil como cuando usas arrays. Deberas recorrer cada una de las listas.
Bueno, ya lo veras tu... que te estoy rallando mucho, verdad? :D

Un saludo
:brindis:

Wave
20/08/2005, 12:58
int *a=calloc(sizeof(int)*X*Y);
a[x+y*X]; //a[x][y]

Creo que asi ira, aunque lo digo de cabeza.

the_goulin
20/08/2005, 13:50
char * tablero=calloc(sizeof(char),x*y);

es mejor que utilices char en vez de int, ocuparas menos memoria y seguro que para un tablero 3 en raya no necesitas mas.

y si es para programar en la gp mejor usa gp_mem_func.calloc o puedes tener problemillas incomprensibles (con el gpsnake me paso)

Saludillos si necesitas algo mas ya conoces mi email,
The_Goulin

Conderock
20/08/2005, 13:51
Lo de listas lo pensé, pero para unas 3 en raya sale más caro el barniz que el santo :)

Genial, funciona perfectamente (con un par de apaños ;)). Muchas gracias Wave.


int na; // tamaño del array
int *ar; //array

na=9; //tamaño
ar=malloc(sizeof(int)*na*na); //creacion


ar[i*na+j]=rand()%9 //posicionamiento en i,j y asignacion de valor aleatorio

Conderock
20/08/2005, 13:53
char * tablero=calloc(sizeof(char),x*y);

es mejor que utilices char en vez de int, ocuparas menos memoria y seguro que para un tablero 3 en raya no necesitas mas.

y si es para programar en la gp mejor usa gp_mem_func.calloc o puedes tener problemillas incomprensibles (con el gpsnake me paso)

Saludillos si necesitas algo mas ya conoces mi email,
The_Goulin


Vale, muchísimas gracias ;). De momento no me he metido con la GP, primero estoy haciendo pruebecillas con el GCC de windows :P para coger algo de soltura, que yo vengo de Pascal :loco:

Petiso
20/08/2005, 15:28
Dos opciones:
- la que ya te han dicho, usar memoria dinamica.

- No usar memoria dinamica.
#define MAX_ARRAY 50 //el que crees que será el máximo del array
int a[MAX_ARRAY][MAX_ARRAY];
int tamanyo=4; //aqui guardas el tamanyo de tu tablero en cada momento (para saber el máximo, bordes, etc).

Para entrar a la posición que quieras, solo tienes que mirar: a[x][y]

El resto de tablero, pues es memoria inutil, pero a veces es mas facil hacerlo asi, ni que pierdas memoria.

Adios !

Conderock
20/08/2005, 15:50
Dos opciones:
- la que ya te han dicho, usar memoria dinamica.

- No usar memoria dinamica.
#define MAX_ARRAY 50 //el que crees que será el máximo del array
int a[MAX_ARRAY][MAX_ARRAY];
int tamanyo=4; //aqui guardas el tamanyo de tu tablero en cada momento (para saber el máximo, bordes, etc).

Para entrar a la posición que quieras, solo tienes que mirar: a[x][y]

El resto de tablero, pues es memoria inutil, pero a veces es mas facil hacerlo asi, ni que pierdas memoria.

Adios !

Esa es la solución que estaba usando hasta ahora :), pero no era muy elegante ;).

Conderock
25/08/2005, 20:43
A ver si alguien me pude ayudar con otra duda que me ha surgido. Que me estoy volviendo loco...

PRIMERO USO ESTO PARA INSERTAR UN ELEMENTO EN LA LISTA, LA LISTA TIENE x, y que son enteros y recorridos que es un array que necesito para una historia muy larga de contar :)






void InsertarElementoLista(int px, int py, TposicionLista p, TLista l, int *reco, int na) {
TposicionLista q;
int i;

q = (TposicionLista)malloc(sizeof(struct TNodo));

q->recorridos=malloc(sizeof(int)*na*na);
for (i=0;i<((na)*(na));i++) q->recorridos[i]=reco[i];
q->x=px;
q->y=py;
q->siguiente=p->siguiente;
p->siguiente=q;
};



VALE, pues insertado está, ahora cuando intento recuperar el contenido de ese array no hay huevos. La función de abajo es sólo de prueba, intento imprimir el contenido del array que acabo de insertar con la función anterior.




void RecuperaElementoLista(int *px, int *py, TposicionLista p, TLista l, int *reco, int na) {
int i; int *recot;

*px=p->siguiente->x;
*py=p->siguiente->y;
printf("%d,",p->siguiente->x);
printf("%d,",p->siguiente->y);
printf("%d,",p->recorridos[1]);

};


(MUCHA IDEA DE C NO TENGO, SEGURO QUE ES UNA CHORRADA :loco: )

Petiso
25/08/2005, 21:21
Hola !

Si no pones el objetivo, y como llamas a las funciones, pos poco se puede ver.

Las funciones en si parecen que esten "bien".

Varios comentarios:
void InsertarElementoLista(int px, int py, TposicionLista p, TLista l, int *reco, int na)

Si quieres insertar un elemento despues de la posicion P, no te hace falta pasar la variable 'TLista l'.

Tambien, que pasara si quieres insertar a la primera posicion ??? Con esta funcion no lo puedes hacer ......

Y en:
void RecuperaElementoLista(int *px, int *py, TposicionLista p, TLista l, int *reco, int na)

Haces:
*px=p->siguiente->x;
*py=p->siguiente->y;

Con lo que no recuperas el elemeno P, sino el siguiente, es lo que quieres ????
Y claro, si resulta que no hay siguiente .... pos no vuelva nada :-p

En resumen, sin saber para que y como se llaman, poco se puede hacer.

Adios !

Conderock
25/08/2005, 21:48
Perdón por no haber sido suficientemente claro :P, y gracias por responder ;)


La cosa es esta (a ver si consigo explicarlo mejor):

InsertarElementoLista (coordenadax,coordenaday, TposicionLista p, TLista l,array a almacenar en la lista, tamaño del array)

Cada elemento de la lista va a almacenar:
coordenadax, coordenaday y un array de cierto tamaño


void InsertarElementoLista(int px, int py, TposicionLista p, TLista l, int *reco, int na) {
TposicionLista q;
int i;

q = (TposicionLista)malloc(sizeof(struct TNodo));

q->recorridos=malloc(sizeof(int)*na*na);
for (i=0;i<((na)*(na));i++) q->recorridos[i]=reco[i];
q->x=px;
q->y=py;
q->siguiente=p->siguiente;
p->siguiente=q;
};


Eso por lo que he podido comprobar parece que hace lo que yo quiero... pero, cuando intento acceder al array que se supone he almacenado anteriormente con esta función de aquí, no hay forma


void RecuperaElementoLista(variable donde quiero recuperar la coordenada x, idem para y, TposicionLista p, TLista l, array donde quiero recuperar el array que hay en la lista,tamaño del array)


void RecuperaElementoLista(int *px, int *py, TposicionLista p, TLista l, int *reco, int na) {
int i; int *recot;

*px=p->siguiente->x;
*py=p->siguiente->y;
printf("%d,",p->siguiente->x);
printf("%d,",p->siguiente->y);
printf("%d,",p->recorridos[1]);

};

En esta última función por supuesto no recupero el array (estoy haciendo pruebas a ver si encuentro el error), pero cuando intento sacar el elemento de la posición [1] por pantalla (printf("%d,",p->recorridos[1])) me peta la cosa... y el caso es que cuando he insertado el array he comprobado que se van metiendo numeritos y tal, pero al salir de la funcion de inserción e intentar acceder al array almacenado con la función de recuperación, pues dice que nones.

Conderock
25/08/2005, 21:53
Hola !

Si no pones el objetivo, y como llamas a las funciones, pos poco se puede ver.

Las funciones en si parecen que esten "bien".

Varios comentarios:
void InsertarElementoLista(int px, int py, TposicionLista p, TLista l, int *reco, int na)

Si quieres insertar un elemento despues de la posicion P, no te hace falta pasar la variable 'TLista l'.

Tambien, que pasara si quieres insertar a la primera posicion ??? Con esta funcion no lo puedes hacer ......

Y en:
void RecuperaElementoLista(int *px, int *py, TposicionLista p, TLista l, int *reco, int na)

Haces:
*px=p->siguiente->x;
*py=p->siguiente->y;

Con lo que no recuperas el elemeno P, sino el siguiente, es lo que quieres ????
Y claro, si resulta que no hay siguiente .... pos no vuelva nada :-p

En resumen, sin saber para que y como se llaman, poco se puede hacer.

Adios !


Respecto a los comentarios que haces, si, es todo intencional, es una lista un poco rara, pero funcionar funcionaba hasta ahora, lo que pasa es que sólo tenía un par de enteros, nada de arrays (bueno, arrays o lo que sea eso que se consigue con malloc :P).

Petiso
25/08/2005, 21:54
Repito lo que he dicho antes:
----------------
Haces:
*px=p->siguiente->x;
*py=p->siguiente->y;

Con lo que no recuperas el elemeno P, sino el siguiente, es lo que quieres ????
Y claro, si resulta que no hay siguiente (que no lo puedes saber si es el ultimo o no) .... el progama peta.
-----------------

Tendria que ser:
*px=p->x;
*py=p->y;

Despues, se supone que 'int *reco' tiene el tamanyo adecuado no ?
Y que tamayo tiene ??
Si solo tiene un elemento ... en C, el primer elemento es 0, y no 1 .....

Adios.

Petiso
25/08/2005, 21:56
Entonces has de comprovar si hay siguiente:
if (p->siguiente!=0)
{
*px=p->siguiente->x;
*py=p->siguiente->y;
}


(Y inicializar a 0 los siguientes quando crear la lista).

Adios.

Conderock
25/08/2005, 21:59
Repito lo que he dicho antes:
----------------
Haces:
*px=p->siguiente->x;
*py=p->siguiente->y;

Con lo que no recuperas el elemeno P, sino el siguiente, es lo que quieres ????
Y claro, si resulta que no hay siguiente (que no lo puedes saber si es el ultimo o no) .... el progama peta.
-----------------

Si, recupero el siguiente, porque se inserta en el siguiente, y todo funciona con el siguiente, cosas mias :P, ese no es el problema, seguro, porque cuando recupero, consigo acceder a las coordenadas x e y, la cosa peta cuando llego al array.



Despues, se supone que 'int *reco' tiene el tamanyo adecuado no ?
Y que tamayo tiene ??
Si solo tiene un elemento ... en C, el primer elemento es 0, y no 1 .....

Adios.

Pues reco se supone que tiene un tamaño de na*na (vamos que es grandecito :D).

Y sí, ya se que el primer elemento es cero, pero como na es bastante grande me ha dado por sacar el elemento 1, pero da igual que saque el 0, el 2, o el 25, la cosa peta igualmente :(.

Gracias de nuevo por el interés ;).

Petiso
25/08/2005, 22:02
Hola !

De estos 3 printf's, llega a hacer alguno ?????

printf("%d,",p->siguiente->x);
printf("%d,",p->siguiente->y);
printf("%d,",p->recorridos[1]);

Y por que X e Y son siguientes, y recorrido no ??????

Adios.

Conderock
25/08/2005, 22:05
*****, soy tonto del culo, con toda la historia esa de siguiente, no he puesto siguiente al recuperar el array, creo que es eso... voy a ver...

Conderock
25/08/2005, 22:06
Hola !

De estos 3 printf's, llega a hacer alguno ?????

printf("%d,",p->siguiente->x);
printf("%d,",p->siguiente->y);
printf("%d,",p->recorridos[1]);

Y por que X e Y son siguientes, y recorrido no ??????

Adios.

TU LO HAS DICHO, cangontó... :D, graciaaaas ;)

Petiso
25/08/2005, 22:07
De nada.

Solo por curiosidad, como recuperaras el primer elemento ???

Conderock
25/08/2005, 22:18
De nada.

Solo por curiosidad, como recuperaras el primer elemento ???

Es que PrimeroLista devuelve la posición de la lista :), y como recuperar recupera el siguiente... pues eso :D

PD: Ya funciona de **** madre, vaya una tarde tonta que he echado :(

Petiso
25/08/2005, 22:41
O_o .......... si tu te entiendes es lo que cuenta :-p

Adios !

Conderock
25/08/2005, 22:46
:p :p :p :p :p

oankali
29/08/2005, 15:39
Acabo de llegar de vacaciones y por esto no he contestado antes.
Si te interensan las listas dinámicas, puedes mirar mi librería list.h que encontrarás en mi web aquí: http://www.nekanium.com/gp32/cLibraries.htm

Oankali.