2 petites questions d'un linuxien

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: 2 petites questions d'un linuxien

Message par G-Rom »

Donne toujours le log si tu veut un coup de main ainsi que le retour terminal.

@+ :wink:
choubibar
Messages : 21
Inscription : jeu. 18/mars/2010 16:21

Re: 2 petites questions d'un linuxien

Message par choubibar »

Salut,

j'ai toujours la même erreur, mais peu importe car j'ai pu me faire une idée de l'engine3D sous windows.

Je n'ai toujours pas su résoudre mon problème de progressbar sous linux également.

En testant purebasic, je suis tombé sur l'api library que je me suis empressé de tester, j'ai à peu près tout compris sauf le callcfunction et callcfunctionfast ...

voici mes différents codes de tests, je me sers d'une librairie basique dynamique et statique compilée en C sous codeblocks avec gcc :

- premier test : import, ok pas de souci avec cette méthode

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
second test : utilisation de prototype, pas de souci, ça fonctionne bien également.

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


3ème test avec les fonctions callcfunction et callcfunctionfast, là je n'y comprend rien, je ne sais pas où j'ai tout faux (voir commentaires du code), au passage j'ai testé toutes les fonctions de library sauf islibrary

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
n'ayant que la version de démo pour l'instant, je ne peux pas compiler de librairie partagée, qq'un peut il me dire si le code ci dessous serait correct (c'est une retranscription de celui utilisé en C

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


j'ai encore un tas de questions à propos de l'api scintilla également :mrgreen: mais chaque chose en son temps.

merci par avance pour le coup de main de linuxiens

@+ ;)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: 2 petites questions d'un linuxien

Message par G-Rom »

Je n'ai toujours pas su résoudre mon problème de progressbar sous linux également.
Développe ;)

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
Ton code est bon.


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.
choubibar
Messages : 21
Inscription : jeu. 18/mars/2010 16:21

Re: 2 petites questions d'un linuxien

Message par choubibar »

G-Rom a écrit :Ton code est bon.
Salut,

merci pour la confirmation, c'est déjà ça d'assimiler :mrgreen:
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.
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.

concernant le progressbar sous linux, bien qu'utilisant ce code :

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


j'ai le backcolor et le frontcolor du gadget progressbar qui ne fonctionnent pas

je me retrouve avec un progressbar comme cela :

Image

alors que le fond devrait être de couleur bleue de mémoire
et la barre de couleur rouge

le réglage des paramètres PB_Gadget_front et backcolor est sans effet sous linux (je n'ai pas encore testé si d'autres gadgets ont ce même comportement sous kubuntu)

@+ ;)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: 2 petites questions d'un linuxien

Message par G-Rom »

Pareil que toi pour la progress bar , sauf que le gadget est un peu "transparent" ce qui laisse passé la couleur de la fenêtre à certain endroit.
KDE c'est du GTK 2 aussi non ?
choubibar
Messages : 21
Inscription : jeu. 18/mars/2010 16:21

Re: 2 petites questions d'un linuxien

Message par choubibar »

Salut,

en fait, ubuntu utilise gnome avec gtk+, kubuntu utilise kde avec qt

je ferai un test du code sous ubuntu pour voir, c'est bien possible que le problème vienne de là ...

@+ ;)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: 2 petites questions d'un linuxien

Message par G-Rom »

Merci pour Ubuntu je le savais , je suis dessus :D
donc pour résumé , on se retrouve avec 2 api complètement différentes...
il faudrais que fred confirme , mais pb supporte gnome il me semble.
choubibar
Messages : 21
Inscription : jeu. 18/mars/2010 16:21

Re: 2 petites questions d'un linuxien

Message par choubibar »

Salut,

effectivement j'ai testé sur ubuntu le progressbar fonctionne très bien, donc méfiance avec certains paramètres selon les distributions linux....je suis à peu près certain que les gadgets 3D merdouillent chez moi également à cause de kde

@+ ;)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: 2 petites questions d'un linuxien

Message par G-Rom »

Rien à voir les gadget3D sont le fruit 100% d'ogre3D
choubibar
Messages : 21
Inscription : jeu. 18/mars/2010 16:21

Re: 2 petites questions d'un linuxien

Message par choubibar »

Salut,

pour en revenir aux librairies, il faut qd même faire attention avec purebasic qd on utilise une fonction importée et il vaut mieux passer par une variable intermédiaire si on veut éviter certains plantages (voir mon code lignes 10 & 11).
ex :

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
Par contre, pas de souci avec le prototypage, je peux faire comme ceci sans mauvaise surprise:

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
bon à savoir tout ça

@+ ;)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: 2 petites questions d'un linuxien

Message par G-Rom »

PureBasic Utilise GTK pour la rendu de GUI. que ce soit sous KDE ou gnome , d'ou la différence de graphisme.

@+
choubibar
Messages : 21
Inscription : jeu. 18/mars/2010 16:21

Re: 2 petites questions d'un linuxien

Message par choubibar »

Salut,

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.

autre série de remarques concernant la librairie scintilla.
Je me trompe peut être mais sous linux, l'appel à des lexers autre que container n'est pas possible avec la lib scintilla fournie (505,3 ko), au départ je me suis amusé à coder mon propre lexer (ce qui est plutôt long à faire) et en me plongeant dans les sources de scintilla pour me renseigner, j'ai carrément recompilé la librairie avec tous ses lexers (1,2 mo) et là miracle les lexers fonctionnent sans réinventer l'eau chaude dans purebasic . Je ne sais pas si c'est une limitation voulue par la démo ou si la librairie scintilla est incomplète dans sa version linux (demo ou pas)

@+ ;)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: 2 petites questions d'un linuxien

Message par G-Rom »

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.
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 ^^
je pense que les exemples ne sont pas à jour par rapport à la démo.

Pour scintilla , j'en sais rien ^^

@+
choubibar
Messages : 21
Inscription : jeu. 18/mars/2010 16:21

Re: 2 petites questions d'un linuxien

Message par choubibar »

Salut,

merci pour tes réponses...

il est temps pour moi de m'attaquer à un véritable programme avec purebasic, histoire de voir ce qu'il a dans le ventre et de me faire la main sur un peu toutes les fonctions disponibles ...

@+ ;)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: 2 petites questions d'un linuxien

Message par G-Rom »

Pas de soucis , si tu rencontres des problèmes je serais ravis de te venir en aide ;)
Répondre