Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: KeiDash on April 24, 2018, 12:50:19 PM

Title: Comprobar si un array tiene valores antes de utilizarlo.
Post by: KeiDash on April 24, 2018, 12:50:19 PM
Buenas gente,

Gracias al post de Drumpi, estoy trabajando con Arrays dinámicos bastante bien la verdad, me ha venido de perlas para los procesos que estoy realizando.

Mientras estaba trabajando, la ejecución del programa provocó un error (no en la compilación, si no en la ejecución) al intentar consultar un valor de uno de estos arrays.

El problema se debió a que lo que yo estaba consultado, no se había generado. Entonces, me vino la siguiente duda ¿Cómo compruebo si un array tiene algo o no para prevenir consultarlo y que de error? Quizás la solución es super sencilla, pero ahora mismo me he quedado que no sé como hacerlo. En otros lenguajes, consultando directamente la longitud del array o si el mismo no es null, pero con la sintaxis de Bennu me he quedado perdido ahora. Pongo el siguiente caso real:


   Type _myObject
      int nodo;
      int valor:
   End

   Process Main()
   Private
      _myObject pointer objTest;
      int indices = 0;
   Begin
      indices = getIndicesData();

      //Redimensión del array
      objTest = alloc(indices * sizeof(_myObject ));

      setMyObjectData(); //Método que puede o no, rellenar el array de datos.

      //JUSTO AQUÍ, como compruebo antes de mostrarlo si tiene o no valor para que no de un error?
      say("Valor nodo:" + objTest[0].nodo);

   End


Title: Re:Comprobar si un array tiene valores antes de utilizarlo.
Post by: JaViS on April 24, 2018, 06:02:18 PM
Estas preguntando como saber si cierto indice existe?
Title: Re:Comprobar si un array tiene valores antes de utilizarlo.
Post by: KeiDash on April 24, 2018, 10:15:52 PM
Quote from: JaViS on April 24, 2018, 06:02:18 PM
Estas preguntando como saber si cierto indice existe?

Mmm si, en cierta manera si.
Title: Re:Comprobar si un array tiene valores antes de utilizarlo.
Post by: JaViS on April 24, 2018, 10:35:06 PM
puedes dividir el sizeOf the tu puntero por el tamaño de tu tipo de datos, y vas a tener la cantidad de elementos que contiene


sizeof(objTest) / sizeof(_myObject)
Title: Re:Comprobar si un array tiene valores antes de utilizarlo.
Post by: KeiDash on April 25, 2018, 12:08:50 PM
Quote from: JaViS on April 24, 2018, 10:35:06 PM
puedes dividir el sizeOf the tu puntero por el tamaño de tu tipo de datos, y vas a tener la cantidad de elementos que contiene


sizeof(objTest) / sizeof(_myObject)

Gracias por la respuesta Jasvi, pero no me está funcionando correctamente, me expico

Si consulto como tu me indicas, siempre me da como resultado 0, te pongo mi código para explicar el caso mejor.


Type BTTrack
string _Name;
string _FileName;
string _Author;
string _Level;
int _TiempoEspera;
End

Process Main()
Private
        BTTrack pointer BTTrackCollection;
Begin

        BTTrackCollection = alloc(2 * sizeof(BTTrack));

BTTrackCollection[0]._Name = "Mod Test";
BTTrackCollection[0]._FileName = "test.mod";
BTTrackCollection[0]._Author = "KeiDash";
BTTrackCollection[0]._Level = "Medium";
BTTrackCollection[0]._TiempoEspera = TimeToMiliseconds("4.400");

BTTrackCollection[1]._Name = "Mystic";
BTTrackCollection[1]._FileName = "Mystic.wav";
BTTrackCollection[1]._Author = "The Mighty Rager";
BTTrackCollection[1]._Level = "Medium";
BTTrackCollection[1]._TiempoEspera = TimeToMiliseconds("4.400");

        say(sizeof(BTTrackCollection)/sizeof(BTTrack)); //Esto siempre muestra que es 0
