Comprobar si un array tiene valores antes de utilizarlo.

Started by KeiDash, April 24, 2018, 12:50:19 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

KeiDash

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



JaViS

Estas preguntando como saber si cierto indice existe?
Working on Anarkade. A couch multiplayer 2D shooter.

KeiDash


JaViS

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)
Working on Anarkade. A couch multiplayer 2D shooter.

KeiDash

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

warrior_rockk

En Bennu funciona el NULL. Yo comparo el array dinamico con NULL para comprobar si está vacía...

JaViS

Probaste con un * frente al puntero?


say(sizeof(*BTTrackCollection)/sizeof(BTTrack));
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

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

JaViS

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.
Working on Anarkade. A couch multiplayer 2D shooter.

Drumpi

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...).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

KeiDash

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

warrior_rockk

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

KeiDash

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

JaViS

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
Working on Anarkade. A couch multiplayer 2D shooter.