Autor Tema: Comprobar si un array tiene valores antes de utilizarlo.  (Leído 517 veces)

KeiDash

  • Jr. Member
  • **
  • Mensajes: 77
  • Karma: 3
  • https://twitter.com/AMelianRGD
    • Mi Web
Comprobar si un array tiene valores antes de utilizarlo.
« en: Abril 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:

Código: [Seleccionar]
   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

  • Global Moderator
  • *****
  • Mensajes: 1236
  • Karma: 26
    • Anarkade
Re:Comprobar si un array tiene valores antes de utilizarlo.
« Respuesta #1 en: Abril 24, 2018, 06:02:18 pm »
Estas preguntando como saber si cierto indice existe?
Working on Anarkade. A couch multiplayer 2D shooter.

KeiDash

  • Jr. Member
  • **
  • Mensajes: 77
  • Karma: 3
  • https://twitter.com/AMelianRGD
    • Mi Web
Re:Comprobar si un array tiene valores antes de utilizarlo.
« Respuesta #2 en: Abril 24, 2018, 10:15:52 pm »
Estas preguntando como saber si cierto indice existe?

Mmm si, en cierta manera si.

JaViS

  • Global Moderator
  • *****
  • Mensajes: 1236
  • Karma: 26
    • Anarkade
Re:Comprobar si un array tiene valores antes de utilizarlo.
« Respuesta #3 en: Abril 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


Código: [Seleccionar]
sizeof(objTest) / sizeof(_myObject)
« última modificación: Abril 24, 2018, 10:37:34 pm por JaViS »
Working on Anarkade. A couch multiplayer 2D shooter.

KeiDash

  • Jr. Member
  • **
  • Mensajes: 77
  • Karma: 3
  • https://twitter.com/AMelianRGD
    • Mi Web
Re:Comprobar si un array tiene valores antes de utilizarlo.
« Respuesta #4 en: Abril 25, 2018, 12:08:50 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


Código: [Seleccionar]
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.

Código: [Seleccionar]
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

  • Full Member
  • ***
  • Mensajes: 239
  • Karma: 11
Re:Comprobar si un array tiene valores antes de utilizarlo.
« Respuesta #5 en: Abril 25, 2018, 06:13:22 pm »
En Bennu funciona el NULL. Yo comparo el array dinamico con NULL para comprobar si está vacía...

JaViS

  • Global Moderator
  • *****
  • Mensajes: 1236
  • Karma: 26
    • Anarkade
Re:Comprobar si un array tiene valores antes de utilizarlo.
« Respuesta #6 en: Abril 25, 2018, 07:24:50 pm »
Probaste con un * frente al puntero?


Código: [Seleccionar]
say(sizeof(*BTTrackCollection)/sizeof(BTTrack));
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12749
  • Karma: 375
Re:Comprobar si un array tiene valores antes de utilizarlo.
« Respuesta #7 en: Abril 26, 2018, 12:16:43 pm »
no, de allocs no puedes usar sizeof...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

  • Global Moderator
  • *****
  • Mensajes: 1236
  • Karma: 26
    • Anarkade
Re:Comprobar si un array tiene valores antes de utilizarlo.
« Respuesta #8 en: Abril 26, 2018, 01:43:42 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

  • Hero Member
  • *****
  • Mensajes: 6269
  • Karma: 159
  • Odio el periodo "entre proyectos"
    • La web de Drumpi
Re:Comprobar si un array tiene valores antes de utilizarlo.
« Respuesta #9 en: Mayo 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...).
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

  • Jr. Member
  • **
  • Mensajes: 77
  • Karma: 3
  • https://twitter.com/AMelianRGD
    • Mi Web
Re:Comprobar si un array tiene valores antes de utilizarlo.
« Respuesta #10 en: Mayo 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

warrior_rockk

  • Full Member
  • ***
  • Mensajes: 239
  • Karma: 11
Re:Comprobar si un array tiene valores antes de utilizarlo.
« Respuesta #11 en: Mayo 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...

KeiDash

  • Jr. Member
  • **
  • Mensajes: 77
  • Karma: 3
  • https://twitter.com/AMelianRGD
    • Mi Web
Re:Comprobar si un array tiene valores antes de utilizarlo.
« Respuesta #12 en: Mayo 16, 2018, 03:19:12 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

  • Global Moderator
  • *****
  • Mensajes: 1236
  • Karma: 26
    • Anarkade
Re:Comprobar si un array tiene valores antes de utilizarlo.
« Respuesta #13 en: Mayo 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
Working on Anarkade. A couch multiplayer 2D shooter.