Hola que tal, quisiera crear un ARRAY de X elementos, donde X seria el valor obtenido de una clave en un archivo .INI (la clave es cantidad). Yo hice esto pero no sirve...:
process cargar_objetos()
PRIVATE
int cantidad_objs=leeClave("prg/OBJ.dat","CANTIDAD","CANTIDAD");
OBJDATA objetos[cantidad_objs]; //ERROR ACA...
BEGIN
say(camtodad_objs);
END
Espero sus respuestas, muchas gracias.
Para eso tienes que cambiar el tamaño que ocupa en memoria ese array de forma dinamica. Prueba esto a ver si te funciona:
process cargar_objetos()
private
int* cantidad;
int num_objetos;
end
begin
num_objetos = leeClave( ....... ); // Aqui la funcion que carga y encuentra cuantos objetos necesita, por ejemplo 20.
cantidad = alloc(num_elementos*sizeof(int)); // A partir de ahora cantidad tiene 20 elementos (ejemplo) y puedes acceder a ellos como cantidad[0], cantidad[1] .... cantidad[19]
end
Pruebalo q yo lo he escrito directamente no se si te va a dar error ... completa la funcion de carga y esas cosas ... la variable cantidad tiene un asterisco en su definicion porq es un puntero. Las funciones sizeof y alloc estan en mod_mem, tienes q importarlo.
Disculpa KeoH, gracias igual, pero en mi caso el array que quiero, es un Array de Type.. de X elementos claro, leido la cantidad de elementos de un fichero con LeeClave. el type seria este:
TYPE OBJDATA //Aca cargaremos los objetos desde OBJ.DAT
int NRO_OBJ;
int OBJType;
T_Armadura armadura;
T_Casco casco;
T_Escudo escudo;
END
O sea yo quiero llegar a tener una variable de Type OBJDATA, de X elementos (leido de un archivo .ini), y acceder a sus propiedades, ejemplo:
objeto[0].armadura.Equipado=1;
objeto[1].armadura.Equipado=0;
objeto[0].NROObj=5;
Me explico? Gracias por la ayuda.
debes usar punteros y malloc
No podrias darme un ejemplito en codigo, creando un Array con X elementos dependiendo de una clave leida de un archivo .INI ? Quiero decir, definir los elementos de un array de un TIPO dentro del bloque BEGIN END.
Prueba con esto a ver ...
process cargar_objetos()
private
OBJDATA* cantidad;
int num_objetos;
end
begin
num_objetos = leeClave( ....... ); // Aqui la funcion que carga y encuentra cuantos objetos necesita, por ejemplo 20.
cantidad = alloc(num_elementos*sizeof(cantidad)); // A partir de ahora cantidad tiene 20 elementos (ejemplo) y puedes acceder a ellos como cantidad[0].loquesea, cantidad[1].loquesea .... cantidad[19].loquesea
end
Quote from: KeoH on September 05, 2012, 12:05:11 AM
Prueba con esto a ver ...
process cargar_objetos()
private
OBJDATA* cantidad;
int num_objetos;
end
begin
num_objetos = leeClave( ....... ); // Aqui la funcion que carga y encuentra cuantos objetos necesita, por ejemplo 20.
cantidad = alloc(num_elementos*sizeof(cantidad));
end
No me funciono... hice esto:
process cargar_objetos()
private
OBJDATA* cantidad;
int num_elmentos;
end
begin
num_objetos = leeClave( ....... ); // Aqui la funcion que carga y encuentra cuantos objetos necesita, por ejemplo 20.
cantidad = alloc(num_elementos*sizeof(cantidad));
cantidad[0].armaduras.Equipado=1;
<---- ACA tira error dice que "armaduras" no esta definido... y SI lo defini :S... end[
Espero sus ayduas.-.-.-
ACA estan mis Types, por si acaso... :
TYPE T_Armadura
bool Equipado;
int GIndex;
int MIN_DEF;
int MAX_DEF;
END
TYPE T_Casco
bool Equipado;
int GIndex;
int MIN_DEF;
int MAX_DEF;
END
TYPE T_Escudo
bool Equipado;
int GIndex;
int MIN_DEF;
int MAX_DEF;
END
TYPE OBJDATA //Aca cargaremos los objetos desde OBJ.DAT
int NRO_OBJ;
int OBJType;
T_Armadura armadura;
T_Casco casco;
T_Escudo escudo;
END
TYPE T_UserList
int NRO_OBJ; //cuando sea en RED..
OBJDATA OBJ;
T_Armadura P_Armadura;
T_Casco P_Casco;
T_Escudo P_Escudo;
END
Estoy atrancado no puedo seguir.. alguien sabbbe oomoo soluionarlo?
fix
process cargar_objetos()
private
OBJDATA* objetos;
int cantidad_objs;
end
begin
cantidad_objs=leeClave("prg/OBJ.dat","CANTIDAD","CANTIDAD");
objetos = malloc(cantidad_objs * sizeof(OBJDATA));
end
Quote from: Milton884 on September 05, 2012, 12:27:43 AM
Quote from: KeoH on September 05, 2012, 12:05:11 AM
Prueba con esto a ver ...
process cargar_objetos()
private
OBJDATA* cantidad;
int num_objetos;
end
begin
num_objetos = leeClave( ....... ); // Aqui la funcion que carga y encuentra cuantos objetos necesita, por ejemplo 20.
cantidad = alloc(num_elementos*sizeof(cantidad));
end
No me funciono... hice esto:
process cargar_objetos()
private
OBJDATA* cantidad;
int num_elmentos;
end
begin
num_objetos = leeClave( ....... ); // Aqui la funcion que carga y encuentra cuantos objetos necesita, por ejemplo 20.
cantidad = alloc(num_elementos*sizeof(cantidad));
cantidad[0].armaduras.Equipado=1; <---- ACA tira error dice que "armaduras" no esta definido... y SI lo defini :S...
end[
Espero sus ayduas.-.-.-
seguro, la estructura interna no se llama armaduras, sino armadura (sin la s final)
recorda liberar el array cuando ya no lo uses... con free(array)
otra, bool no existe como tipo de dato en bennugd.
o sea que la funcion correcta era "malloc" en vez de alloc ? o otra cosa?
desde ya gracias.
perdon, es alloc.
pero el problema no es el alloc, son 2, primero que estas intentando usar "armaduraS" y en la estructura es "armadura". el otro error que no lo vas a darte cuenta sino hasta que lo pruebes, y quizas no lo veas sino que te volveras loco para encontrarlo, es que no es sizeof(objetos) o sizeof(cantidad) (como puso Keoh), ya que cantidad es puntero, entonces sizeof(puntero) es el tamaño del puntero, no del elemento estructura... tenes que hacer sizeof(elemento_type) o hacer sizeof(*puntero) o sizeof(puntero[0])... ahi si obtenes el tamaño del contenido al que apunta el puntero, y no el puntero que son 4 bytes.
Si splinter la verdad me esta volviendo loco. El tema de Armaduras, que sobra una "s" lo correji, El tema de boolean tambien, uso integer en vez de.
Y puse este codigo finalmente con tus correcciones:
process cargar_objetos()
private
OBJDATA* objetos;
int cantidad_objs;
end
begin
cantidad_objs=leeClave("prg/OBJ.dat","CANTIDAD","CANTIDAD");
objetos = alloc(cantidad_objs * sizeof(OBJDATA));
objetos[0].armadura.Equipado=1;
end
Y me dice que "armadura" no esta definido.. Te paso los Types nuevamente: (cabe aclarar que los types los defini antes que este proceso,)
TYPE T_Armadura
int Equipado;
int GIndex;
int MIN_DEF;
int MAX_DEF;
END
TYPE T_Casco
bool Equipado;
int GIndex;
int MIN_DEF;
int MAX_DEF;
END
TYPE T_Escudo
bool Equipado;
int GIndex;
int MIN_DEF;
int MAX_DEF;
END
TYPE OBJDATA //Aca cargaremos los objetos desde OBJ.DAT
int NRO_OBJ;
int OBJType;
T_Armadura armadura;
T_Casco casco;
T_Escudo escudo;
END
TYPE T_UserList
int NRO_OBJ; //cuando sea en RED..
OBJDATA OBJ;
T_Armadura P_Armadura;
T_Casco P_Casco;
T_Escudo P_Escudo;
END
Plz ayuda :S
import "mod_mem";
TYPE T_Armadura
int Equipado;
int GIndex;
int MIN_DEF;
int MAX_DEF;
END
TYPE T_Casco
bool Equipado;
int GIndex;
int MIN_DEF;
int MAX_DEF;
END
TYPE T_Escudo
bool Equipado;
int GIndex;
int MIN_DEF;
int MAX_DEF;
END
TYPE OBJDATA //Aca cargaremos los objetos desde OBJ.DAT
int NRO_OBJ;
int OBJType;
T_Armadura armadura;
T_Casco casco;
T_Escudo escudo;
END
TYPE T_UserList
int NRO_OBJ; //cuando sea en RED..
OBJDATA OBJ;
T_Armadura P_Armadura;
T_Casco P_Casco;
T_Escudo P_Escudo;
END
process cargar_objetos()
private
OBJDATA* objetos;
int cantidad_objs;
end
begin
cantidad_objs=10;//leeClave("prg/OBJ.dat","CANTIDAD","CANTIDAD");
objetos = alloc(cantidad_objs * sizeof(OBJDATA));
objetos[0].armadura.Equipado=1;
end
begin
end
salida de compilacion
BGDC 1.0.0 (Aug 29 2012 02:22:20)
Bennu Game Development Compiler
Copyright (c) 2006-2012 SplinterGU (Fenix/BennuGD)
Copyright (c) 2002-2006 Fenix Team (Fenix)
Copyright (c) 1999-2002 José Luis Cebrián Pagüe (Fenix)
File /home/splinter/tmp/st.dcb compiled (41299 bytes):
Processes 3
Global data 212 bytes
Local data 208 bytes
Private data 8 bytes
Public data 0 bytes
Code 96 bytes
System processes 80
Globals vars 21
Locals vars 27
Private vars 2
Publics vars 0
Identifiers 519
Structs 9
Strings 16 (140 bytes)
Pos la verdad esque no sabria decirte que pasa xDD no he utilizado datos definidos por mi dentro de otros definidos por mi xDDD
no hay nada que decir... funciona... posiblemente tenga los TYPE declarados luego de la funcion... deben estar declarados antes sino el compilador no los conoce al momento de compilar esas lineas.
Si no se que pasaba, pero tal cual me pusiste el codigo splinter, lo hice funcionar perfectamente :S. En fin muchas gracias por la ayuda, ya puedo utilizar matrizes de Types definidas con X elementos.
Pido please, que vean el Tema nuevo que hice.. si pueden echarme una mano. El tema del "ModLEEIni".
saludos