Crear array de X elementos

Started by Milton884, September 04, 2012, 08:04:46 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Milton884

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.

KeoH

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.

Milton884

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.


SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Milton884

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.

KeoH

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


Milton884

#6
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.-.-.-

Milton884

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

Milton884

Estoy atrancado no puedo seguir.. alguien sabbbe oomoo soluionarlo?

SplinterGU

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
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

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)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

recorda liberar el array cuando ya no lo uses... con free(array)


otra, bool no existe como tipo de dato en bennugd.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Milton884

o sea que la funcion correcta era "malloc" en vez de alloc ? o otra cosa?
desde ya gracias.

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Milton884

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