Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Milton884 on September 04, 2012, 08:04:46 PM

Title: Crear array de X elementos
Post by: Milton884 on September 04, 2012, 08:04:46 PM
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.
Title: Re:Crear array de X elementos
Post by: KeoH on September 04, 2012, 08:59:06 PM
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.
Title: Re:Crear array de X elementos
Post by: Milton884 on September 04, 2012, 09:34:34 PM
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.

Title: Re:Crear array de X elementos
Post by: SplinterGU on September 04, 2012, 10:37:28 PM
debes usar punteros y malloc
Title: Re:Crear array de X elementos
Post by: Milton884 on September 04, 2012, 11:35:22 PM
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.
Title: Re:Crear array de X elementos
Post by: 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));   // 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

Title: Re:Crear array de X elementos
Post by: 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.-.-.-
Title: Re:Crear array de X elementos
Post by: Milton884 on September 05, 2012, 12:39:17 AM
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
Title: Re:Crear array de X elementos
Post by: Milton884 on September 05, 2012, 01:41:21 AM
Estoy atrancado no puedo seguir.. alguien sabbbe oomoo soluionarlo?
Title: Re:Crear array de X elementos
Post by: SplinterGU on September 05, 2012, 01:51:47 AM
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
Title: Re:Crear array de X elementos
Post by: SplinterGU on September 05, 2012, 01:52:42 AM
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)
Title: Re:Crear array de X elementos
Post by: SplinterGU on September 05, 2012, 01:53:33 AM
recorda liberar el array cuando ya no lo uses... con free(array)


otra, bool no existe como tipo de dato en bennugd.
Title: Re:Crear array de X elementos
Post by: Milton884 on September 05, 2012, 03:25:54 AM
o sea que la funcion correcta era "malloc" en vez de alloc ? o otra cosa?
desde ya gracias.
Title: Re:Crear array de X elementos
Post by: SplinterGU on September 05, 2012, 03:33:37 AM
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.
Title: Re:Crear array de X elementos
Post by: Milton884 on September 05, 2012, 05:03:40 AM
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

Title: Re:Crear array de X elementos
Post by: SplinterGU on September 05, 2012, 02:09:55 PM

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)

Title: Re:Crear array de X elementos
Post by: KeoH on September 05, 2012, 04:48:44 PM
Pos la verdad esque no sabria decirte que pasa xDD no he utilizado datos definidos por mi dentro de otros definidos por mi xDDD
Title: Re:Crear array de X elementos
Post by: SplinterGU on September 05, 2012, 09:43:59 PM
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.
Title: Re:Crear array de X elementos
Post by: Milton884 on September 06, 2012, 04:47:38 AM
 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