Page 1 sur 1
Liste chainé dans un procedureDLL
Publié : ven. 16/sept./2005 12:59
par Thyphoon
je voudrais pouvoir gerer une liste chainé créer dans mon programme principal avec une dll. je pense n'être pas tres loin de la solution mais je tourne en rond depuis un bon bout de temps...
main.exe
Code : Tout sélectionner
Structure MenuStructure
Name.s
Option.s
Display.s
Sel.l
EndStructure
NewList Menu.MenuStructure()
AddElement(Menu())
Resultat = OpenLibrary(0, "plugin.dll")
Debug CallFunction(0, "PluginDefaultGamePref",Menu())
plugin.dll
Code : Tout sélectionner
Structure MenuStructure
Name.s
Option.s
Display.s
Sel.l
EndStructure
ProcedureDLL PluginDefaultGamePref(*m.MenuStructure)
Restore Menu
While *m\Name<>"Menu_End"
AddElement(@*m())
Read *m\Name
Read *m\Option
Read *m\Display
;WriteMameINI("mame.ini",titre$,"")
Wend
ProcedureReturn 0
EndProcedure
DataSection
Menu:
Data.s "Windows video options","",""
Data.s "autoframeskip","0|1",""
Data.s "frameskip","0|1","No|Yes"
Data.s "waitvsync","0|1",""
Data.s "triplebuffer","0|1",""
Data.s "Menu_End","Menu_End","Menu_End"
EndDataSection
déjà si dans mon programme principal je ne met pas AddElement(Menu())
le programme bug sur
Et me dit :"The linked list doesn't have current element"
et deuxièment ...dans ma dll
impossible de faire un Addelement()
Quelqu'un voit ou je fais une erreur ?
Merci d'avance
Publié : ven. 16/sept./2005 19:00
par nico
Bon déjà tu ne peux faire un addelement que dans le source où tu as créé la NewList car on ne peux pas référencer la NewList. Donc si tu veux ajouter un élément depuis l'autre source, il faut créer une procédure dans le source où la NewList à été créé qui va gérer cela.
Mais tu peux t'en passer, tout dépend de ce que tu veux faire.
Si seulement un de tes fichiers sources doit créer de nouveaux éléments et l'autre seulement les consulter alors ça devient beaucoup plus simple.
Publié : ven. 16/sept./2005 19:09
par Thyphoon
Merci beaucoup pour ces informations ..
en gros si je veux faire ce que je veux faire faut que je trouve une autre solution pour passer une liste....
Je vais essayer avec un tableau genre global liste.s(1000)(3)
j'éspère que ça fonctionner

En tout cas merci d'avoir prit le temps de repondre, car je bloquais vraiment et comme je pensais que c'était possible je persistais

Publié : ven. 16/sept./2005 19:32
par nico
Je n'ai pas dit que c'était impossible, j'ai seulement dit qu'il fallait créer les procédures nécessaires dans le fichier où est déclarée la NewList pour que l'autre fichier puisse utiliser cette liste.
Publié : ven. 16/sept./2005 19:44
par Dr. Dri
Bah oué, c'est bien toi qui voulai appeller les fonctions de ton programme principal à partir de tes plugins ?
une fonction de plus ou de moins c'est pas grave...
Code : Tout sélectionner
Procedure ajoute(name, option, display)
addelement( la_liste_du_programme_principal() )
la_liste_du_programme_principal()\name = name
...
endprocedure
Dri
Publié : ven. 16/sept./2005 20:02
par Thyphoon
Je commence a mieux comprendre le tout
désolé mais j'ai beau lire et relire le tutorial qui a été fait sur ce forum sur les pointeurs et les façons de passer des truc a des procedure via des pointeurs mais tout ce melange

C'est a force qu'on apprend me direz vous ...
En tout cas merci de votre patience....
A oui si tant que j'y suis
si je voulais passer un tableau du style
table.s(1000,3) via les pointeurs...
j'ai essayé d'utilisé l'exemple du tutorial
Code : Tout sélectionner
#dimx=5
#dimy=5
Dim tab.l(#dimx,#dimy) ;tableau de type .long
For i=0 To 5
For j=0 To 5
tab(i,j)=i+j+1 ;affectation de valeurs quelconques au tableau
Debug tab(i,j)
Next
Next
Structure Liste
val.l
EndStructure
Procedure affich(*pointeur.Liste,nb)
For i=1 To nb
Debug *pointeur\val
*pointeur+4 ;saut de 4 octets (valeur d'un .LONG)
Next i
EndProcedure
Debug "------------------------------"
affich(@tab(),(#dimx+1)*(#dimy+1)) ;@tab() donne
mais le pb c'est que un .l a une longueur determiné alors qu'un .s ça peut varier si je me trompe pas, deplus moi je veux pas lire mais ecrire...
Mais un jour j'y arriverais et c'est moi qui vous aidera...

Publié : ven. 16/sept./2005 20:39
par nico
Code : Tout sélectionner
Structure Liste
Nom.s
age.l
EndStructure
#dimx=5
#dimy=5
Dim tab.Liste(#dimx,#dimy)
For i=0 To 5
For j=0 To 5
tab(i,j)\Nom="Typhon"+" "+Str(i)+" "+Str(j)
;Debug tab(i,j)
Next
Next
Procedure affich(*pointeur.Liste,Nb)
For i=1 To Nb
Debug *pointeur\Nom
*pointeur+SizeOf(Liste)
Next i
EndProcedure
Debug "------------------------------"
affich(@tab(),(#dimx+1)*(#dimy+1))
*pointeur2.Liste=@tab(1,2)
*pointeur2\Nom="nico"+" "+Str(1)+" "+Str(2)
affich(@tab(),(#dimx+1)*(#dimy+1))
Publié : ven. 16/sept./2005 21:01
par Thyphoon
wouaaaaa et tu me sort ça comme ça... Je reste baba ...
Et bein un grand merci ...lollllll
si jammais dans un dernier geste de bonté tu pouvais aussi me trouver mon problème de liste chainé que j'ai remis a la suite du topic le concernant même si en vérité ces 2 problèmes sont pour moi lié, car ce sont 2 façons différents d'arrivé a mes fins...
http://purebasic.hmt-forum.com/viewtopic.php?p=33434
En tout cas un grand merci pour votre patience et votre aide a tous...
Vous donnez pas des cours particulier par exemple ?
