PureBasic

Forums PureBasic
Nous sommes le Mar 17/Sep/2019 17:35

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 11 messages ] 
Auteur Message
 Sujet du message: incohérence entre ArraySize () et ListSize ()
MessagePosté: Mer 01/Aoû/2018 6:11 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 25/Aoû/2005 22:59
Messages: 445
Localisation: 974
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:
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

_________________
Quelques manoucheries : I can't give you anything but love / Stompin' at decca


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: incohérence entre ArraySize () et ListSize ()
MessagePosté: Mer 01/Aoû/2018 7:01 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2172
Localisation: 50200 Coutances
Bonjour bombseb,

en fait ce n'est pas compliqué, tu l'as d'ailleurs mis dans ton exemple :
Code:
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:
; == 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 GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: incohérence entre ArraySize () et ListSize ()
MessagePosté: Mer 01/Aoû/2018 8:07 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 25/Aoû/2005 22:59
Messages: 445
Localisation: 974
Salut et merci pour ta réponse :D

Citation:
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

_________________
Quelques manoucheries : I can't give you anything but love / Stompin' at decca


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: incohérence entre ArraySize () et ListSize ()
MessagePosté: Mer 01/Aoû/2018 9:27 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1595
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.

_________________
Windows 10 Famille x64 + Linux (Slackware, Debian sur Oracle VirtualBox 6.0)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: incohérence entre ArraySize () et ListSize ()
MessagePosté: Mer 01/Aoû/2018 9:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6650
Localisation: Isere
Pas tout à fait mon bon Marc :wink:
Si on veux ....les mouches :mrgreen:
Code:
Dim a$(10) = 11 éléments

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: incohérence entre ArraySize () et ListSize ()
MessagePosté: Mer 01/Aoû/2018 9:41 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 24/Aoû/2005 10:42
Messages: 466
Kwai chang caine a écrit:
Pas tout à fait mon bon Marc :wink:
Si on veux ....les mouches :mrgreen:
Code:
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 13" Retina / SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone X 256 Go


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: incohérence entre ArraySize () et ListSize ()
MessagePosté: Mer 01/Aoû/2018 11:43 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 25/Aoû/2005 22:59
Messages: 445
Localisation: 974
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 ?

_________________
Quelques manoucheries : I can't give you anything but love / Stompin' at decca


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: incohérence entre ArraySize () et ListSize ()
MessagePosté: Mer 01/Aoû/2018 12:48 
Hors ligne

Inscription: Jeu 07/Juin/2007 22:54
Messages: 261
Citation:
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:
Dim a(3)
a(0) = 5
a(3) = 2048
Debug ArraySize (a())
Debug a(0)
Debug a(3)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: incohérence entre ArraySize () et ListSize ()
MessagePosté: Jeu 02/Aoû/2018 9:49 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 25/Aoû/2005 22:59
Messages: 445
Localisation: 974
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)...

_________________
Quelques manoucheries : I can't give you anything but love / Stompin' at decca


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: incohérence entre ArraySize () et ListSize ()
MessagePosté: Jeu 02/Aoû/2018 10:42 
Hors ligne

Inscription: Jeu 07/Juin/2007 22:54
Messages: 261
Si je comprend bien ce qui te gène c'est d'un coté l'aide de dim qui te dit
Citation:
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:
  Dim MyArray.l(10)
  Debug ArraySize(MyArray()) ; will print '10'


Mais si tu lis bien la description de arraysize ça te dit :
Citation:
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:
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.

Citation:
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".


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: incohérence entre ArraySize () et ListSize ()
MessagePosté: Ven 03/Aoû/2018 19:49 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 14/Oct/2004 19:48
Messages: 1121
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 : 5.45LTS - 32 bits


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 11 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye