Mettre une liste chainée en global, c possible?
-
- Messages : 43
- Inscription : mer. 15/déc./2004 16:28
-
- Messages : 43
- Inscription : mer. 15/déc./2004 16:28
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 ?
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 ?
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 !
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 !

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
), mais ça se présente comme ça:
Et dans ta dll, tu remplis ça un peu comme un tableau.
Pour utiliser la dll dans ton programme principal
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
Bon, je ne sais pas comment ça s'appelle, (moi, j'appelle ça un tableau de structures, mais ça n'engage que moi

Code : Tout sélectionner
Structure BIDON
Baba.l[201]
Bibi.l[201]
Bobo.s[201]
EndStructure
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
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
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
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
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
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"
>> 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
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"
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :