Page 1 sur 2

Petit cadeau pour Dobro!

Publié : mer. 02/juin/2004 16:13
par Chris
Histoire de lui faire abandonner la programmation "à l'ancienne" :lol:

Code : Tout sélectionner

;-=============== Petit cadeau pour DOBRO ===============
;-.......................................................
;-==== Comparaison entre Tableaux et Listes chainées ====
;-=======================================================
;
;
;- Première partie : Tableau
;
;- Dans la première partie, on va dimensionner un tableau simple 
;- pouvant contenir 100 valeurs.
;- On va ensuite redimensionner ce tableau pour pouvoir lui faire
;- accepter 200 valeurs, ce qui va nous obliger à créer un second 
;- tableau pour sauvegarder les données du premier, puis à retransférer
;- les données dans le premier tableau, une fois redimensionné.
;
Dim MonTableau.w(99)          ; 0 étant une valeur, de 0 à 99 = 100 valeurs
For i = 0 To 99               ; On va ensuite rentrer une valeur dans chaque
  a.w = Random(300)+100       ; case du tableau.
  MonTableau(i)= a            ;
Next                          ;
;
;- Un petit coup de debug pour voir si ça a fonctionné
;- Une fois ce test fait, le mettre en commentaire et décommenter le suivant
For i = 0 To 99
  Debug MonTableau(i)
Next
;
;- On redimensionne ensuite le tableau, et on reteste.
;- Une fois ce test fait, le mettre en commentaire
; Dim MonTableau.w(199)
; For i = 0 To 199
;   Debug MonTableau(i)
; Next
;- Les données son perdues : Bien fait.
;-
;-Il faut donc faire une sauvegarde du tableau pour pouvoir le redimensionner.
;- On crée donc un second tableau, et on fait le transfert, puis un coup de debug.
;- Décommenter cette partie
;
; Dim MaSauvegarde.w(99)            ;/ Ne plus commenter cette partie
; For i = 0 To 99                   ;/
;   MaSauvegarde(i) = MonTableau(i) ;/
; Next                              ;/
;
; For i = 0 To 99
;   Debug MonTableau(i)
;   Debug MaSauvegarde(i)
;   Debug""
; Next
;
;- Ca fonctionne, mettre le test au dessus,(et seulement lui), en commentaire, et on continue.
;- On peut donc, maintenant, redimensionner le tableau, et lui renvoyer
;- les données sauvegardées.
;- Décommenter les dernières lignes de la partie TABLEAU
; Dim MonTableau.w(199)
; 
; For i = 0 To 99                     ; Rien n'empèche de mettre 199 ici, le tableau
;   MonTableau(i) = MaSauvegarde(i)   ; sera rempli de 0 à partir de 100
; Next
;
;- Comme d'hab, un petit coup de debugger
; For i = 0 To 99           
;   Debug MonTableau(i)
; Next
;
;- ===== Fin de la partie TABLEAU =====
;- Le tableau a maintenant 200 valeurs possibles, les 100 premières sont
;- sauvegardées
;
;/
;- Seconde partie : Listes chainées (LinkedList)
;
;- Dans la seconde partie, on va créer une liste chainée, et on va lui faire
;- avaler un certain nombre de valeurs. (Ca bouffe tout ce qu'on lui donne, ces bêtes là)
;- Mettre tout ce qui est au dessus en commentaire, et décommenter tout ce qui suit
;
;- On crée la liste
; NewList MaListe.w()
; 
; ;- On lui donne 100 valeurs
; For i = 0 To 99
;   AddElement(MaListe())
;   a = Random(300)+100
;   MaListe() = a
; Next
; ;
; ;-un petit coup de debug pour tester
; ForEach MaListe()
;   Debug MaListe()
; Next
; ;
;- C'est tout. Si on veut mettre plus d'éléments, il suffit de les ajouter.
;- Par exemple, on peut mettre 1000 à la place de 99, ça fonctionne pareil
Avec ça, tu verras l'avantage qu'il y à utiliser les listes plutôt que les tableaux.

"A l'ancienne", c'est bon pour la moutarde ou pour les saucisses, pas pour PureBasic :lol:

Chris :)

