incohérence entre ArraySize () et ListSize ()

Sujets variés concernant le développement en PureBasic
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

incohérence entre ArraySize () et ListSize ()

Message par bombseb »

Salut les zamis,

Je constate que la fonction ListSize () renvoie la taille d'une liste (le nombre d'éléments contenus dans cette liste),
alors que ArraySize () ne renvoie pas le nombre d'éléments contenus dans un tableau mais plutôt la valeur du dernier index.

Code : Tout sélectionner

NewList l()
Debug (ListSize (l ()))

Dim a(0)
a(0) = 5
Debug (ArraySize (a()))
Debug (a(0))
Dans l'aide de ArraySize il est pourtant précisé : "Renvoie la taille d'un tableau", puis juste en dessous : "Renvoie la taille de la dimension du tableau telle qu'elle a été spécifiée lors de sa déclaration avec Dim ou ReDim"
En fait en faisant un Dim on ne précise pas la taille du tableau mais plutôt la valeur du dernier index...Et du coup comment fait t-on pour déclarer un tableau vide (sans éléments) ?

Je trouve tout ca pas très cohérent, et plutôt déstabilisant et source de bugs... ou alors j'ai pas compris la logique
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: incohérence entre ArraySize () et ListSize ()

Message par Micoute »

Bonjour bombseb,

en fait ce n'est pas compliqué, tu l'as d'ailleurs mis dans ton exemple :

Code : Tout sélectionner

Dim a(0)
a(0) = 5
Debug ArraySize(a())
c'est aussi simple que ça, et si tu veux ajouter des éléments, il suffit de faire ReDim a(dimension)


J'utilise personnellement une Macro qui fait tout le travail:

Code : Tout sélectionner

