Problem mit Pointer :(

Für allgemeine Fragen zur Programmierung mit PureBasic.
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Problem mit Pointer :(

Beitrag 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
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Problem mit Pointer :(

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Problem mit Pointer :(

Beitrag 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 ?
i7,12gb ram , Windows 10 ,Purebasic 5.50
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Problem mit Pointer :(

Beitrag von True29 »

schade :( 60 besucher und keine Hilfe.
i7,12gb ram , Windows 10 ,Purebasic 5.50
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: Problem mit Pointer :(

Beitrag 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

PB v5.72 x86/x64
Windows 10 Pro 64bit
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Problem mit Pointer :(

Beitrag 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.
i7,12gb ram , Windows 10 ,Purebasic 5.50
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Problem mit Pointer :(

Beitrag 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) 
i7,12gb ram , Windows 10 ,Purebasic 5.50
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: Problem mit Pointer :(

Beitrag von - chris - »

Mit Array funktioniert es, zum Beispiel so:

Code: Alles auswählen


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

PB v5.72 x86/x64
Windows 10 Pro 64bit
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Problem mit Pointer :(

Beitrag 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.
i7,12gb ram , Windows 10 ,Purebasic 5.50
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: Problem mit Pointer :(

Beitrag 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]

PB v5.72 x86/x64
Windows 10 Pro 64bit
Antworten