Re: Petit cadeau pour Dobro!

Publié : mer. 02/juin/2004 16:31
par Anonyme2
Chris a écrit : "A l'ancienne", c'est bon pour la moutarde ou pour les saucisses, pas pour PureBasic :lol:

:mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

Publié : jeu. 03/juin/2004 0:17
par Backup
Merci pour l'exemple !! :D
Mais j'aime bien les tableau moi !!

Mais pour te montrer que je suis pas obtu,je vien de faire un petit exemple
qui utilise les listes chainée !!

donc tu vois tu m'a converti , je m'y interresse enfin !!

:D
je poste mon exemple dans un nouveau TOPIC

qui est dans la rubrique Jeux et que je nomme (jeune homme)

"CREATEUR DE CHEMIN"

Publié : jeu. 03/juin/2004 9:53
par Crystal Noir
oui les listes chainées sont plus optimisées dans certains cas que les tableaux.

Prenons un exemple tout bête : un invader. Le joueur doit tirer on est d'accord. Sauf que les tirs devront être tous gérés en même temps à l'écran (déplacement, destructions, collisions...). Donc effectivement une des solutions est de faire un tableau. Cependant le tableau aura une dimension limitée. Le pb si le nb de tirs qu'il y a dépasse les dimensions du tableau, c un plantage à la clé. Donc on serait obligé de faire un immense tableau qui prend des ressources énormes.

Heureusement il existe les listes chainées ! dynamique et facile à utiliser on peut gérer une liste de sprite indéfiniement, vive les listes chainées !

Publié : jeu. 03/juin/2004 10:21
par Backup
en fait si j'ai bien compris c'est comparable a une bande magnetique sans fin
(sauf la ram)
un peut comme un fichier sequentiel sur disque dur ??? !! :o

Publié : jeu. 03/juin/2004 16:45
par Crystal Noir
La liste chaînée comme son nom l'indique est une liste (comme une liste d'objet sur un papier).

La différence entre les tableaux est notable : c'est dynamique. Cela veut dire que tu peux ajouter des éléments à ta liste, en enlever les modifier, tout cela dynamiquement et quand tu veux.

Dans le cas d'un tableau si par exemple, tu veux ajouter des cases à ton tableau (et donc le redimensionner) toutes les données jusque là stockées seront perdus (on peut pas redimensionner un tableau déclaré sans perdre les données qu'il contient).

Maintenant si je reprends mon exemple de l'invader. Combien de tir le joueur va faire ? tu le sais pas. Donc avec un tableau tu vas créer un tableau de 10 000 cases au moins histoire d'être tranquille et que le jeu plante pas parce qu'il y a plus que tu n'as prévu. Le pb c'est que ce tableau enorme va prendre des ressources pour rien (et si le joueur ne tire que 100 fois ?).

Avec la liste tu peux avoir 2 tirs comme 10 000 tirs, la liste s'agrandira AU BESOIN et donc ne prendra pas autant de ressources qu'un tableau prédéfini.

Je compte faire un tutoriel sur les linked list (liste chainée), disponible bientôt dans la zone Débutant.

Publié : jeu. 03/juin/2004 16:53
par cederavic
le principe des liste chainée est simple, tu as un pointeur qui contient sa valeur, un pointeur ver l'element precedant et un pointeur vers l'element suivant (qui eux meme on une valeur, un pointeur sur l'element precedant etc..) d'ou le nom : liste chainée, ça forme un chaine

Publié : jeu. 03/juin/2004 16:58
par Crystal Noir
Et je dirai meme plus monsieur dupont :

En fait tu crées une liste. Tu ajoutes des éléments dans cette liste. Ensuite tu initialises ta liste au premier objet. (bah oui hein tu lis pas ta liste de course en partant du bas lol). Et ensuite tu dis que pour chaque élément faut faire telle action. Sachant que les instructions purebasic comme le dit Cédéravic te permettent de passer d'un élement à l'autre, au précédent, au suivant etc...

Comme je l'ai dit je vais rapidement donner un exemple facile comme j'ai fait avec les tableaux. tu vas voir tu vas vite comprendre :p

Publié : jeu. 03/juin/2004 18:37
par Backup
j'ai compris car j'ai poste ce matin un topic "chemin de sprite dans la rubrique jeux ou j'utilise les listes !!
Mais merci pour les precisions !!

si vous etes aussi clair faudra par contre m'expliquer les STRUCTURES !!!
parceque je comprend vite mais la va faloir y mettre un coup !!
j'y comprend que dalle !!
j'ai un ancien numero de "CODER" qui expliquai un peut
mais j'ai pas tous suivi !!
si quelqu'un pouvais faire un TUTO pour les Bourrains comme moi
ça serai bien !!! :) mais , la vraiment allez y doucement !! :D
Je sais qu'en plus c'est tres tres puissant comme truc les structures !
ya deja eu des gens pour en parler , mais j'ai rien pigé !!
(je vous jure que le "picking" en guitare est bien plus simple a comprendre)