End
Title: Re:Comprobar si un array tiene valores antes de utilizarlo.
Post by: warrior_rockk on April 25, 2018, 06:13:22 PM
En Bennu funciona el NULL. Yo comparo el array dinamico con NULL para comprobar si está vacía...
Title: Re:Comprobar si un array tiene valores antes de utilizarlo.
Post by: JaViS on April 25, 2018, 07:24:50 PM
Probaste con un * frente al puntero?


say(sizeof(*BTTrackCollection)/sizeof(BTTrack));
Title: Re:Comprobar si un array tiene valores antes de utilizarlo.
Post by: SplinterGU on April 26, 2018, 12:16:43 PM
no, de allocs no puedes usar sizeof...
Title: Re:Comprobar si un array tiene valores antes de utilizarlo.
Post by: JaViS on April 26, 2018, 01:43:42 PM
Quote from: SplinterGU on April 26, 2018, 12:16:43 PM
no, de allocs no puedes usar sizeof...


AH es cierto, lo habia olvidado, es por eso que siempre utilizo listas dinamicas en lugar de arrays dinamicos.
Title: Re:Comprobar si un array tiene valores antes de utilizarlo.
Post by: Drumpi on May 11, 2018, 12:35:12 AM
Es la pega de los punteros, el control es totalmente manual.
En otros lenguajes sí que hay funciones para saber el tamaño de un array dinámico o si se ha inicializado. Pero en C o en Bennu debes llevar tú el control.

Os voy a contar un secreto. ¿Conoceis las List<T> esas de C#, Java y demás lenguajes que se parecen tanto a estos arrays dinámicos? No lo son. Son listas enlazadas. Todas las Collection son listas enlazadas, con su función de recorrer toda la lista para contar sus elementos, con su función de recorrer la lista para buscar un elemento y leerlo/escribirlo...

Digamos que estos "arrays dinámicos" en realidad es "hacer trampas". En realidad reservamos un espacio de memoria, y nos movemos por él como gorrinos por el barro. De nosotros depende que, al hacerlo, no nos manchemos demasiado.
Se pueden usar para pequeñas cosas, y para agilizar algunas partes del código, pero a la hora de la verdad, listas enlazadas siempre, con su GET, su COUNT, su DELETE, su CLEAR, su ADD y luego las funciones auxiliares que necesiteis (compare, order, reverse, split, join...).
Title: Re:Comprobar si un array tiene valores antes de utilizarlo.
Post by: KeiDash on May 13, 2018, 08:51:17 PM
Pues a razón de lo que comenta Drumpi, creo que tiene toda la razón con lo de tener "cuidado" en como usarlos.

Al final en mi código lo he solventado, intentando dejar de antemano el tamaño de casi todos los arrays que si se que van a tener un tamaño fijo mientras que para hacer splits si uso arrays dinámicos, aunque por lo que he leido no es del todo aconsejable
Title: Re:Comprobar si un array tiene valores antes de utilizarlo.
Post by: warrior_rockk on May 14, 2018, 12:49:09 PM
No sé si no se lee mi mensaje, pero decía que en Bennu funciona el NULL. Al final, un array dinámico vacío es aquel que no apunta a nada. Asi lo tengo yo hecho y funCionando en listas enlazadas...
Title: Re:Comprobar si un array tiene valores antes de utilizarlo.
Post by: KeiDash on May 16, 2018, 03:19:12 PM
Quote from: warrior_rockk on May 14, 2018, 12:49:09 PM
No sé si no se lee mi mensaje, pero decía que en Bennu funciona el NULL. Al final, un array dinámico vacío es aquel que no apunta a nada. Asi lo tengo yo hecho y funCionando en listas enlazadas...

Ah pues no había visto el mensaje, pero muchas gracias por tu respuesta, probaré a comparar con NULL a ver que tal.

Gracias y disculpa el despiste warrior
Title: Re:Comprobar si un array tiene valores antes de utilizarlo.
Post by: JaViS on May 16, 2018, 05:16:25 PM
En Anarkade también usamos listas dinamicas: https://bitbucket.org/pixelatom/bennu_framework/src/master/library/lists.inc


Podes fijarte como hacemos en ese archivo, puede estar desactualizado asi que agarralo con pinzas, pero sirve de inspiracion