Page 3 sur 4

Publié : dim. 19/déc./2004 21:03
par Pingtix
Moi aussi j'suis nul et pourtant je me bats pas avec un écrase patate breveté !

Publié : dim. 19/déc./2004 21:08
par Flype
:D excusez moi c'était juste pour faire un peu de vent... j'ai fais mon diablotin le temps d'un post :evil:

Publié : dim. 19/déc./2004 21:18
par Backup
pas de mal Flype ! :D

Publié : lun. 20/déc./2004 0:52
par Pacificator
J'aurai pas cru que ma question aurait alimenté un tel débat :lol:


en résumé, ce qui est pratique avec les global, c'est qu'on peut stocker un nombre destiné a être réutilisé. Et ce qui est bien avec les local, c'est qu'elles servent a faire les calculs intermédiaire...

Publié : lun. 20/déc./2004 1:38
par Pacificator
j'ai fait un tableau dans un processusDLL dans ma lib
et apparemment ce tableau n'est pas accessible a partir du code principal...
Donc si j'ai bien compris, les linked list et les tableau, ne sont globaux qu'a condition que le procecus se trouve dans le code...
Est-il possible de rendre global un tableau généré a partir d'un procecusDLL ?

Publié : lun. 20/déc./2004 10:36
par Backup
perso , je ne pense pas !

voici pourquoi
moi je vois les dll comme une procedure normale de ton programme principale sauf que tu serai obligé de mettre un DIM a l'interieur de cette procedure (un dll est une procedure exterieur au prog principal ) , comme cette procedure (la dll) est appelé en cas de besoin elle commencerai par le fameux dim qui initialise le tableau , donc , perte des valeurs qu'il contenait a l'appel precedent !
bref c'est comme si tu mettais a jour le tableau a chaque appel !!

par contre peut etre que ponctuellement on peut utiliser un tableau
qui se trouverai dans la dll , pour le temps d'utilisation de la fonction a l'interieur de la dll , mais des la sortie de la dll pour retour au prg principale
le prochain appel a ce tableau passerai necessairement par DIM qui a mon avis effacerai toute les valeurs !

je suis pas sur d'avoir ete clair la ! :lol:

Publié : lun. 20/déc./2004 11:52
par Chris
A la place d'un tableau qui n'est accessible que depuis la dll, tu peux utiliser une structure, et tu donnes à chaque champ de la structure un paramètre comme pour un tableau.

Bon, je ne sais pas comment ça s'appelle, (moi, j'appelle ça un tableau de structures, mais ça n'engage que moi :lol: ), mais ça se présente comme ça:

Code : Tout sélectionner

Structure BIDON
  Baba.l[201]
  Bibi.l[201]
  Bobo.s[201]
EndStructure
Et dans ta dll, tu remplis ça un peu comme un tableau.

Code : Tout sélectionner

ProcedureDLL AppelBidon(Valeur.l, *test.BIDON)
  For i = 0 To 200
    *test\Baba[i] = Valeur * i
    *test\Bibi[i] = Valeur * (i * 5)
    *test\Bobo[i] = "Chaine " + Str(Valeur * i)
  Next
EndProcedure
Pour utiliser la dll dans ton programme principal

Code : Tout sélectionner

Structure BIDON
  Baba.l[201]
  Bibi.l[201]
  Bobo.s[201]
EndStructure

If OpenLibrary(0,"MaDll.dll")
  CallFunction(0,"AppelBidon", 15, @Valeur.BIDON)
  
  For i = 0 To 200
    Debug Str(Valeur\Baba[i]) + " --- " + Str(Valeur\Bibi[i]) + "  " + Valeur\Bobo[i]
  Next
  CloseLibrary(0)
EndIf
Bon, je sens que je vais encore me faire engueuler et qu'on va me dire: "Noooon!!!. Faut pas faire comme ça....!", mais chez moi, ça fonctionne sans problème.

Edité :
J'ai oublié!
Tu peux aussi mettre des chaines et des valeurs numériques dans la structure, comme avec une structure normale.
J'ai modifié le code en conséquence

Publié : lun. 20/déc./2004 12:10
par Le Soldat Inconnu
Voici un bel exemple de code avec récursivité qui nécessite un tableau
>> il faut placé ce code dans un dossier qui contient des sous dossiers

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
;
; Explication du programme :

