Page 1 sur 2

Dll et liste chainée

Publié : mar. 01/mai/2012 18:33
par blendman
salut
J'ai essayé de créer une dll pour permettre de sauvegarder des données (positions, et autres) des "objets" de mes éditeurs (2d et 3D).

Mais je n'arrive pas à sauvegarder la liste (list()) de ces objets via cette dll.
Savez-vous comment on fait ça avec une liste en globale si possible (ou un pointeur, si on est obligé ^^) ?

le code de la dll :

Code : Tout sélectionner

#savefile = 0

;{ structure
Structure vector3
  x.w : y.w : z.w
EndStructure

Structure StObject3D
  size.w
  pos.vector3 : rot.vector3
  type.a ; le type d'objet : 0 = object3D, 1 = light, 2 = water (createwaterr(), 4=createterrain, etc...
  name$ : meshname$ : materialname$
  entityId.w
EndStructure
Global NewList object.StObject3D()
;}


ProcedureDLL SaveScene3D()
  file$=SaveFileRequester("Save","","*.ark",0)
  MessageRequester("",Str(ListSize(object())))
  If file$ <>""
    If OpenFile(#savefile,RemoveString(file$,".ark")+".ark")
      WriteStringN(#savefile,"Scene 3D créée avec l'éditeur Arkeos Scene Editor 3D (Ase3D) - 2012")      
      ForEach object()    
         With object()
         Select  \type 
           Case 0 ; objet 3D
             param$ = "{Obj}"+Str(\entityId)+"/"+Str(\pos\x)+"/"+Str(\pos\y)+"/"+Str(\pos\z)+"/"
             WriteStringN(#savefile,param$)
             
           Case 1 ; light
             param$ = "{Light}"+Str(\entityId)+"/"+Str(\pos\x)+"/"+Str(\pos\y)+"/"+Str(\pos\z)+"/"
             WriteStringN(#savefile,param$)
             
         EndSelect
         
       EndWith        
      Next       
      CloseFile(#savefile)
    EndIf    
  EndIf  
EndProcedure

ProcedureDLL OpenScene3D()
  
EndProcedure
Un code test pour essayer.
L'idée c'est de sauvegarder les 11 objets, mais ça n'enregistre que la première ligne.

Code : Tout sélectionner

;{ Infos
; sauvegarder avec un fichier dll pour l'import/export (format)
; save witht a dll for import/export format
; date : 29 april 2012
; author : blendman
; pb : 4.61b2 win xp x32
;}

;{ Structure
Structure vector3
  x.w : y.w : z.w
EndStructure

Structure StObject3D
  size.w
  pos.vector3 : rot.vector3
  type.a ; le type d'objet : 0 = object3D, 1 = light, 2 = water (createwaterr(), 4=createterrain, etc...
  name$ : meshname$ : materialname$
  entityId.w
EndStructure
Global NewList object.StObject3D()

For i = 0 To 10
  AddElement(object())
  With object()
    \entityId = i
    \pos\x = Random(500)
    \pos\y = Random(500)
    \pos\z = Random(200)
  EndWith
Next i
;}

;{ enum, constante
#savefile =0
Enumeration
  #Win_0
EndEnumeration
;}

;{ declare
Declare SaveAsDll() : Declare OpenAsDll()
;}

;{ window
flag = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
If OpenWindow(#Win_0, 0,0,800, 600, "Dll import/export", flag)
EndIf
SetWindowColor(#win_0,RGB(120,120,120))
;{ menu
CreateMenu(0,WindowID(#win_0))
MenuTitle("Fichier")
MenuItem(0,"Ouvrir")
MenuItem(1,"Enregistrer")
;}
;}

;{ loop
Repeat
  Event =WaitWindowEvent()
  
  Select Event 
    Case #PB_Event_CloseWindow       
      quit=1
      
    Case #PB_Event_Menu
      Select EventMenu()
          
        Case 0; ouvrir fichier
          OpenAsDll()
          
        Case 1 ; enregistrer fichier
          SaveAsDll()
            
      EndSelect      
      
  EndSelect

Until quit
;}


;{ procedures


Procedure SaveAsDll()
  If OpenLibrary(0, "export.dll")
    CallFunction(0, "SaveScene3D")
    CloseLibrary(0)
  EndIf
EndProcedure

Procedure OpenAsDll()
  If OpenLibrary(0, "export.dll")
    CallFunction(0, "OpenScene3D")
    CloseLibrary(0)
  EndIf
EndProcedure

;}

Re: Dll et liste chainée

Publié : mar. 01/mai/2012 18:41
par G-Rom
Ta dll et ton programme ne partage pas la même liste chainée ;)

Re: Dll et liste chainée

Publié : mar. 01/mai/2012 18:48
par blendman
G-Rom a écrit :Ta dll et ton programme ne partage pas la même liste chainée ;)
heu, et ce n'est pas possible de faire ce que je voulais faire ? ou il y a un truc magique ou beaucoup plus compliqué pour ça ? :D

Re: Dll et liste chainée

Publié : mar. 01/mai/2012 19:00
par G-Rom
a la rigueur passé en pointeur la liste chainée , mais pb aime pas trop ce genre de bricolage.
le mieux est utilisé ton propre container , mais plus dur à codé.
Il faut maitriser les pointeurs, je vais te bidouiller un truc. ;)

Re: Dll et liste chainée

Publié : mar. 01/mai/2012 19:13
par G-Rom
la dll :

Code : Tout sélectionner

#savefile = 0

;{ structure
Structure vector3
  x.w : y.w : z.w
EndStructure

Structure StObject3D
  size.w
  pos.vector3 : rot.vector3
  type.a ; le type d'objet : 0 = object3D, 1 = light, 2 = water (createwaterr(), 4=createterrain, etc...
  name$ : meshname$ : materialname$
  entityId.w
EndStructure
; Global NewList object.StObject3D()
;}


ProcedureDLL SaveScene3D(*array.i, nbElement.i)
  
  offset = 0

  file$=SaveFileRequester("Save","","*.ark",0)
  MessageRequester("nombre elements",Str(nbElement))
  If file$ <>""
    If OpenFile(#savefile,RemoveString(file$,".ark")+".ark")
      WriteStringN(#savefile,"Scene 3D créée avec l'éditeur Arkeos Scene Editor 3D (Ase3D) - 2012")      
      For o = 0 To nbElement - 1

        *object.StObject3D = *array + offset
        
         Select  *object\type 
           Case 0 ; objet 3D
             param$ = "{Obj}"+Str(*object\entityId)+"/"+Str(*object\pos\x)+"/"+Str(*object\pos\y)+"/"+Str(*object\pos\z)+"/"
             WriteStringN(#savefile,param$)
             
           Case 1 ; light
             param$ = "{Light}"+Str(*object\entityId)+"/"+Str(*object\pos\x)+"/"+Str(*object\pos\y)+"/"+Str(*object\pos\z)+"/"
             WriteStringN(#savefile,param$)
         EndSelect

       offset + SizeOf(StObject3D)  ; element suivant     
      Next       
      CloseFile(#savefile)
    EndIf    
  EndIf  
EndProcedure

ProcedureDLL OpenScene3D()
  
EndProcedure

et le code de test :

Code : Tout sélectionner

;{ Infos
; sauvegarder avec un fichier dll pour l'import/export (format)
; save witht a dll for import/export format
; date : 29 april 2012
; author : blendman
; pb : 4.61b2 win xp x32
;}

;{ Structure
Structure vector3
  x.w : y.w : z.w
EndStructure

Structure StObject3D
  size.w
  pos.vector3 : rot.vector3
  type.a ; le type d'objet : 0 = object3D, 1 = light, 2 = water (createwaterr(), 4=createterrain, etc...
  name$ : meshname$ : materialname$
  entityId.w
EndStructure

; Global NewList object.StObject3D()
; 
; For i = 0 To 10
;   AddElement(object())
;   With object()
;     \entityId = i
;     \pos\x = Random(500)
;     \pos\y = Random(500)
;     \pos\z = Random(200)
;   EndWith
; Next i


Global *myArray.i = AllocateMemory( SizeOf( StObject3D ) * 10 ) ; on alloue 10 objets

offset = 0

For i = 0 To 10
  PokeW( *myArray + offset + OffsetOf(StObject3D\pos) + 0 , Random(500)   )
  PokeW( *myArray + offset + OffsetOf(StObject3D\pos) + 2 , Random(500)   )
  PokeW( *myArray + offset + OffsetOf(StObject3D\pos) + 4 , Random(500)   )
  offset + SizeOf( StObject3D ) ; on passe à l'élément suivant
Next i




;}

;{ enum, constante
#savefile =0
Enumeration
  #Win_0
EndEnumeration
;}

;{ declare
Declare SaveAsDll() : Declare OpenAsDll()
;}

;{ window
flag = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
If OpenWindow(#Win_0, 0,0,800, 600, "Dll import/export", flag)
EndIf
SetWindowColor(#win_0,RGB(120,120,120))
;{ menu
CreateMenu(0,WindowID(#win_0))
MenuTitle("Fichier")
MenuItem(0,"Ouvrir")
MenuItem(1,"Enregistrer")
;}
;}

;{ loop
Repeat
  Event =WaitWindowEvent()
  
  Select Event 
    Case #PB_Event_CloseWindow       
      quit=1
      
    Case #PB_Event_Menu
      Select EventMenu()
          
        Case 0; ouvrir fichier
          OpenAsDll()
          
        Case 1 ; enregistrer fichier
          SaveAsDll()
            
      EndSelect      
      
  EndSelect

Until quit
;}


;{ procedures


Procedure SaveAsDll()
  If OpenLibrary(0, "export.dll")
     CallFunction(0, "SaveScene3D",*myArray , 10)
    CloseLibrary(0)
  EndIf
EndProcedure

Procedure OpenAsDll()
  If OpenLibrary(0, "export.dll")
    CallFunction(0, "OpenScene3D")
    CloseLibrary(0)
  EndIf
EndProcedure

;}
d'ailleurs OffsetOf() ne marche pas pour une sous-structure , faire attention donc.

Re: Dll et liste chainée

Publié : mer. 02/mai/2012 10:50
par blendman
Merci encore une fois pour ton code G-rom ;).
Tu es vraiment sympa toi :D.

Bon, c'est un peu compliqué pour moi, mais je vais étudier ça à tête reposée et essayer de l'intégrer si j'y parviens ^^.

Sinon, je me posais la question si je ne pouvais pas utiliser la gestion des import endimport aussi pour ça ou d'autres fonctions ?
Cela permet -il de "partager" une liste par exemple ?
ça a l'air plus intéressant qu'une dll d'après la doc ^^.

Re: Dll et liste chainée

Publié : mer. 02/mai/2012 12:17
par G-Rom
tout ce qui est liste/map/tableau est propre à PB.
l'utilisation de pointeur est inévitable.

Image

L'image est facile à comprendre, j'alloue 20 octets.
j'écris le nombre 128 dans la zone mémoire à l'offset 5
je stocke l'adresse ( un pointeur ) de MonPoint à l'offset 6
une adresse est un pointeur. sur un x86 il faut 4 octets , sur un x64 le double.
je n'écris pas directement de float dans la zone mémoire ! mais l'adresse de MonPoint retourné par @MonPoint

pour récupéré la valeur de MonPoint ailleurs :

Code : Tout sélectionner

*pointeur = AllocateMemory(20)

Structure Vector2
  x.f
  y.f
EndStructure



MonPoint.Vector2
MonPoint\x = 51
MonPoint\y = 23

PokeI(*pointeur+6, @MonPoint)


*PointVide.Vector2 ; un point vide...
*PointVide = PeekI(*pointeur + 6)   ; on lis notre adresse de MonPoint
Debug *PointVide\x
Debug *PointVide\y

Re: Dll et liste chainée

Publié : mer. 02/mai/2012 12:24
par blendman
wahou, merci pour l'explication, c'est vraiment clair comme ça !

Tu devrais la poster dans les tutoriaux, et l'appeler "pointeur", je crois que ce serait utile pour pas mal d'utilisateurs ;)

Re: Dll et liste chainée

Publié : mer. 02/mai/2012 16:07
par omega
@G-Rom

Bravo g-rom ! Dis-moi : tu as vraiment fait tout ça en 10 minutes??

c génial !

Re: Dll et liste chainée

Publié : mer. 02/mai/2012 16:15
par G-Rom
Merci , j'ai fait quoi en dix minutes ? :mrgreen:

Re: Dll et liste chainée

Publié : mer. 02/mai/2012 16:37
par omega
@G-Rom

Le code source + le schema du pointeur avec ton explication si géniale + DLL ect...
ci-dessus

Tu fais partie de l'équipe qui a développé Pure basic??

Tu n'es pas obligé de répondre mais je suis curieux de savoir

MERCI encore et bravo G-Rom !

Re: Dll et liste chainée

Publié : mer. 02/mai/2012 16:51
par G-Rom
Merci , je ne fait pas partie de l'équipe, mais je contribue volontairement à ma partie 3D. :P

Re: Dll et liste chainée

Publié : mer. 02/mai/2012 16:54
par blendman
G-Rom a écrit :Merci , je ne fait pas partie de l'équipe, mais je contribue volontairement à ma partie 3D. :P
Tiens, ce serait possible d'avoir un peu plus de détails sur cette contribution niveau 3D, car ça m'intéresse vraiment :D (même si je sais déjà quelques trucs ;))?

Re: Dll et liste chainée

Publié : mer. 02/mai/2012 17:06
par G-Rom
Qu'est ce que tu veut savoir ? je ne peut pas tout dire, je suis tenu à une certaine retenue quand même.

Re: Dll et liste chainée

Publié : mer. 02/mai/2012 17:37
par blendman
G-Rom a écrit :Qu'est ce que tu veut savoir ? je ne peut pas tout dire, je suis tenu à une certaine retenue quand même.
juste ce sur quoi tu as travaillé en 3D sur PB, les ajouts par exemple auxquels tu as collaboré et éventuellement, si tu comptes continuer à ajouter d'autres choses ^^ (tu peux le dire par mp, si tu préfères ;)).