Page 4 sur 26

Publié : mar. 23/déc./2008 9:29
par Progi1984
Lettre ouverte à Fred :

Code : Tout sélectionner

Remarques sur le Library SDK

Bonjour,

Préparant un outil multiplateforme open source comparable à Tailbite et travaillant en liaison avec le forum purebasic fr

Projet  :  Moebius - Google Code

Réalisé actuellement : http://code.google.com/p/moebius-pb/wiki/RoadMap

Actuellement, le projet avance bien mais je suis bloqué sur les tableaux en paramètre.

Serait il possible d'avoir quelques codes ASM de base utilisant les tableaux en params ?

La dernière version du SVN est fonctionnel avec PB 4.30 en même pas cinq minutes.

Merci de votre réponse.

Bye on PB forums.

PS : If you prefer an english version of this mail, answer it for asking it :) and i will do it
Et ouvert un thread sur le forum anglais.
(Lien : http://www.purebasic.fr/english/viewtop ... highlight=)

Publié : mar. 23/déc./2008 18:49
par Anonyme2
J'ai téléchargé mais toujours opareil, je ne compile rien, j'ai une erreur -1 Step0.

Je n'ai pas vraiment le temps de reprendre toutes les lignes pour arriver à faire une compilation.

Moi j'ai PB installé dans K:\PureBasic

J'ai Moebius ici K:\PureBasic\Projets\moebius

Maintenant je fais quoi pour que ça compile, y a pas un moyen de s'afranchire de tous ces ini à se retaper à la main ?

J'ai compilé avec mon outil ton exemple 8, bien que le code ne soit pas long, je n'ai pass encore eu l'étincelle.

2 remarques :

Si je compile plusieurs fois de suive, l'erreur d'écriture ne se situe jamais à la même adresse et la valeur est toujoursfaible, comme si on avait la valeur aléatoire comme adresse, peut-être que l'on est décalé dans le tableau.

La gestion des strings en asm PB est toujours pénible car on a pas d'infos sur les fonctions.
Il serait intéressant de créer un exemple comme ceci avec un tableau, sans traitement de chaine pour voir si le probème provient du tableau ou des chaines.

Code : Tout sélectionner

ProcedureDLL.l S08_GetVarL1(Array MyArrayL.l(1), Num.l)
	ProcedureReturn MyArrayL.l(Num)
EndProcedure

Publié : mar. 23/déc./2008 20:13
par Progi1984
En fait, normalement, tu as juste à modifier le fichier Prefs\Moebius_Windows.ini pour rentrer les bons chemins.

Code : Tout sélectionner

[PATH]
PureBasic = K:\PureBasic\
PBCompiler = K:\PureBasic\compilers\pbcompiler.exe
PBFasm = K:\PureBasic\compilers\fasm.exe
PBObj2Lib = K:\PureBasic\compilers\polib.exe
PBLibMaker = K:\PureBasic\SDK\LibraryMaker.exe
Puis à changer le fichier ini de l'exemple (Lib_Source\Sample08.ini) et c'est tout.

Code : Tout sélectionner

[WINDOWS]
Name = Samples08Windows
FileName = K:\PureBasic\Projets\moebius \Lib_Source\Sample_08.pb
SourceDir = K:\PureBasic\Projets\moebius\Lib_Source\
[LINUX]
Name = Samples08Linux
FileName = /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Sample_08.pb
SourceDir = /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/
[PROJECT]
Unicode = 0
ThreadSafe = 0
Avec ca, ca devrait etre bon...

hésite pas à modifier le fichier Sample08.pb

Publié : ven. 26/déc./2008 19:04
par Progi1984
J'ai modifié le Sample 08.pb

Code : Tout sélectionner

ProcedureDLL S08_GetVarL(Array MyArrayL.l(1), Num.l)
	ProcedureReturn MyArrayL(lInc)
EndProcedure
Et tu as raison, j'ai toujours l'IMA a l'adresse 0.


J'ai mis à jour le code :
File:1->Proj_Moebius.zip
Image

Garde tes fichiers ini :)

