Page 1 sur 1
Un tableau dans une structure ?
Publié : ven. 27/juin/2008 0:42
par Octavius
Ca m'arrangerait bien de pouvoir créer qqch qui ressemblerait à ça :
Code : Tout sélectionner
Structure param
Name$
Number.l
Dim Table.b(10)
EndStructure
NewList List.param()
AddElement(List())
List()\Name$="UnNom"
List()\Number=299792458
List()\Table(0)=9
...
List()\Table(4)=28
...
List()\Table(9)=3
AddElement(List())
etc.
Mais ça ne marche pas... :/
Auriez-vous une astuce pour pouvoir contourner cette impossibilité ?
PS: Dans le même genre, est-ce possible ou y a-t-il une astuce pour mettre en liste chaînée dans une structure ?
Publié : ven. 27/juin/2008 1:33
par Ollivier
Oui, il y a une petite astuce. Seulement, ce type de tableau est statique. C'est-à-dire qu'il ne peut pas changer de taille une fois qu'il est créé.
Aussi, il y a une petite différence de chiffrage par rapport à un tableau classique
Code : Tout sélectionner
Dim X.L(10) ; 11 variables indexées de 0 à 10
Structure MASTRUCTURE
X.L[10] ; 10 variables indexées de 0 à 9
EndStructure
Pour ton code,
Code : Tout sélectionner
Structure param
Name$
Number.l
Table.b[10]
EndStructure
NewList List.param()
AddElement(List())
List()\Name$="UnNom"
List()\Number=299792458
List()\Table[0]=9
List()\Table[4]=28
List()\Table[9]=3
AddElement(List())
Pour la liste chaînée, il n'y a pas d'équivalent aussi simple (une structure reste statique alors qu'une liste chaînée subit de fréquents changements de taille à cause des ajouts et suppressions)
Publié : ven. 27/juin/2008 1:45
par Octavius
Ah merci beaucoup!
Mais comment ça se fait qu'ils n'en parlent pas dans l'aide de PB ? Ou alors j'ai raté la section où c'est mentionné ?
Publié : ven. 27/juin/2008 3:28
par Ollivier
Ne t'inquiète pas. J'arrive même plus à la retrouver non plus !
Publié : ven. 27/juin/2008 6:02
par comtois
à la page Structure non ?
Note : Un tableau statique dans une structure ne se comporte pas de la même façon qu'un tableau défini avec la commande Dim. Ceci pour être conforme au format de structures en C/C++ (pour permettre un portage direct des structures de l'API). Ce qui signifie que a[2] assignera un tableau de 0 à 1 (deux éléments) alors que Dim a(2) assignera un tableau de 0 à 2 (trois éléments).
http://purebasic.developpez.com/documen ... tures.html
Publié : ven. 27/juin/2008 6:50
par Ollivier

Tout bêtement...
Publié : ven. 27/juin/2008 14:35
par Octavius
Tiens, bah puisqu'on en est dans les Structures, est-ce que vous sauriez m'expliquer à quoi peut bien servir StructureUnion ? Je ne comprends pas la doc. (qui parle d'un équivalent 'union' en C/C++, langage que je ne connais pas)
Publié : ven. 27/juin/2008 15:16
par Backup
Octavius a écrit :Tiens, bah puisqu'on en est dans les Structures, est-ce que vous sauriez m'expliquer à quoi peut bien servir StructureUnion ? Je ne comprends pas la doc. (qui parle d'un équivalent 'union' en C/C++, langage que je ne connais pas)
voila ce que j'en ai compris !!
lire les commentaires dans le code
Code : Tout sélectionner
Structure Type
Name$
StructureUnion
Long.l ; Chaque champ (Long, Float et String) est placé à la
Float.f ; meme adresse mémoire.
String.s ; UN SEUL ESPACE MEMOIRE POUR CES 3 CHAMPs
EndStructureUnion
EndStructure
; ce qui fait que
type.Type\Long.l =1
type.Type\Float.f =1 ; la on viens d'écraser ce qu'on avait attribué a \Long.l
; la preuve
Debug type.Type\Float.f ; c'est bon puisque c'est la dernière valeur entrée
Debug type.Type\Long.l ; ça affiche n'importe quoi parceque la valeur n'existe plus !! :)
les champs
Long.l ; Float.f ; String.s sont considéré comme
un seul Champ !!! d'un point de vue Emplacement Memoire
ce qui economise de la memoire (mais on s'en fou de nos jours

)
Publié : ven. 27/juin/2008 15:21
par Octavius
Dobro a écrit :ce qui economise de la memoire (mais on s'en fou de nos jours

)
Oh ça dépend! Moi j'aime bien avoir un code bien propre et bien optimisé.
Merci en tout cas, je crois que j'ai compris à peu près comment fonctionnait StructureUnion.
Publié : ven. 27/juin/2008 16:47
par Backup
@Comtois :
ce serai peut etre plus clair d'ajouter ceci dans la Doc
voici ce qu'est une StructureUnion :
c'est le regroupement L'UNION de plusieurs Champs a la meme adresse memoire
de façon a précisé , l'info qui manque

Publié : ven. 27/juin/2008 18:15
par comtois
la doc le dit déjà
StructureUnion est prévu pour les programmeurs avancés qui souhaitent économiser de la mémoire en partageant certains champs à l'intérieur d'une même structure.
par programmeur avancé il faut comprendre programmeur qui sait de quoi on parle sans que la doc s'étende en long et en large sur le sujet
mais bon , économiser de la mémoire en partageant certains champs , tout est dit non ?
Publié : ven. 27/juin/2008 18:22
par Backup
comtois a écrit :l
mais bon , économiser de la mémoire en partageant certains champs , tout est dit non ?
ben pour etre franc je ne l'ai pas compris !!!
il m'a fallu faires des tests pour savoir ce que ça voulais dire
"
économiser de la mémoire en partageant certains champs" c'est pas clair !!
on peut croire que chaques champs est partagé ... ??
partagé avec quoi ??
et que ce partage economise de la memoire !!
ha ? bon ? et comment ça fais ça ??
alors que
"
c'est le regroupement L'UNION de plusieurs Champs a la meme adresse mémoire, ce qui permet d'économiser celle-ci"
c'est Beaucoup plus clair, car meme si l'on ne maitrise pas les structures, cela apporte clairement la signifiquation de l'union !!
en fait l'actuel explication , est donné a l'envers (comme les anglais parlent) , on crois qu'il s'agit de partager des champs ..
alors que ma phrase explique que c'est un espace memoire que ces champs se partagent ... Nuance de taille

Publié : ven. 27/juin/2008 18:31
par comtois
j'ajouterai peut-être à l'occasion que l'adresse mémoire est identique pour tous les champs dans une StructureUnion ?
Publié : ven. 27/juin/2008 18:34
par Backup
comtois a écrit :j'ajouterai peut-être à l'occasion que l'adresse mémoire est identique pour tous les champs dans une StructureUnion ?
ha bah oui , cela éclaircira bien ...

Merci

Publié : ven. 27/juin/2008 22:48
par Anonyme
Pour en revenir au sujet initial , tu as la lib vector ( similaire au standard c ) qui te permet de faire cela , c'est Lionel_OM le créateur de cette lib , a voir sur son site
http://basicunivers.free.fr/