Une procédure pour créer une liste chainé

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Une procédure pour créer une liste chainé

Message par Guimauve »

Cet exemple provient de la section de Rapport de bogue du forum Anglais.

La procédure fautive devait créer un liste chainé et ajouter des élément
à la liste en même temps.

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code original

Procedure zaehle(z.l)
   NewList test.l()
   AddElement(test())
   test() = z
EndProcedure

zaehle(10)
zaehle(11)

Debug test()
ForEach test()
   Debug test()
Next
À l'éxécution du code il y a un erreur. La liste chainé est clonée à chacun
des appels de la procédure. Selon mon point de vue ce n'est pas un
bogue, mais plutôt une erreur d'écriture du code. Regardez la version
modifiée du code précédent.

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code modifié

Procedure zaehle(z.l)
   
   Static OneShot.b
   
   If OneShot = #False
      NewList test.l()
      OneShot = #True
   EndIf
   
   AddElement(test())
   test() = z
   
EndProcedure

For comp = 5 To 15
   zaehle(comp)
Next

ForEach test()
   Debug test()
Next
Dans la version modifié, il n'y a aucun erreur. La liste chainé est créer au
premier appel et n'est pas clonée par la suite. Les valeurs sont
simplement ajouté à la liste.

L'utilisation de la variable static OneShot fait en sorte que la procédure se
rappelle toute seule si elle à créer la liste ou non.

Il est certain qu'il est agréable que le Compilateur nous retourne un
message d'erreur lorsque l'on fait des gaffes. Mais ce ne sont pas toujours
des bogues, mais plutôt la manière dont le code est écrit qui cause
problème.

J'espère que cette démonstration sera utile pour ceux qui on besoin de
procédures pour créer des listes chainées.

A+
Guimauve
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Et pourquoi ne pas mettre directement la new list en début de fichier au niveau des déclarations.

Je ne sais plus où, mais il avait été démontré que la déclaration des variables globales devaient toutes se faire en début de fichier sinon elles ne l'étaient pas. Je me demande comment ça se passe pour un projet avec plusieurs fichiers avec pour chacun des déclarations de variables globales.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

C'est ici qu'on en parle:

http://purebasic.hmt-forum.com/viewtopi ... 096ccf7fc6

Je pense vraiment que la newlist devrait être déclaré en dehors de toute procédure puisque de toute façon, Pure ne sait pas créer des listes chainées à la volée (on peut toutefois les faire soi-même), c'est certainement ce qu'il à souhaiter faire initialement.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Oui je suis d'accord avec toi sur la déclaration des listes chainées, des tableaux, etc lorsque la liste n'est utilisé que par un seul et unique programme. Ou qu'on ne souhaite pas transporter le code d'un programme à un autre parce que ce n'est pas nécessaire ou que c'est un cas particulier.

La seule raison où c'est nécessaire de créer une liste chainée dans une procédure c'est lorsque l'on fait une librairie, comme des ScreenGadgets par exemple, qui nécessite l'utilisation d'une liste chainée standard.

Dans ce cas le problème n'est pas particulier mais général, on n'a pas vraiment le choix, il faut faire comme ça.

Le code précédent montre comment éviter de créer la même liste plusieurs fois. Et ça reste vrai même si l'on fait une librairie avec Tailbite.

Personnellement, j'ai aucune idée sur le fonctionnement interne des listes chainées donc programmer une liste chainée maison risque d'être long, pénible et fastidieux alors l'utilisation des listes standards de PB est une bonne alternative.

Voilà.

A+
Guimauve
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Oui mais avec tailbite, la procédure init n'est appelé qu'une fois, ça résout le Pb.

...cela dit c'est très bien de faire remarquer ce genre de prob que beaucoup pourrait rencontrer!


:)
Répondre