Publié : sam. 27/déc./2008 12:10
par Anonyme2
Progi1984 a écrit :J'ai modifié le Sample 08.pb

Code : Tout sélectionner

ProcedureDLL S08_GetVarL(Array MyArrayL.l(1), Num.l)
	ProcedureReturn MyArrayL(lInc)
EndProcedure
Et tu as raison, j'ai toujours l'IMA a l'adresse 0.
Changes ProcedureReturn MyArrayL(lInc) par ProcedureReturn MyArrayL(Num) ça permet de faire varier la valeur demandée en retour, car tu passes une variable globale valant 0.

J'avance doucement, j'ai fait des tests et pour l'instant j'arrive au fait que la structure du tableau utilisée par PB en datasection n'est pas initialisée car la valeur retournée est 0 au lieu de l'adresse de la table du tableau, ce qui cause l'erreur, car on tente de charger une adresse très faible qui vaut la valeur de Num x 4, ce qui entraine l'erreur.

je continue à chercher pourquoi.

Publié : sam. 27/déc./2008 17:10
par Anonyme2
Pour l'exemple suivant de librairie

Code : Tout sélectionner

ProcedureDLL S08_GetVarL(Array MyArrayL.l(1), Num.l)
   ProcedureReturn MyArrayL(Num)
EndProcedure
je pense que c'est un soit un bug PB soit la déclaration du desc est mauvaise mais ça ne me semble pas être le cas

PB utilise dans ce cas en datasection 2 long, le premier est l'adresse de base du tableau (qui est renvoyé par @Tableau() ) et l'autre je ne sais pas à quoi elle sert.

Si on transforme le code PB suivant

Code : Tout sélectionner

ProcedureDLL S08_GetVarL(Array MyArrayL.l(1), Num.l)
	ProcedureReturn MyArrayL(Num)
EndProcedure


Dim AnyArrayL.l(11)

For INC = 0 To 10
     AnyArrayL(INC) = INC*10
Next


Global valeur = S08_GetVarL(AnyArrayL(), 4)

Debug valeur

en code asm, voici comment PB déclare les 2 long en datasection

Code : Tout sélectionner

a_AnyArrayL:
  rd     1
  rd     1
et l'appel de la procedure se fait comme ceci :

Code : Tout sélectionner

; Global valeur = S08_GetVarL(AnyArrayL(), 4)
  PUSH   dword 4
  PUSH   dword a_AnyArrayL
  CALL  _Procedure0
  MOV    dword [v_valeur],eax
ce qui est important c'est la ligne PUSH dword a_AnyArrayL
a_AnyArrayL est une étiquette (donc l'adresse du premier élément de la structure que PB utilise pour son tableau).

D'après mes tests lorsque l'on utilise la lib (uniquement la procedure compilée), lors de l'appel PB utilise PUSH dword [a_AnyArrayL] au lieu de PUSH dword a_AnyArrayL, ce qui revient à dire qu'il passe le contenu situé à l'adresse du premier élément de sa structure à la procedure au lieu de passer l'adresse elle-même. Le contenu est l'adresse du tableau.
Ca entraine à un moment à avoir une valeur nulle dans un registre qui sert de pointeur et on a une erreur.

Je pense que c'est ça car j'ai inséré directement le code asm dans PB et j'ai fait les 2 types d'appel, et c'est bien comme je vient de t'expliquer, un cas ça marche et l'autre ça plante de la même manière.

Comme le code se suffit à lui-même et qu'il n'y a pas de desc avec la compilation PB utilisant l'asm depuis l'éditeur, ça confirme ma position sur le fait que le desc est bon.

Publié : dim. 28/déc./2008 12:24
par Progi1984
Par conséquent, ne faudrait il pas un bugreport à Fred ?

Merci de m'expliquer les codes ASM tout en faisant tes recherches :)

Publié : dim. 28/déc./2008 12:28
par Anonyme2
J'ai envoyé un mp à Fred en lui donnant le lien sur le post que j'ai fait, j'espère qu'il va regarder.

Publié : dim. 28/déc./2008 12:39
par Progi1984
Nickel, bonne news :)

