Packer et tabeau structurer

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Packer et tabeau structurer

Message par Thyphoon »

Hé oui désolé, je passe mon temps a poser des questions. Vous allez finir par me trouver casse co.......

Comment feriez-vous pour enregistrer dans un fichier pack (lib packer de Purebasic) des tableaux avec structure et les restaurer ensuite ?
exemple, je voudrais sauvegarder le contenu de ces tableaux/variables dans un pack

Code : Tout sélectionner

Structure AnimStructure
  Sprite.w
  Delay.w
  Dx.b
  Dy.b
  Sound.w
EndStructure

#AnimMax=1000
#ImageMax=10

Global Dim Anim.AnimStructure(#AnimMax,#ImageMax)
Global Dim Anim_NbImage.w(#AnimMax)              ;(No de l'Animation) contient le nombre d'image de l'anim
Global NbSprite.l,NbAnim.l

Structure Map
  Element.w
  Light.w
  State.b
  Image.w
  Delay.l
  Info.s
EndStructure

;- Map
#MapWidthMax=512
#MapHeightMax=512
; Largeur ou Hauteur Maximum d'une carte
Global Dim Map.Map(#MapWidthMax,#MapHeightMax)

Je suppose qu'il doit y avoir une solution simple avec les pointeurs, mais je dois me planter

j'ai essayer des trucs du genre

Code : Tout sélectionner

AddPackMemory(*Map(), 512*512*(2+1+2+4+10) ,9)
le 2+1+2+4+10) correspond au octet prit par la structure (sauf erreur)
Le +10 comme je ne sais pas trop comment savoir la taille du faite d'un string j'ai mis 10 car je n'ai pas (pour l'instant de texte de pus de 4 Caractère)

et je pensais pouvoir faire une restauration simple du genre

Code : Tout sélectionner

UnpackMemory(NextPackFile(),*Map())
Une idée ?
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

utilise sizeof() pour la taille de ta structure

la structure ne stocke que le pointeur vers la string et pas la string elle meme...

pat
Dernière modification par Patrick88 le ven. 02/mars/2007 17:29, modifié 1 fois.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Patrick88 a écrit :utilise sizeof() pour la taille de ta structure

pat
Merci pour l'astuce j'avais oublié cette fonction merci !!
Sinon ce que j'essaye de faire ça devrait marché (sur le principe) ?
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

comment on fait pour connaitre la taille d'un tableau simple de string ?

Code : Tout sélectionner

dim tableau.s(1000)
debug sizeof(tableau)
j'ai un message d'erreur...
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

sizeof ne marche que sur les structures....

un code pour sauver une chaine de caractère comprise dans une structure
( y'a surement moyen de faire plus simple ... )

Code : Tout sélectionner

Structure struc
  entier.w
  chaine.s
  chaine2.b[10]
EndStructure

ma_stru.struc

With ma_stru
  \entier = 123
  \chaine = "pointeur sauvé"
  tmp.s = "10 caract."
  For i = 1 To Len(tmp)
  	\chaine2[i-1] = Asc(Mid(tmp,i,1))
  Next
EndWith

If CreateFile(0,"\essai.dat")
  WriteData(0,ma_stru,SizeOf(struc))
  CloseFile(0)
EndIf
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Patrick88 a écrit :sizeof ne marche que sur les structures....
Merci beaucoup !

Si quelqu'un comprend ce qui ne vas pas dans ce code

Code : Tout sélectionner

Structure AnimStructure
  Sprite.w
  Delay.w
  Dx.b
  Dy.b
  Sound.w
EndStructure

#AnimMax=10
#ImageMax=10

Global Dim Anim.AnimStructure(#AnimMax,#ImageMax)
;On met des variable
For A=0 To #AnimMax
  For B=0 To #ImageMax
    Anim(A,B)\Sprite=Random(20)
    Debug "Anim("+Str(A)+","+Str(B)+")="+Str(Anim(A,B)\Sprite)
  Next
Next

;On sauvegarde
Debug"###############################"

If CreatePack("test.pak")
  AddPackMemory(@Anim, SizeOf(AnimStructure)*#AnimMax*#ImageMax, 9)
  ClosePack()
EndIf

;On remet les variables a Zero
For A=0 To #AnimMax
  For B=0 To #ImageMax
    Anim(A,B)\Sprite=0
    Debug "Anim("+Str(A)+","+Str(B)+")="+Str(Anim(A,B)\Sprite)
  Next
Next
Debug"###############################"

;On recharge les donnée
If OpenPack("test.pak")
  Mem = NextPackFile()
  UnpackMemory(Mem,@Anim)
  ClosePack()
EndIf

;On verifie que la varible sont de nouveau bien rempli 
For A=0 To #AnimMax
  For B=0 To #ImageMax
    Debug "Anim("+Str(A)+","+Str(B)+")="+Str(Anim(A,B)\Sprite)
  Next
Next
Debug"###############################"
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Code : Tout sélectionner

Structure AnimStructure
  Sprite.w
  Delay.w
  Dx.b
  Dy.b
  Sound.w
EndStructure

#AnimMax=10
#ImageMax=10

Global Dim Anim.AnimStructure(#AnimMax,#ImageMax)
;On met des variable
For A=0 To #AnimMax
  For B=0 To #ImageMax
    Anim(A,B)\Sprite=i
    i+1
    Debug "Anim("+Str(A)+","+Str(B)+")="+Str(Anim(A,B)\Sprite)
  Next
Next

;On sauvegarde
Debug"###############################"

If CreatePack("test.pak")
  AddPackMemory(@Anim(), SizeOf(AnimStructure)*(#AnimMax+1)*(#ImageMax+1), 9)
  ClosePack()
EndIf

;On remet les variables a Zero
For A=0 To #AnimMax
  For B=0 To #ImageMax
    Anim(A,B)\Sprite=0
    Debug "Anim("+Str(A)+","+Str(B)+")="+Str(Anim(A,B)\Sprite)
  Next
Next
Debug"###############################"

;On recharge les donnée
Debug "charge pack"
If OpenPack("test.pak")
  *Ptr=NextPackFile()
  Taille=PackFileSize()
  CopyMemory(*Ptr,Anim(),Taille)
  ClosePack()
EndIf

;On verifie que la varible sont de nouveau bien rempli
For A=0 To #AnimMax
  For B=0 To #ImageMax
    Debug "Anim("+Str(A)+","+Str(B)+")="+Str(Anim(A,B)\Sprite)
  Next
Next
Debug"###############################"
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

SizeOf(AnimStructure)*#AnimMax*#ImageMax

C'est faux, exemple: un tableau a(10) peut contenir 11 valeur (0 à 11)

AddPackMemory(@Anim, SizeOf(AnimStructure)*#AnimMax*#ImageMax, 9)

@Anim --> Elle sort d'où cette variable --> @Anim()

UnpackMemory(Mem,@Anim) heu Mem est déjà compressé! faudrait un copymemory
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'ai l'impression que j'ai quelques minutes de retard. :lol:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

non tu arrives à point pour donner les explications :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

@Comtois
Encore une fois de plus tu me débloque ! :D J'ai compris ou était mon erreur. j'étaie persuadé que que Unpackmemory et l'était l'inverse de AddPackMemory

@Nico
Merci je comprend mieux une de mes erreurs...

@Nico&@Comtois
Est ce que part hasard vous seriez comment connaitre la taille d'un tableau de string du type Dim Name.s(1000)

Un grand merci
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Tableau de string est un tableau de pointeurs (4 octets par pointeur donc)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

nico a écrit :Tableau de string est un tableau de pointeurs (4 octets par pointeur donc)
A oui donc je peux pas utiliser la même technique si j'ai bien compris...car sinon je vais sauvegarder l'adresse des pointeurs mais pas le texte...
Une idée pour mettre un trableau comme ça dans un pack ?
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Tiens, essai donc ce code pour voir si ça fait l'affaire.

Et donne des nouvelles.

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; CODE GÉNÉRÉ AUTOMATIQUEMENT, NE PAS MODIFIER À
; MOINS D'AVOIR UNE RAISON TRÈS TRÈS VALABLE !!!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure <<<<<

Structure Map
   
   Element.w
   Light.w
   state.b
   Image.w
   Delay.l
   Info.s
   
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs <<<<<

Macro SetMapElement(MapA, Element_Word)
   
   MapA\Element = Element_Word
   
EndMacro

Macro SetMapLight(MapA, Light_Word)
   
   MapA\Light = Light_Word
   
EndMacro

Macro SetMapstate(MapA, state_Byte)
   
   MapA\state = state_Byte
   
EndMacro

Macro SetMapImage(MapA, Image_Word)
   
   MapA\Image = Image_Word
   
EndMacro

Macro SetMapDelay(MapA, Delay_Long)
   
   MapA\Delay = Delay_Long
   
EndMacro

Macro SetMapInfo(MapA, Info_String)
   
   MapA\Info = Info_String
   
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs <<<<<

Macro GetMapElement(MapA)
   
   MapA\Element
   
EndMacro

Macro GetMapLight(MapA)
   
   MapA\Light
   
EndMacro

Macro GetMapstate(MapA)
   
   MapA\state
   
EndMacro

Macro GetMapImage(MapA)
   
   MapA\Image
   
EndMacro

Macro GetMapDelay(MapA)
   
   MapA\Delay
   
EndMacro

Macro GetMapInfo(MapA)
   
   MapA\Info
   
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Update <<<<<

Macro UpdateMap(MapA, Element_Word, Light_Word, state_Byte, Image_Word, Delay_Long, Info_String)
   
   SetMapElement(MapA, Element_Word)
   SetMapLight(MapA, Light_Word)
   SetMapstate(MapA, state_Byte)
   SetMapImage(MapA, Image_Word)
   SetMapDelay(MapA, Delay_Long)
   SetMapInfo(MapA, Info_String)
   
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Lecture fichier Binaire <<<<<

Procedure ReadMap(FileID.l, *MapA.Map)
   
   SetMapElement(*MapA, ReadWord(FileID))
   SetMapLight(*MapA, ReadWord(FileID))
   SetMapstate(*MapA, ReadByte(FileID))
   SetMapImage(*MapA, ReadWord(FileID))
   SetMapDelay(*MapA, ReadLong(FileID))
   SetMapInfo(*MapA, Space(ReadLong(FileID)))
   ReadData(FileID, @GetMapInfo(*MapA), Len(GetMapInfo(*MapA)))
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Écriture fichier Binaire <<<<<

Procedure WriteMap(FileID.l, *MapA.Map)
   
   WriteWord(FileID, GetMapElement(*MapA))
   WriteWord(FileID, GetMapLight(*MapA))
   WriteByte(FileID, GetMapstate(*MapA))
   WriteWord(FileID, GetMapImage(*MapA))
   WriteLong(FileID, GetMapDelay(*MapA))
   WriteLong(FileID, Len(GetMapInfo(*MapA)))
   WriteData(FileID, @GetMapInfo(*MapA), Len(GetMapInfo(*MapA)))
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Lecture d'un tableau dynamique dans le fichier en cours <<<<<

Procedure ReadDynamicArrayOfMap(FileID.l, Array.Map(1))
   
   Array_Max.l = ReadLong(FileID)
   
   Redim Array.Map(Array_Max)
   
   For Index = 0 To Array_Max
      ReadMap(FileID, Array(Index))
   Next
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Écriture d'un tableau dynamique dans le fichier en cours <<<<<

Procedure WriteDynamicArrayOfMap(FileID.l, Array.Map(1))
   
   WriteLong(FileID, (PeekL(@Array() - 8) - 1))
   
   For Index = 0 To (PeekL(@Array() - 8) - 1)
      WriteMap(FileID, Array(Index))
   Next
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Macro de déboguage <<<<<

Macro DebugMap(MapA)
   
   Debug GetMapElement(MapA)
   Debug GetMapLight(MapA)
   Debug GetMapstate(MapA)
   Debug GetMapImage(MapA)
   Debug GetMapDelay(MapA)
   Debug GetMapInfo(MapA)
   
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 00.047 secondes <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< On crée un tableau de map <<<<<

Dim TableauMap.Map(3)
Dim TableauMap2.Map(3) ; Lui c'est pour le test de chargement seulement

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< On initalise le tableau de map <<<<<

UpdateMap(TableauMap(0), 55, 1, 0, 25, 150, "Montagne")
UpdateMap(TableauMap(1), 56, 5, 0, 26, 115, "Océan")
UpdateMap(TableauMap(2), 57, 3, 0, 27, 175, "Fleuve")
UpdateMap(TableauMap(3), 58, 2, 0, 28, 132, "Champs")

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< On debug pour voir si l'initialisation à marché <<<<<

Debug "========================================="
Debug "Les données originales"
Debug ""

For Index = 0 To 3
   Debug "La map no. = " + Str(Index)
   DebugMap(TableauMap(Index))
   Debug ""
Next

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Création du fichier data <<<<<

If CreateFile(0, "Maps.data")
   
   WriteDynamicArrayOfMap(0, TableauMap())
   
   CloseFile(0)
EndIf

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Création du fichier pack <<<<<

If CreatePack("Maps.pack")

   AddPackFile("Maps.data", 9)
   
   ClosePack()
   
EndIf

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ouverture du fichier pack <<<<<

If OpenPack("Maps.pack")
   
   Memory = NextPackFile() 
   MemorySize = PackFileSize()

   ; On créer le fichier
   If CreateFile(0, "Maps2.data")
      WriteData(0, Memory, MemorySize)
      CloseFile(0)
      Success.b = #True
   EndIf
   
   If OpenFile(1, "Maps2.data")
      
      ReadDynamicArrayOfMap(1, TableauMap2())
      
      CloseFile(1)
      
      ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      ; On a lu les données, on détruit le fichier. On a une 
      ; copie dans le fichier pack, de toute façon.
      
      DeleteFile("Maps2.data") 
 
   EndIf
   
   ClosePack()

EndIf

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< On debug pour voir si la décompression à marché <<<<<

Debug "========================================="
Debug "Décompression du fichier pack"
Debug ""

For Index = 0 To 3
   Debug "La map no. = " + Str(Index)
   DebugMap(TableauMap2(Index))
   Debug ""
Next

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Guimauve a écrit :Tiens, essai donc ce code pour voir si ça fait l'affaire.

Et donne des nouvelles.

A+
Guimauve
Je viens de tester c'est génial!!!
je suis levé depuis 2H00 du matin..donc je vais aller me couché, mais demain je vais approfondir ta méthode... Qui fonctionne a merveille !! Un grand merci
Répondre