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! :D

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
8O 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 :lol: )

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 :lol: )
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 :lol:

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/