:lol:

Publié : jeu. 03/juin/2004 18:58
par Chris
Une structure, c'est ni plus, ni moins qu'une liste de variables qui peuvent être de différents types.

Code : Tout sélectionner

Structure RESULTAT 
  octet.b 
  Mot.w 
  Mot_Long.l 
  Chaine.s 
EndStructure 

Info.RESULTAT
Info.RESULTAT : retourne l'adresse de la structure RESULTAT dans Info

Info\Octet = 2 : Tu donnes la valeur de 2 a la variable octet, en appelant la structure grace à son adresse contenue dans Info

Nombre = Info\Octet : Tu récupères la valeur contenue dans la variable Octet, en appelant la structure grace à son adresse contenue dans Info

C'est comme si tu appelais des variables.

Chris :)

Publié : jeu. 03/juin/2004 22:06
par Backup
oui jusque la ça va

et le "info" c'est arbitraire n'est-ce pas ?
t'aurai pu lui donner n'importe quel nom ?
est-ce le point entre les deux qui sert d'affectation ?

et les structures peuvent t'elle renfermer des listes ou d'autre structures ?? :)

en fait si j'ai compris le terme "resultat"dans ton exemple n'est employé que pour la creation de la structure !
on l'affecte a une variable dans ce cas "info" et dorenavant on utilise que "info" on oublie "Resultat" ok ?? :?

Publié : jeu. 03/juin/2004 22:38
par Chris
et le "info" c'est arbitraire n'est-ce pas ?
t'aurai pu lui donner n'importe quel nom ?
Le Info, oui, c'est arbitraire.
C'est une variable, rien d'autre, tu lui donne le nom que tu veux. Elle sert uniquement à récupérer l'adresse de la structure.
et les structures peuvent t'elle renfermer des listes ou d'autre structures ??
Des liste, je ne pense pas, des structures, il y a StructureUnion, mais je ne sais pas à quoi ça correspond.
Par contre, tu peux avoir une variable qui est liée à une autre structure.

Code : Tout sélectionner

Structure RESULTAT 
  octet.b 
  Mot.w 
  Mot_Long.l 
  Chaine.s 
  Valeur.AUTRESTRUCTURE <-- Variable liée à une autre structure
EndStructure 

Info.RESULTAT 
en fait si j'ai compris le terme "resultat"dans ton exemple n'est employé que pour la creation de la structure !
on l'affecte a une variable dans ce cas "info" et dorenavant on utilise que "info" on oublie "Resultat" ok


Oui, RESULTAT, est le nom de la structure. Quand tu lui a affecté ta variable, tu n'as plus à l'utiliser

Chris :)

Publié : jeu. 03/juin/2004 22:54
par ZapMan
et le "info" c'est arbitraire n'est-ce pas ?
t'aurai pu lui donner n'importe quel nom ?

Tout juste ! Info, c'est le nom de la variable. Tu peux créer autant de variables que tu veux en les déclarant du type "Resultat". C'est exactement comme quand tu fais :
a.l ; variable de type entier long
b.f ; variable de type flotant (nombre à virgule)
est-ce le point entre les deux qui sert d'affectation ?