; == Macro Réutilisable
Macro CreerTableau (_tableau_, _contenu_, _dimensions_=1)
  ReplaceString(_contenu_, "'", #DQUOTE$, #PB_String_InPlace)
  Define.i mon_Tableau_J = ParseJSON(#PB_Any, _contenu_)
  If mon_Tableau_J
    CompilerIf _dimensions_ = 1
      Dim _tableau_(0)
    CompilerElseIf _dimensions_ = 2
      Dim _tableau_(0, 0)
      ; Si nécessaire, ajoutez du code pour plus de dimensions ici.
    CompilerEndIf
    ExtractJSONArray(JSONValue(mon_Tableau_J), _tableau_())
    FreeJSON(mon_Tableau_J)
  EndIf
EndMacro


; == Démo
EnableExplicit
Define i.i, k.i, temp$

CreerTableau(s$, "['chien', 'chat', 'souris']")

For i = 0 To ArraySize(s$())
  Debug s$(i)
Next

Debug "-----"

CreerTableau(x.d, "[1.5, 3.4, 5.3, 7.2, 9.1]")

For i = 0 To ArraySize(x())
  Debug StrD(x(i), 1)
Next

Debug "-----"

CreerTableau(a.i, "[[1, 3, 5], [7, 8, 9]]", 2)

For i = 0 To ArraySize(a(), 1)
  temp$ = ""
  For k = 0 To ArraySize(a(), 2)
    temp$ + ", " + a(i, k)
  Next
  Debug "[" + Mid(temp$, 3) + "]"
Next
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: incohérence entre ArraySize () et ListSize ()

Message par bombseb »

Salut et merci pour ta réponse :D
en fait ce n'est pas compliqué, tu l'as d'ailleurs mis dans ton exemple :
Oui maintenant j'ai pigé comment ca marche mais le but de mon message c'était plutôt de mettre en lumière cette incohérence :

ListSize () -> Renvoie le nombre d'élément d'une liste
ArraySize () -> Renvoie la valeur du dernier index d'un tableau contrairement à ce que dit l'aide
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: incohérence entre ArraySize () et ListSize ()

Message par Marc56 »

bombseb a écrit : ArraySize () -> Renvoie la valeur du dernier index d'un tableau contrairement à ce que dit l'aide
C'est aussi le nombre d'éléments du tableau, et ce nombre d'éléments ne change que par Dim ou ReDim.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: incohérence entre ArraySize () et ListSize ()

Message par Kwai chang caine »

Pas tout à fait mon bon Marc :wink:
Si on veux ....les mouches :mrgreen:

Code : Tout sélectionner

Dim a$(10) = 11 éléments
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Mindphazer
Messages : 635
Inscription : mer. 24/août/2005 10:42

Re: incohérence entre ArraySize () et ListSize ()

Message par Mindphazer »

Kwai chang caine a écrit :Pas tout à fait mon bon Marc :wink:
Si on veux ....les mouches :mrgreen:

Code : Tout sélectionner

Dim a$(10) = 11 éléments
Et oui, si tu commences ta numérotation à 0, de 0 à 10 ça fait bien 11 éléments
Bureau : Win10 64bits
Maison : Macbook Pro M1 14" SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: incohérence entre ArraySize () et ListSize ()

Message par bombseb »

Du coup je trouve que sur ce point précis, l'aide est un peu trompeuse...

Et ca m'amène à ma question : Comment fait t-on pour déclarer un tableau avec zéro éléments ?
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: incohérence entre ArraySize () et ListSize ()

Message par boby »

Du coup je trouve que sur ce point précis, l'aide est un peu trompeuse...

Et ca m'amène à ma question : Comment fait t-on pour déclarer un tableau avec zéro éléments ?
C'est pas la doc qui est trompeuse, c'est que tu n'as pas compris le concepte d'un tableau.

Un tableau n'est pas une liste d'élément... Ca c'est le boulot d'une liste chainé.
Un tableau c'est un adresse mémoire d'une taille défini (à sa création), son but est d'être plus rapide qu'une liste chainé car tableau(5) (par exemple) te renvéras l'@ mémoire correspondant à la 5éme "ligne" de ton tableau.
Une liste chainé s'attribu la mémoire élément après élément (via la fonction addelement). Cet @ mémoire contiens les informations que tu lui as enregistré et l'@ mémoire de son prochain élément.

Pour reprendre ton premier poste ArraySize te renvoi bel est bien la taille de ton tableau, comme précisé sur la doc, de la dimension précisée.
Peut être que tu comprendra mieux avec ça :

Code : Tout sélectionner

Dim a(3)
a(0) = 5
a(3) = 2048
Debug ArraySize (a())
Debug a(0)
Debug a(3)
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: incohérence entre ArraySize () et ListSize ()

Message par bombseb »

Oui je comprend bien l'adresse entre les deux, mais justement dans ton exemple, ArraySize (a()) me renvoie 3
Pour moi la taille du tableau c'est 4 (4 éléments)...
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: incohérence entre ArraySize () et ListSize ()

Message par boby »

Si je comprend bien ce qui te gène c'est d'un coté l'aide de dim qui te dit
For example when you define Dim(10) the array will have 11 elements, elements 0 to 10.
et l'aide de arraysize qui te dit

Code : Tout sélectionner

  Dim MyArray.l(10)
  Debug ArraySize(MyArray()) ; will print '10'
Mais si tu lis bien la description de arraysize ça te dit :
Returns the size of the array, as specified with Dim or ReDim.
Renvoie la TAILLE du tableau COMME spécifié avec Dim ou ReDim et non pas le nombre d'éléments.

Donc

Code : Tout sélectionner

Dim a(3)
Debug ArraySize (a())
Tu obtiens bien 3 COMME spécifié avec Dim. J'insiste, je ne voie pas d'incohérence dans la doc.
Et ca m'amène à ma question : Comment fait t-on pour déclarer un tableau avec zéro éléments ?
A quoi te servirais un AllocateMemory(0) ?? Aussi "utile" que déclarer un tableau à 0 éléments, Aussi utile que si tu déclarais une variable... pour un espace mémoire nul.
Ça n'a juste aucun intérêt, si tu déclare une adresse mémoire, c'est pour t’attribuer de la place dans la RAM, pas pour demander une adresse mémoire et finalement dire "Non non c'est bon, je ne veux pas d'espace à moi, je voulais juste une adresse".
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: incohérence entre ArraySize () et ListSize ()

Message par Fig »

BombSeb a néanmoins compris de quoi il en retournait.
C'est le "size" similaire de ArraySize et ListSize qui sème la confusion puisqu'il ne s'agit pas de la même chose, dans un cas le nombre d'élement, dans l'autre l'index maximum du tableau.

Pour harmoniser les choses il serait effectivement pertinent/possible de renvoyer le nombre d'élements du tableau et non son index maximum. Pourquoi pas...

Ceci étant dit, définir un tableau avec zéro élément n'a de sens que dans un langage orienté objet. Dans le cas de Pb, comme cela a été dit plus haut, un tableau est une zone mémoire allouée, il lui faut au moins un élément correspondant à l'adresse de base du tableau.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Répondre