Page 1 sur 2

Packer et compression de structures ?

Publié : sam. 29/mai/2004 9:53
par comtois
pour sauvegarder mes structures je fais un truc comme ça

Code : Tout sélectionner

  If EnregistreFichier     
    If CreatePack(Chemin$)
      AddPackMemory(@Camera, SizeOf(Camera) ,7)
      AddPackMemory(@Light, SizeOf(Light) ,7)
      AddPackMemory(@Material, SizeOf(Material) ,7)
      AddPackMemory(@ImageMove, SizeOf(ImageMove) ,7)
      AddPackMemory(@Wave, SizeOf(Wave) ,7)
    EndIf
  EndIf  
Jusque là ,je pense que c'est correct ?
Par contre ,comment je récupère mes billes maintenant ??
j'ai essayé des trucs comme

Code : Tout sélectionner

UnpackMemory(NextPackFile() ,@Camera) 
On ne rigole pas dans le fond :)

Bref je sèche , j'ai cherché dans codeArchiv je n'ai rien vu , ça ne parle que de fichiers .

Publié : sam. 29/mai/2004 10:52
par Chris
Si tu sauvegarde dans un fichier sur le disque, il faut certainement charger le fichier dans un buffer, (AllocateMemory(Taille du fichier)), pour que le UnpackMemory fonctionne.

UnpackMemory(*BufferCompressé, *BufferDestination)

Mais j'ai pas trop compris la question, il me semble :oops:

Chris :)

Publié : sam. 29/mai/2004 11:05
par comtois
Je me disais bien que je n'étais pas très clair , alors je vais essayer de le dire autrement .

Je vais prendre un exemple concret.

J'ai une structure Light

Code : Tout sélectionner

Structure Light 
  Color.l 
  SpecularColor.l
  x.f 
  y.f 
  Z.f 
EndStructure

Light.light



Je voudrais faire un fichier compressé de cette structure.

Code : Tout sélectionner

If CreatePack(Chemin$) 
   AddPackMemory(@Light, SizeOf(Light) ,7) 
EndIf 
Déjà ça ,est-ce correct ? , en tout cas ,ça ne plante pas :)

Et ensuite je voudrais pouvoir récupérer les données compressées dans ma structure light.

Et c'est là que je bloque.

Avec un fichier non compressé
on fait

Code : Tout sélectionner

WriteData(@Light, SizeOf(Light)) 
Et pour le lire

Code : Tout sélectionner

ReaData(@Light, SizeOf(Light))
Donc par analogie j'ai fait pareil avec AddMemorypack()
Mais ensuite pour récupérer , je ne sais pas .

Publié : sam. 29/mai/2004 12:02
par comtois
Bon j'ai trouvé ,je fais comme ça :

Code : Tout sélectionner

mem=NextPackFile()
CopyMemory(mem,@Light,PackFileSize())

Publié : sam. 29/mai/2004 13:05
par Anonyme2
Sauf pour les chaînes car tu ne sauvegardera que l'adresse de la chaîne de ta structure, pas son contrenu, sizeof() renvoi la taille de la structure, quelque soit la longueur de la chaîne.

Publié : sam. 29/mai/2004 13:22
par comtois
Exact Denis , je n'y pensais plus , pourtant on me l'avait déjà dit :)

une piqûre de rappel de temps en temps , ça ne fait pas de mal :)

Publié : mer. 28/juil./2004 16:04
par gilles robert
J'ai un peu le même problème:

J'ai réussi à compresser une chaine que j'ai conservé sur mon disque dur.
Maintenant je desir décompresser ce dossier et le conserver sous un autre nom.

Pouvez-vous m'aider?

Merci,

Gilles

Publié : mer. 28/juil./2004 20:17
par comtois
Et comment as-tu fait pour ta chaine ? on peut voir le code ?

car comme Denis le disait , la méthode décrite ici fonctionne , sauf pour les chaines !
Denis a écrit :Sauf pour les chaînes car tu ne sauvegardera que l'adresse de la chaîne de ta structure, pas son contrenu, sizeof() renvoi la taille de la structure, quelque soit la longueur de la chaîne.

Petit rappel :
http://purebasic.hmt-forum.com/viewtopic.php?t=265

Publié : mer. 28/juil./2004 20:51
par Flype
probablement comme çà

Code : Tout sélectionner

Chemin$ ="c:\pack.pck"
Alpha$  ="abcedfghijklmnopqrstuvwxyz"
Numeric$="0123456789"

If CreatePack(Chemin$)
  Debug AddPackMemory(Alpha$,Len(Alpha$),7) 
  Debug AddPackMemory(Numeric$,Len(Numeric$),7) 
  ClosePack()
EndIf

If OpenPack(Chemin$)
  mem=NextPackFile()
  Debug PeekS(mem)
  mem=NextPackFile()
  Debug PeekS(mem)  
EndIf

Publié : mer. 28/juil./2004 21:20
par comtois
ah oui , ça me parait pas mal , sauf que si Gilles a fait comme ça , je ne vois pas où est son problème :)

Publié : mer. 28/juil./2004 21:41
par Flype
en gros le probleme est le suivant :

si on sauvegarde cette structure
ca marchera pas (sauf le pointeur)
Structure Test
Valeur.s
EndStructure

alors qu'une structure comme ca sera enregistrée
Structure Test
Valeur.b[256]
EndStructure

Publié : mer. 28/juil./2004 21:52
par comtois
oui pour moi c'est très clair , Attendons de voir si ça convient à Gilles :)

Sinon merci pour le truc avec les chaines de caractères , ça pourra me servir un jour .

Publié : ven. 30/juil./2004 14:04
par gilles robert
Merci pour votre attention, hélas je n'ai pas eu l'opportunité de répondre plus tôt.

Voici mon code simplifié car il fait partie d'un programme plus complexe.
En fait il s'agit d'un dossier existant déjà sur mon disque dur.

Code : Tout sélectionner

Dossier$="C:\dossier.aaa" ; nom du dossier comprimé
CreatePack(Dossier$)
art$="a_comprimer.txt" ; nom du dossier à comprimer
AddPackFile(art$,6) 
ClosePack() 
et la je n'arrive pas à récuperer le dossier.
Il existe bien (contrôlé avec explorer) est également fortrement comprimé mais j'ai éssayé avec:

Code : Tout sélectionner

OpenPack(Dossier$) 
adr=NextPackFile() 
Mais en fait 'adr' n'est qu'une adresse.

Voila les explications. :?:

Merci à tous,

Gilles

Publié : ven. 30/juil./2004 14:21
par Anonyme2
J'ai posté du code sur la compression en expliquant ce qui ne va pas.
Je pense que tu y trouveras ce que tu cherche.

Fred n'ayant jamais répondu, je ne sais pas si les problèmes que j'ai signalés ont été corrigés.

Publié : ven. 30/juil./2004 14:23
par Anonyme2