Page 1 sur 2
[RESOLU]Data et Fonction
Publié : lun. 16/mai/2005 14:43
par Progi1984
Voilà pour ma librairie, je souhaite intégrer les mots clés de deux différentes manières, soit par un fichier, soit par des data.
En fait je voudrais incorporer un truc dans ce genre :
!!! PSEUDO CODE !!!
Ca c'est ma lib
Code : Tout sélectionner
ProcedureDLL Keywords(mes data)
ajouteamalistedekeyword()
end procedure
Ca c'est son utilisation
Code : Tout sélectionner
keywords(maliste)
maliste:
data.s "DELETE"
data.s "ADD"
data.s "VDISK"
En fait, le pb c que le nom des labels est différent !
Publié : lun. 16/mai/2005 15:40
par Anonyme2
Ca ne peut pas être fait simplement, car tout ce qui est hors de la lib est inconnu de la lib, c'est le cas des labels, la fonction restore ne fonctionne pas etc.
Si les datas avaient été dans la lib, pas de problème.
Je te propose une solution (je n'ai pas testé mais je pense que ça doit marcher) avec 2 instructions en assembleur pour avoir la fonction équivalente à la fonction Restore de PB
D'ailleurs, les commandes des datas ne sont pas assez souples, j'en profite pour relancer ce post
http://purebasic.hmt-forum.com/viewtopic.php?t=1842
Voilà l'exemple avec la procedureDll et les data
A toi d'ajouter correctement à ta liste chaque nom lu dans les datas.
La procedure a 2 paramètres,
AdresseDebutDatas et Nombre_A_Lire
AdresseDebutDatas est l'adresse du label ma liste soit
?maliste
et Nombre_A_Lire est le nombre de noms à lire dans les datas, il faut bien pouvoir s'arrêter
Code : Tout sélectionner
ProcedureDLL Keywords(AdresseDebutDatas, Nombre_A_Lire)
; Restore maliste; on se place au début des datas
MOV eax, AdresseDebutDatas
! MOV dword [PB_DataPointer], eax ; initialise le pointeur des Data
For i = 1 To Nombre_A_Lire
Read Struc.s
ajouteamalistedekeyword(Struc.s)
Next i
EndProcedure
; l'appel de la fonction
Keywords(?maliste, 3) ; 3 car 3 valeurs
DataSection
maliste:
Data.s "DELETE"
Data.s "ADD"
Data.s "VDISK"
EndDataSection
Publié : lun. 16/mai/2005 15:49
par Anonyme2
je viens de penser à ça,
tu devras peut-être déclarer cette ligne
!extern PB_DataPointer
si tu n'utilises pas de datas dans ta lib (je dit bien à l'intérieur de ta lib)
ajoute cette ligne si c'est le cas sinon ne l'ajoute pas
Code : Tout sélectionner
ProcedureDLL Keywords(AdresseDebutDatas, Nombre_A_Lire)
; Restore maliste; on se place au début des datas
!extern PB_DataPointer
MOV eax, AdresseDebutDatas
! MOV dword [PB_DataPointer], eax ; initialise le pointeur des Data
For i = 1 To Nombre_A_Lire
Read Struc.s
ajouteamalistedekeyword(Struc.s)
Next i
EndProcedure
Publié : mar. 17/mai/2005 16:27
par Anonyme2
Alors ?
Publié : mar. 17/mai/2005 16:39
par Progi1984
Erreur TailBite :
Line.... : eax is not a valid operator
concernant cette ligne là :
MOV eax, AdresseDebutDatas
Publié : mar. 17/mai/2005 16:42
par Anonyme2
remplace la ligne par
! MOV eax, [esp]
et dis-moi
Publié : mar. 17/mai/2005 16:45
par Anonyme2
En fait l'erreur c'est que dans l'éditeur PB, il faut sélectionner dans les options de compilation, la case 'activer l'assembleur en ligne'
Publié : mar. 17/mai/2005 16:47
par Droopy
Désolé de te contredire Denis mais les labels ainsi que les data sont accessibles dans une lib ( avec Tailbite ) alors qu'ils déclarés à l'extérieur de la procédure.
donc met tes data hors procédure et tu y accède sans pb
Publié : mar. 17/mai/2005 16:53
par Progi1984
Premier test :
J'avais commenté !extern PB_DataPointer
Avec Tailbite, ca marche !
Test dans un exemple :
Juste le dernier mot clé des data fonctionne
Second tet :
je décommente
Avec tailbite ca marche plus
Error : Assembly error !
Publié : mar. 17/mai/2005 17:09
par Anonyme2
Progi1984 a écrit :Premier test :
J'avais commenté !extern PB_DataPointer
Avec Tailbite, ca marche !
Test dans un exemple :
Juste le dernier mot clé des data fonctionne
Second tet :
je décommente
Avec tailbite ca marche plus
Error : Assembly error !
Je n'utilise pas Tailbite, mais je vais regarder de plus près, c'est un problème qui doit venir des options de compilations
Publié : mar. 17/mai/2005 17:30
par Anonyme2
Droopy a écrit :Désolé de te contredire Denis mais les labels ainsi que les data sont accessibles dans une lib ( avec Tailbite ) alors qu'ils déclarés à l'extérieur de la procédure.
donc met tes data hors procédure et tu y accède sans pb
Je ne sais pas si on se comprend Droopy
Je pense (mais je ne détiens pas la vérité

) ceci
Le code PB qui va appeller une fonction d'une librairie est une chose, le code PB ou asm ou C dont la lib est faite en est une autre.
Si dans une lib tu utilises des datas déclarés dans cette lib, aucun problème (voir mon message, j'ai écris tout ce qui est hors de la lib, pas hors des procédures de la lib), tu peux utiliser dans la lib sans problème les labels déclarés dans la lib;
Mais pour Progi1984, c'est un utilisateur qui va créer son propre code PB et déclarer dans son propre code PB (donc pas dans la lib) les DATAS
Puis il va passer à une fonction de la lib, le label et c'est là que les problèmes arrivent. Le label est inconnu de la lib; la fonction Restore utilise un label et c'est gênant dans ce cas; cette commande devrait accepter une adresse et on pourrait passer dans l'exemple
?maliste
Si tu met ceci
PureBasic va interpreter maliste comme une variable, rien à voir avec le label; si tu doutes, cré un fichier avec le code que j'ai posté, coche l'option activer l'assembleur en ligne dans les options de compilaton;utilise PureASM avec ce fichier et regarde le code asm.
Ce qu'il faut comprendre avec les librairie utilisateur, c'est que l'on a pas accès avec le code PB aux variables propres à ces lib et les variables du code PB qui utilisera une lib utilisateur sont inconnues de la lib, sauf à passer par l'assembleur. J'ai déjà parlé de ça dans de précédant post ici même. D'ou si dans un code PB, tu utilise une liste chaînée, elle sera inconnue de la lib etc.
La lib est une entité fermé, on lui passe des paramètres et éventuellement elle retourne une valeur.
J'espère avoir été clair.

Publié : mar. 17/mai/2005 17:45
par Anonyme2
Progi1984 a écrit :Erreur TailBite :
Line.... : eax is not a valid operator
concernant cette ligne là :
MOV eax, AdresseDebutDatas
C'est bien un problème de l'option de compilation de l'éditeur PB
Ouvre l'éditeur PB et coches dans les options de compilation la ligne "activer l'assembleur en ligne"
Si tu utilises JaPBe, coche dans celui-ci cette option, bien que je ne sache pas comment travaille tailbite (enfin il lance le compilateur mais celui-ci utilise les prefs de l'éditeur officiel je suppose, JaPBe utilise peut-être le même fichier de prefs)
Ouvre aussi l'éditeur officiel et coche comme je t'ai dit
Ca devrait aller
Publié : mar. 17/mai/2005 18:07
par Progi1984
Mise à jour des infos :
j'ai fait ces test aprés avoir remplace la ligne par ! MOV eax, [esp]
Premier test :
J'avais commenté !extern PB_DataPointer
Avec Tailbite, ca marche !
Test dans un exemple :
Juste le dernier mot clé des data fonctionne
Second tet :
je décommente
Avec tailbite ca marche plus
Error : Assembly error !
depuis j'en suis là !
Publié : mar. 17/mai/2005 18:10
par Anonyme2
Tu as coché les options de compilations ?
J'ai une vielle version de Taillbite, et en décochant j'ai bien l'erreur, j'ai recoché mais la version est trop ancienne, elle plante
replace aussi la ligne MOV eax, AdresseDebutDatas à la place de
MOV eax, [esp]
Publié : mar. 17/mai/2005 18:12
par Progi1984
Oui pour les options de compilation !
Je remplace
je teste....
Et Assembly error !
Voici le code de la fonction :
Code : Tout sélectionner
!extern PB_DataPointer
! MOV eax, AdresseDebutDatas
! MOV dword [PB_DataPointer], eax ; initialise le pointeur des Data
For i = 1 To Nbdta
Read Struc.s
TabKeys(HLA_NbKeywords)\MotCle=Struc.s
Next i