Tu me tiens au courant pour Fred :)

Publié : mar. 30/déc./2008 19:13
par Progi1984
Des news ?

Publié : mar. 30/déc./2008 20:05
par Anonyme2
Non

Publié : lun. 05/janv./2009 15:27
par Fred
En fait l'appel d'un tableau pour une 'PureLibrary' differe d'un appel pour une procedure. L'adresse du tableau est directement passée pour la purelibrary, car l'action sur le tableau est limité (princiapelemnt de la lecteur ecriture). Dans le cas d'une procedure, il est possible de faire du redim est plus globalement le compilateur inserera du code de debug si necessaire quand le deboggeur est activé, et il a donc besoin de plus d'informations.

Donc il n'est pas possible de mixer les deux. Au lieu d'utiliser un parametre 'Array' utilise un pointeur vers une structure et ca devrait functionner.

Publié : lun. 05/janv./2009 15:31
par Anonyme2
Progi1984 va nous faire ça :D

Publié : lun. 05/janv./2009 16:14
par Progi1984
Denis a écrit :Progi1984 va nous faire ça :D
Mais bien sur, pas de problème. :D :P:D

Encore faudrait il m'expliquer un peu plus concrètement ce qu'il faut faire car aux dernières paroles de Fred (duquel je remercie de sa réponse), cité dessous, il ne serait pas possible d'utiliser "Array" dans une déclaration de procédure mais plutôt un pointeur :
Donc il n'est pas possible de mixer les deux. Au lieu d'utiliser un paramètre 'Array' utilise un pointeur vers une structure et ça devrait fonctionner.
Une chtite explication ?

Publié : lun. 05/janv./2009 17:10
par Anonyme2
Le desc, au lieu de lui mettre ceci

Code : Tout sélectionner

S08_GetVarL, Array, Long, (MyArrayL.l(1), Num.l)
Long | StdCall
il faut mettre à la place de Array--> Long

Mais là ou c'est moins bien et ça ne me plait pas c'est que l'appel de la fonction doit se faire comme ceci (d'où une différence du code PB à préciser dans la doc)

L'appel classique est comme ceci :

Code : Tout sélectionner

Dim AnyArrayL.l(11)

For INC = 0 To 10
     AnyArrayL(INC) = INC*10
Next

Global valeur = S08_GetVarL(AnyArrayL(), 4) 
Fred dit de passer par une structure, c'est en fait pour avoir un déréférencement du pointeur.

Code : Tout sélectionner

Structure Monpointeur
   *pt
EndStructure


Tableau.Monpointeur

Tableau\pt = @AnyArrayL()
L'appel de la fonction se fait comme ceci

Code : Tout sélectionner

Global valeur = S08_GetVarL(@Tableau, 4) 
On besoin d'avoir l'adresse du tableau pas directement mais par un pointeur. C'est ce que fait l'exemple.

La solution ne me convient pas, ça oblige à bricoler.
Tu fais comme tu veux mais je vais essayer de te proposer une solution, je vois 3 façons de faire, une assez délicate à mettre en oeuvre (bien qu'elle ait ma préférence) car elle utilise la pile, une autre avec une allocation de mémoire et désallocation en quittant le code et la troisième qui me semble la plus simple (?)à mettre en oeuvre et qui utilise une variable déclarée en datasection, c'est cette partie à créer ainsi que l'écriture de la valeur dans cette variable etc.

La difficulté est de retrouver le paramètre du tableau , 1er , 2ème, 3ème, nième paramètre ?
C'est pas encore gagné, bien que normalement ton analyseur retrouve la position du paramètre pour écrire correctement le desc.

Tu en penses quoi ?