Oui, sauf que dans ce cas, on utilise pas le terme "affectation" mais "typage". L'affectation, c'est quand tu affecte (donne) une valeur à une variable (a=1). Le typage c'est quand tu décide de quelle sorte de variable il s'agit. (cela dit, on dit parfois "affectation de type" plutôt que "typage").
et les structures peuvent t'elle renfermer des listes ou d'autre structures ??
Oui, comme dit plus haut, une structure est une liste de variables. Chacune de ces variables peut avoir un type différent, y compris un type structure.
en fait si j'ai compris le terme "resultat"dans ton exemple n'est employé que pour la creation de la structure !
on l'affecte a une variable dans ce cas "info" et dorenavant on utilise que "info" on oublie "Resultat" ok ??
C'est ça ! Comme on peut avoir besoin de créer différentes sortes de structures, il faut bien pouvoir leur donner un nom pour pouvoir les utiliser à tour de rôle :
a.struct1
b.struct2
Ensuite, tu utilise a et b comme tu veux.

En fait, tu vois, tu avais tout compris. Le seul point dont tu ne parles pas, c'est comment utiliser ensuite ces variables. Petit exemple ?

Code : Tout sélectionner

;Création d'une structure :
Structure Struct1
  e1.l
  e2.l
EndStructure
;
; Typage d'une variable et affectation (les deux en même temps)
var.Struct1\e1 = 1 ; on aurait pu faire "var.Struct1" et à la ligne var\e1 = 1
; on complète l'affectation
var\e2 = 2 ; pas la peine de refaire var.Struct1\e2 = 2, le type de var
                ; a déjà été déclaré, maintenant, PurePasic sait que var est de type Struct1

debug var\e1 ; ça va afficher "1"
debug var\e2 ; ça va afficher "2"
Les structures sont particulièrement pratique quand tu dois créer un tableau de données. Le cas typique, c'est un tableau de points

Code : Tout sélectionner

Dim pt.point(100)
Pas besoin de créer la structure "point", elle existe déjà (PureBasic pré-déclare tout un paquet de structures que tu peux voir avec "Structure Viewer").
Dans cet exemple, pt est un tableau à deux dimensions de 100 points qui s'utilise comme suit :
pt(1)\x = 10
pt(1)\y = 25
pt(2)\x = 7
pt(2)\y = 8
ou, pour créer une courbe :
For ct = 1 to 100
pt(ct)\x = ct
pt(ct)\y = ct*ct
Next

Publié : jeu. 03/juin/2004 23:53
par Backup
je doit vous remercier pour ces infos !!
c'est con j'ai jamais eu affair aux structures , un gars a l'epoque qui faisait du C me disait "ouai le basic c'est de la merde d'abord t'a pas de pointeur
" alors moi je lui retorquai "sisi on a VARPTR(variable)
pis lui il me sort "ouai mais vous avez pas les structures !!"
la j'etait largué, les structures ?? j'ai entendu parler de ça , pour les batiments !! :D

pis apres j'ai fait un peut de visualbasic (cote pratique le system de dessin de l'interface pis tu colle ton codes dans le bouton concerné) bref cool
sauf qu'a cause de ça j'ai fait un blocage sur "var.Struct1\e1 = 1 "
parcequ'en visual le point designe un menbres d'un objet
alors n'ayant pas le code des signes je me suis dit ouaaa c'est compliqué ça !
et en plus le seul exemple que j'ai vu des structure etait en java !!
et la le codage change il utilisent un point au lieu de "\"
bref galere !! :? mais la grace a vous j'ai compris le principe
faut que j'exploite ça maintenant , meme si mes oeuvres n'en n'ont pas eu besoin jusqu'a maintenant :)
j'avoue qu'envisager l'hipothese d'utiliser les structures pour designer la caracteristique d'un sprite par exemple

Structure vaisseau
vie.w
arme.w
missile.w
vie_missile.w
couleur_du _vaisseau
EndStructure


est interressante !!
j'aurai peut etre divisé par 2 la taille de mon cassebrique ! :)


Merci encore ,grace a vous je coucherai moins bete ce soir ! :lol: :)

Publié : ven. 04/juin/2004 0:12
par cederavic
les structures ne sont pa nessecaire, mais elle simplifi beaucoup le code, et le rend par la meme occasion plus lisible/leger ;)