Seite 1 von 2

Problem mit Pointer :(

Verfasst: 14.09.2013 16:43
von True29
Hallo ,
Ich würde gerne mit folgendem Code
den inhalt in meinem Speicher "Explode.Particle" die 2 Testwerte speichern in einer Datei und wieder laden.
Irgendwie klappt das gerade nicht :( und ich sehe irgendwie auch keinen Fehler.
Vielleicht kann mir wer bitte den Code korrigieren.
PB 5.20 B19

Mfg und danke für die Hilfe ;)

Code: Alles auswählen

Structure Particle
  maxparticle.i
  fLifeTime.f
EndStructure

UseBriefLZPacker() : EnableExplicit

Global Explode.Particle
Define *Explode.Particle

Procedure SaveStrukt(*explode, file.s)  
  Protected FF = CreateFile(#PB_Any, file)  
  Protected *dest = AllocateMemory(SizeOf(Particle))
  Protected length
  
  If FF And *dest              
    length = CompressMemory(*explode, SizeOf(Particle), *dest, SizeOf(Particle),#PB_PackerPlugin_BriefLZ)
    If length = 0
      MessageRequester("Error","allgemeiner Fehler! CompressMemory")
    EndIf
    
    If WriteData(FF, *dest, length) = 0
      MessageRequester("Error","allgemeiner Fehler! Writedata")
    EndIf  

    CloseFile(FF)
    FreeMemory(*dest)        
    ProcedureReturn #True
  EndIf  
  ProcedureReturn #False
EndProcedure

Procedure LoadStrukt(file.s)
  Protected FF = ReadFile(#PB_Any, file)
  Protected length, *source, *dest
  If FF
    length = Lof(FF)
    If length > 0 
      *source = AllocateMemory(length)
      *dest = AllocateMemory(SizeOf(Particle))
      If *source And *dest
        If ReadData(FF, *source, length) = 0
          MessageRequester("Error","allgemeiner Fehler! ReadData")
        EndIf
        If UncompressMemory(*source, length, *dest, SizeOf(Particle),#PB_PackerPlugin_BriefLZ) = 0
          MessageRequester("Error","allgemeiner Fehler! UncompressMemory")
        EndIf        
        FreeMemory(*source)
      EndIf
      CloseFile(FF)      
      ProcedureReturn *dest
    EndIf
  EndIf
  ProcedureReturn #False
EndProcedure


;Testwerte
Explode\fLifeTime = 1.0
Explode\maxparticle = 100


;Speichern

SaveStrukt(@Explode,"\test.dat")
Explode\fLifeTime = 0
Explode\maxparticle = 0

;Laden

*Explode = LoadStrukt("\test.dat")   

Debug Explode\fLifeTime
Debug Explode\maxparticle

Re: Problem mit Pointer :(

Verfasst: 14.09.2013 17:09
von ts-soft
In den letzten beiden Zeilen fehlt der Asterix (oder Obelix?) :wink: *
ansonsten kann es nicht gepackt werden, weil der Dest-Speicher zu klein ist.
Bei so kleinem Speicher, wo packen gar keinen Sinn macht und der Header
des Archives grösser ist, als das was gepackt werden soll, weigert er sich
natürlich.
Entweder bei rückgabe von 0 nicht packen oder für den Dest-Speicher eine
Mindestgrösse setzen. Die gepackte Strukture (12 Bytes) ist nach dem
Packen 32 Bytes gross :mrgreen: , das ist also das Hauptproblem.

Re: Problem mit Pointer :(

Verfasst: 14.09.2013 17:18
von True29
danke ts-soft ;)

Hatte schon versucht das ganze ohne CompressMemory zu realisieren.
Denn die Daten müssen hier nicht gekpackt werden.
Jedoch hatte ich es nicht hinbekommen ;)

Wie würde denn das ganze ohne CompressMemory/Packen aussehen?

Muss ich nach dem Laden , dann immer mit zeigern weiterarbeiten? oder wie würde man die übergabe an die variable realisieren ?
Grüße.

update hab nun versucht die prozeduren anzupassen so das sie nicht packen:

Code: Alles auswählen

Procedure SaveStrukt(*explode, file.s)  
  Protected FF = CreateFile(#PB_Any, file)  
  Protected *dest = AllocateMemory(SizeOf(Particle))
  Protected length
  
  If FF And *dest              
    length = MemorySize(*dest)
    If length = 0
      MessageRequester("Error","allgemeiner Fehler! CompressMemory")
    EndIf
    
    If WriteData(FF, *dest, length) = 0
      MessageRequester("Error","allgemeiner Fehler! Writedata")
    EndIf  

    CloseFile(FF)
    FreeMemory(*dest)        
    ProcedureReturn #True
  EndIf  
  ProcedureReturn #False
EndProcedure

Procedure LoadStrukt(file.s)
  Protected FF = ReadFile(#PB_Any, file)
  Protected length, *source, *dest
  If FF
    length = Lof(FF)
    If length > 0 
      *source = AllocateMemory(length)
      *dest = AllocateMemory(SizeOf(Particle))
      If *source And *dest
        If ReadData(FF, *source, length) = 0
          MessageRequester("Error","allgemeiner Fehler! ReadData")
        EndIf        
        FreeMemory(*source)
      EndIf
      CloseFile(FF)      
      ProcedureReturn *dest
    EndIf
  EndIf
  ProcedureReturn #False
EndProcedure
stimmt das so ?

Re: Problem mit Pointer :(

Verfasst: 14.09.2013 23:24
von True29
schade :( 60 besucher und keine Hilfe.

Re: Problem mit Pointer :(

Verfasst: 14.09.2013 23:51
von - chris -
So könnte es aussehen:

Code: Alles auswählen


EnableExplicit

Structure Particle
  maxparticle.i
  fLifeTime.f
EndStructure

Define Explode.Particle

Procedure SaveStrukt(*explode, file.s)

  Protected FF.i

  FF = CreateFile(#PB_Any, file)

  If FF

    WriteData(FF, *explode, SizeOf(Particle))

    CloseFile(FF)

  EndIf

EndProcedure

Procedure LoadStrukt(*explode, file.s)

  Protected FF.i, length.i

  FF = ReadFile(#PB_Any, file)

  If FF

    length = Lof(FF)

    If length = SizeOf(Particle)

      ReadData(FF, *explode, SizeOf(Particle))

    EndIf
    
    CloseFile(FF)
    
  EndIf

EndProcedure

;Testwerte
Explode\fLifeTime   = 1.0
Explode\maxparticle = 100

;Speichern
SaveStrukt(Explode, "test.dat")
Explode\fLifeTime   = 0
Explode\maxparticle = 0

;Laden
LoadStrukt(Explode, "test.dat")
Debug Explode\fLifeTime
Debug Explode\maxparticle


Re: Problem mit Pointer :(

Verfasst: 15.09.2013 00:00
von True29
@- chris - ;) danke funktioniert super Hilfe von dir.

Update:
Der Code funktioniert so lange bis ein Array in der Structur ist :(
Beim Anzeigen meines Arrays aus der Structur bekomme ich ein
"Invalid memmory access" oder "Array index out of Bounds"

Hat wer vielleicht dazu eine Idee ?
Grüße.

Re: Problem mit Pointer :(

Verfasst: 15.09.2013 00:20
von True29
Neuer Code welcher Das Problem mit dem Array darstellen soll.
Ich bekomme keine Fehlermeldung jedoch werden die werte nicht übernommen.

Code: Alles auswählen

EnableExplicit

Structure Particle
  maxparticle.i
  fLifeTime.f
  Array Vector2_velocity.f(1)
EndStructure

Define Explode.Particle

Procedure SaveStrukt(*explode, file.s)
Protected FF = CreateFile(#PB_Any, file)
  If FF
    If WriteData(FF, *explode, SizeOf(Particle)) = 0
      MessageRequester("Error","allgemeiner Fehler! Writedata")
    EndIf  
    CloseFile(FF)
    ProcedureReturn #True
  EndIf
ProcedureReturn #False  
EndProcedure

Procedure LoadStrukt(*explode, file.s)
  Protected FF = ReadFile(#PB_Any, file)
  Protected length.i  

  If FF
    length = Lof(FF)
    If length = SizeOf(Particle)
      If ReadData(FF, *explode, SizeOf(Particle)) = 0       
        MessageRequester("Error","allgemeiner Fehler! ReadData")
      EndIf 
    EndIf   
    CloseFile(FF)   
    ProcedureReturn #True
  EndIf
ProcedureReturn #False  
EndProcedure

;Testwerte
Explode\fLifeTime   = 1.0
Explode\maxparticle = 100

Explode\Vector2_velocity.f(0) = 300.0
Explode\Vector2_velocity.f(1) = 300.0

;Speichern
SaveStrukt(Explode, "test.dat")
Explode\fLifeTime   = 0
Explode\maxparticle = 0
Explode\Vector2_velocity.f(0) = 0.0
Explode\Vector2_velocity.f(1) = 0.0

;Laden
LoadStrukt(Explode, "test.dat")
Debug Explode\fLifeTime
Debug Explode\maxparticle
Debug Explode\Vector2_velocity.f(0) 
Debug Explode\Vector2_velocity.f(1) 

Re: Problem mit Pointer :(

Verfasst: 15.09.2013 00:21
von - chris -
Mit Array funktioniert es, zum Beispiel so:

Code: Alles auswählen


Structure Particle
  maxparticle.i
  fLifeTime.f
  werte.l[20]
EndStructure


Re: Problem mit Pointer :(

Verfasst: 15.09.2013 00:33
von True29
hm sobald ich da einen wert hinzufügen will kommt "structure array index out of bounds"

Code: Alles auswählen

Structure Particle
  maxparticle.i
  fLifeTime.f
  Vector2_velocity.f[1]
EndStructure
Define Explode.Particle
Explode\Vector2_velocity.f[0] = 300.0
Explode\Vector2_velocity.f[1] = 300.0
wo liegt der unterschied zwichen.
.....[] und array ....()

Grüße.

Re: Problem mit Pointer :(

Verfasst: 15.09.2013 00:36
von - chris -

Code: Alles auswählen


EnableExplicit

Structure Particle
  maxparticle.i
  fLifeTime.f
  Vector2_velocity.f[2] ; 2 Floats verfügbar (von 0 bis 1)
EndStructure

Define Explode.Particle

Procedure SaveStrukt(*explode, file.s)

  Protected FF.i

  FF = CreateFile(#PB_Any, file)

  If FF

    WriteData(FF, *explode, SizeOf(Particle))

    CloseFile(FF)

  EndIf

EndProcedure

Procedure LoadStrukt(*explode, file.s)

  Protected FF.i, length.i

  FF = ReadFile(#PB_Any, file)

  If FF

    length = Lof(FF)

    If length = SizeOf(Particle)

      ReadData(FF, *explode, SizeOf(Particle))

    EndIf
    
    CloseFile(FF)
    
  EndIf

EndProcedure

;Testwerte
Explode\fLifeTime   = 1.0
Explode\maxparticle = 100
Explode\Vector2_velocity[0] = 300.0
Explode\Vector2_velocity[1] = 400.0

;Speichern
SaveStrukt(Explode, "test.dat")
Explode\fLifeTime   = 0
Explode\maxparticle = 0
Explode\Vector2_velocity[0] = 0
Explode\Vector2_velocity[1] = 0

;Laden
LoadStrukt(Explode, "test.dat")
Debug Explode\fLifeTime
Debug Explode\maxparticle
Debug Explode\Vector2_velocity[0]
Debug Explode\Vector2_velocity[1]