Liste chainé dans un procedureDLL

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Liste chainé dans un procedureDLL

Message 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

Code : Tout sélectionner

Debug CallFunction(0, "PluginDefaultGamePref",Menu())
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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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 :roll: 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 :P
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Je commence a mieux comprendre le tout :P
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 :roll: 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... :roll:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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)) 
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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 ? :P
Répondre