[RESOLU]Data et Fonction

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

[RESOLU]Data et Fonction

Message 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 !
Dernière modification par Progi1984 le mer. 18/mai/2005 20:16, modifié 1 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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 :mrgreen:

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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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 
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Alors ?
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Erreur TailBite :
Line.... : eax is not a valid operator
concernant cette ligne là :
MOV eax, AdresseDebutDatas
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

remplace la ligne par

! MOV eax, [esp]


et dis-moi
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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'
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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 !
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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é :mrgreen: ) 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

Code : Tout sélectionner

Keywords(maliste, 3)
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. :D
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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à !
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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]
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

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