@+

Code : Tout sélectionner
; Divers essais sur les librairies extérieures.
; Code source de la librairie dynamique et statique :
;*********************************************************************
;int nbrAdd(int i1, int i2) //fonction 1 avec 2 arguments (une simple addition)
;{
; Return i1 + i2;
;}
;int nbrCarr(int n1) //fonction2 avec un seul argument (carré du nombre)
;{
;Return n1*n1;
;}
;*********************************************************************
;####################################################
;# tests avec une librairie partagée .so #
;####################################################
;# Méthode par import
Import "/home/choubibar/CodeBlocks/persolib/bin/Release/libpersolib.so" ; compilée en C (main.c) 5,25KB
nbrAdd(i1.i, i2.i)
nbrCarr(n1.i)
EndImport
a.i = nbrAdd(156,44)
b.i = nbrCarr(12)
If a
Debug "Méthode Import librairie partagée .so compilée en C => Total addition = " + Str(a) ; ça fonctionne bien !
Else
Debug "Erreur dans l'importation ou les arguments !"
EndIf
If b
Debug "Méthode Import librairie partagée .so compilée en C => Total carré = " + Str(b) ; ça fonctionne bien !
Else
Debug "Erreur dans l'importation ou les arguments !"
EndIf
;####################################################
;# tests avec une librairie statique .a #
;####################################################
Import "/home/choubibar/CodeBlocks/persostatic/libpersostatic.a" ; compilée en C (main.c) 888 Bytes
nbrAdd2(j1.i, j2.i)
nbrCarr2(n2)
EndImport
c.i = nbrAdd2(15,45)
d.i = nbrCarr2(13)
If c
Debug "Méthode Import librairie statique .a compilée en C => Total addition = " + Str(c) ; ça fonctionne bien !
Else
Debug "Erreur dans l'importation ou les arguments !"
EndIf
If d
Debug "Méthode Import librairie statique .a compilée en C => Total carré = " + Str(d) ; ça fonctionne bien !
Else
Debug "Erreur dans l'importation ou les arguments !"
EndIf
Code : Tout sélectionner
;####################################################
;# tests avec une librairie partagée .so #
;####################################################
PrototypeC.i carre(nbr.i)
PrototypeC.i addition(nbr1.i, nbr2.i)
If OpenLibrary(0, "/home/choubibar/CodeBlocks/persolib/bin/Release/libpersolib.so" )
; tests avec prototype
Carr.carre = GetFunction(0, "nbrCarr")
res1 = Carr(10)
If res1
Debug "Méthode d'appel par prototype OK! => Résultat du carré : " + Str(res1)
Else
Debug "Erreur avec la méthode du prototype !"
EndIf
Add.addition = GetFunction(0, "nbrAdd")
res2 = Add(100, 50)
If res2
Debug "Méthode d'appel par prototype OK! => Résultat = " + Str(res2)
Else
Debug "Erreur avec la méthode du prototype !"
EndIf
CloseLibrary(0)
Else
Debug "librairie non ouverte !"
EndIf
Code : Tout sélectionner
;####################################################
;# tests avec une librairie partagée .so #
;####################################################
;# Méthode par appel direct de fonction
If OpenLibrary(0, "/home/choubibar/CodeBlocks/persolib/bin/Release/libpersolib.so" )
; test des différentes fonctions de l'api library au passage ...
addition = GetFunction(0, "nbrAdd")
If addition
Debug "fonction nbrAdd trouvée avec son nom (GetFunction) ! "
Else
Debug "Erreur dans l'appel par nom"
EndIf
If ExamineLibraryFunctions(0)
n = 1
While NextLibraryFunction()
n2 = LibraryFunctionAddress()
Debug "Fonction n°" + Str(n) + " = " + LibraryFunctionName() + " : adresse : "+ Chr(34) + Str(n2) + Chr(34)
n+1
Wend
n3 = CountLibraryFunctions(0)
Debug Str(n3) + " fonctions trouvée au total !"
EndIf
; fin des tests de base
; début des tests avec callcfunction
res = CallCFunction(0, "nbrAdd",8) ; plantage ici !
; si 2 arguments ex 8, 10 résultat attendu 18, res n'est pas créé => erreur !
;si un seul argument ex : 8, res est créé mais donne le résultat erronné 16 (nbr additionné à lui-même) au lieu de 8.
If res
Debug "Méthode d'appel et d'argument OK! => Résultat = " + Str(res)
Else
Debug "Erreur dans l'appel ou les arguments passés !"
EndIf
carre = CallCFunction(0, "nbrCarr", 12) ;résultat correct ici ! (un seul argument)
If carre
Debug "Méthode d'appel et d'argument OK! =>Résultat du carré : " + Str(carre)
Else
Debug "Erreur dans l'appel ou les arguments passés !"
EndIf
; début des tests avec callcfunctionfast
addition2 = GetFunction(0, "nbrAdd")
res2 = CallCFunctionFast(*addition2, 8,10) ;plantage ici !
; si un seul argument est passé, plantage normal car la fonction nécessite bien 2 arguments
; si 2 arguements sont passés, seul le premier argument est pris en compte et la fonction retourne uniquement 8 au lieu de 18
If res2
Debug "Méthode par pointeur OK! => Résultat = " + Str(res2)
Else
Debug "Erreur dans l'appel par pointeur ou les arguments passés !"
EndIf
;carre2 = GetFunction(0,"nbrCarr")
;res3 = CallCFunctionFast(*carre2,0) ;plantage ici !
;If res3
;Debug "Méthode d'appel et d'argument OK! => Résultat du carré : " + Str(res3)
;Else
;Debug "Erreur dans l'appel ou les arguments passés !"
;EndIf
CloseLibrary(0)
Else
Debug "librairie non ouverte !"
EndIf
Code : Tout sélectionner
;##########################################
; une librairie partagée .so en purebasic pour tests
;##########################################
ProcedureCDLL.i nbrAddPB(n1.i, n2.i)
ProcedureReturn n1 + n2
EndProcedure
ProcedureCDLL.i nbrCarrPB(n3)
ProcedureReturn n3*n3
EndProcedure
DéveloppeJe n'ai toujours pas su résoudre mon problème de progressbar sous linux également.
Code : Tout sélectionner
;##########################################
; une librairie partagée .so en purebasic pour tests
;##########################################
ProcedureCDLL.i nbrAddPB(n1.i, n2.i)
ProcedureReturn n1 + n2
EndProcedure
ProcedureCDLL.i nbrCarrPB(n3)
ProcedureReturn n3*n3
EndProcedure
Salut,G-Rom a écrit :Ton code est bon.
J'ai également testé au cas où callfunction et callfunctionfast dans le cas d'un fcall plutôt qu'un cdecl sans plus de succès, normalement sous linux avec une compilation deC avec gcc je suis forcément en cdecl, heureusement il me reste le prototypage ou l'import qui fonctionnent tous les 2 à merveille ... en attendant je blackliste ces 2 fonctions pour éviter de mauvaises surprises.G-Rom a écrit : pour callcfunction et callcfunctionfast il me semble que cela dépend de la convention d'appel , certaine sont en cdecl d'autre non , d'ou à mon avis le plantage.
le mieux pour importé des fonctions est d'utilisé des prototypes.
Code : Tout sélectionner
If OpenWindow(0, 0, 0, 320, 80, "Test du ProgressBarGadget", #PB_Window_ScreenCentered)
SetWindowColor(0,$4532FF) ; changement de couleur fenêtre OK
TextGadget (1, 10, 10, 250, 20, "ProgressBar", #PB_Text_Center)
ProgressBarGadget(0, 10, 30, 250, 30, 0, 100) ; bien que le flag "smooth" ne soit pas utiliser, pas de blocks sous linux
GadgetToolTip(0,"Ceci est une barre de progression") ;OK
SetGadgetState (0, 50)
SetGadgetColor(1,#PB_Gadget_BackColor,$00FF00) ; changement de couleur texte et fond OK
SetGadgetColor(1,#PB_Gadget_FrontColor,$0F00F0); OK
SetGadgetColor(0,#PB_Gadget_BackColor,RGB(0,56,83)); pas OK
SetGadgetColor(0,#PB_Gadget_FrontColor,$FF0F00);pas OK
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
Code : Tout sélectionner
Import "/home/choubibar/CodeBlocks/persostatic/libpersostatic.a" ; compilée en C (main.c) 888 Bytes
nbrCarr2(n2)
EndImport
c.i = nbrCarr2(13)
Debug c ; OK
Debug "Résultat = " + Str(c) ;OK
Debug nbrCarr2(15) ;OK
Debug Str(nbrCarr2(12)) ;OK
;Debug "Résultat = " + Str(nbrCarr2(10)); ECHEC pas d'affichage mais le prog ne plante pas
;s$ = "Résultat = " + Str(nbrCarr2(5)) ; ECHEC + "invalid access memory"
tx$ = "Résultat " + Str(c)
Debug tx$ ;OK
t.s = "Résultat = "
d.s = Str(nbrCarr2(7))
e.i = nbrCarr2(8)
Debug t + d ;OK
Debug t + Str(e) ;OK
a.i = 10
b.i = 10
Debug "somme = " + Str(a+b) ;OK
Debug "Ecriture d'un nombre - changement de type " + Str(567) ;OK
Code : Tout sélectionner
;####################################################
;# tests avec une librairie partagée .so #
;####################################################
PrototypeC.i carre(nbr.i)
PrototypeC.i addition(nbr1.i, nbr2.i)
If OpenLibrary(0, "/home/choubibar/CodeBlocks/persolib/bin/Release/libpersolib.so" )
; tests avec prototype
Carr.carre = GetFunction(0, "nbrCarr")
res1 = Carr(10)
Debug "résultat = " + Str(res1)
Debug "Résultat = " + Str(Carr(5)); calcul direct et changement de typage ok
CloseLibrary(0)
Else
Debug "librairie non ouverte !"
EndIf
Aucune idée , tout ce que je peut de dire , c'est que sous linux , ca fonctionne aussi bien que sous windows , mais il y a un temps d'adaptation pour comprendre les différences ^^dans le même ordre d'idée, il y a qques fonctions de dessin (2DDrawing) qui ne fonctionnent pas correctement sous kubuntu, par exemple dans l'exemple Image.pb, la boucle ne fonctionne pas parce que frontcolor() et line() sont sans effet
Dans keyboard.pb, l'action des touches, à part escape est sans effet, je n'ai pas tout débuggué car les fonctions de dessin ou 3D m'intéressent peu dans purebasic mais je soupçonne un problème au niveau de la fonction loadsprite() ou openscreen(), le logo purebasic s'affiche bizarrement (en tout cas pas comme le code dit qu'il devrait s'afficher), il y a surement d'autres petits soucis mais je ne me suis pas attardé dessus car je suis en version démo pour me faire une idée avant un achat éventuel.