#MaxFichier = 100
#MaxDossier = 50
Dim Dossier.s(#MaxFichier, #MaxDossier)
Dim Temp.s(#MaxFichier)

Structure InfoExplorer
  Dossier.s
  Type.l
EndStructure
NewList Explorer.InfoExplorer()

Global Position
Position = -1

Enumeration
  #Arbre
  #Explorer
EndEnumeration

#Arbre_X = 250
#Arbre_Y = 300

#Win_X = #Arbre_X
#Win_Y = #Arbre_Y

Procedure ListeDossier(Numero, Dossier.s, PositionDepart)
  
  If n > #MaxDossier
    MessageRequester("Erreur", "Dépassement de capacité des dossiers", 0)
    End
  EndIf
  
  If ExamineDirectory(Numero, Dossier, "*.*")
    
    ;- Analyse du contenu du dossier
    
    Cpt_Dossier = -1
    
    Repeat
      
      FileType = NextDirectoryEntry()
      Nom.s = DirectoryEntryName()
      
      If FileType = 2 And Nom <> "." And Nom <> ".."
        Cpt_Dossier + 1
        If Cpt_Dossier > #MaxFichier
          MessageRequester("Erreur", "Dépassement de capacité des fichiers", 0)
          End
        EndIf
        
        Temp(Cpt_Dossier) = Nom
        
      EndIf
      
    Until FileType = 0
    
    ;- Triage des fichiers et dossiers
    SortArray(Temp(), 2, 0, Cpt_Dossier)
    
    ; Transfert
    For n = 0 To Cpt_Dossier
      Dossier(n, Numero) = Temp(n)
    Next
    
    ;- Affichage
    
    For n = 0 To Cpt_Dossier
      Position + 1
      AddElement(Explorer())
      Explorer()\Dossier = Dossier + Dossier(n, Numero) + "\"
      Explorer()\Type = Numero
      AddGadgetItem(#Arbre, Position, Dossier(n, Numero))
      OpenTreeGadgetNode(#Arbre)
      ListeDossier(Numero + 1, Dossier + Dossier(n, Numero) + "\", Position)
      CloseTreeGadgetNode(#Arbre)
    Next
    
    ; On ouvre le noeud
    SetGadgetItemState(#Arbre, PositionDepart, #PB_Tree_Expanded)
    
  EndIf
EndProcedure


;/ Début du programme

;- Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, #Win_X, #Win_Y, #PB_Window_Invisible | #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget, "Logithèque") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf

;- Gadgets
TreeGadget(#Arbre, 0, 0, #Arbre_X, #Arbre_Y, #PB_Tree_AlwaysShowSelection)
ListeDossier(0, "", 0)

HideWindow(0, 0)

Repeat
  Event = WaitWindowEvent()
  
Until Event = #PB_EventCloseWindow
Le but du tableau est simple : trié les sous dossier de chaque dossier et les affiché avec récursivité jusqu'à ce qu'il n'y est plus de sous dossier.

donc pour chaque dossier, je rempli le tableau avec les sous dossier, je les trie (SortArray) et j'affiche

Et bien pour m'en sortir, au lieu d'avoir un tableau Dim Machin(1000)
j'ai un tableau Dim(Machin, Recursif)
la variable "Recursif" étant différente pour chaque appel de la procedure.
Cela me permet d'avoir un tableau "local" (mais simulé) pour chaque appel de la procedure.
Dans le cas contraire, à chaque appel de la procedure "récursive fille", j'écrase les infos contenu dans le tableau qui servent à la procedure "récursive mère"

Publié : lun. 20/déc./2004 12:22
par Chris
Pas mal :D

Publié : lun. 20/déc./2004 17:02
par Fred
je pense que les tableaux/listes pourront etre locaux avec PB v4.0. C'est une grosse limitation à mon avis.

Publié : lun. 20/déc./2004 17:17
par Anonyme2
Fred a écrit :je pense que les tableaux/listes pourront etre locaux avec PB v4.0. C'est une grosse limitation à mon avis.
:D :D

Publié : lun. 20/déc./2004 18:49
par Backup
C'est une grosse limitation à mon avis.
:D les grand esprits se rencontre ! :lol:

Publié : mar. 21/déc./2004 11:56
par Le Soldat Inconnu
extra :D

Publié : mar. 21/déc./2004 13:45
par hardy
je pense que les tableaux/listes pourront etre locaux avec PB v4.0. C'est une grosse limitation à mon avis.
:?:

Ca ne peut être une limitation, dans la mesure où on a le choix entre global et local .

Publié : mar. 21/déc./2004 14:06
par Backup
Ca ne peut être une limitation, dans la mesure où on a le choix entre global et local
je ne pense pas que Fred parle de la possibilitée , mais de l'utilitée ! :D