Seite 1 von 2

Bitte um Hilfe zu "Config oa. Daten in Exe speichern

Verfasst: 03.05.2009 16:03
von TheSaint
Hallo Zusammen,

ich versuche gerade verzweifelt das Beispiel zu verwenden mit einer Struktur und einem Array.

Hier habe ich das Beispiel gefunden:

http://www.purebasic.fr/german/viewtopi ... c&start=20

Das ist der Code von der o.g. Seite:

Code: Alles auswählen

XIncludeFile "EC_Include.pbi"

EC_Builder_SelfConfigHead()

Structure Config
  Var1.i
  Var2.i
  Var3.i
  Var4.i
  Var5.i
EndStructure

Global *Config.Config

Procedure SaveConfig()
  EC_Builder_SelfConfig(*Config, SizeOf(Config), #True, #False)
EndProcedure

Procedure LoadConfig()
  Protected Loader = EC_Load_All()
  If Loader
    *Config = EC_Loader_GetMem(Loader)
  Else
    *Config = AllocateMemory(SizeOf(Config))
  EndIf
EndProcedure

LoadConfig() ; Läd/Initialisiert Config
With *Config
  If Not \Var1
    \Var1 = 1
    \Var2 = 3
    \Var3 = 6
    \Var4 = 12
    \Var5 = 24
  EndIf
  \Var1*2
  \Var2*2
  \Var3*2
  \Var4*2
  \Var5*2
  ; Code
  ; Code
  ; .....
  ; .....
  MessageRequester("Test", Str(\Var1) + #LFCR$ + Str(\Var2) + #LFCR$ + Str(\Var3) + #LFCR$ + Str(\Var4) + #LFCR$ + Str(\Var5))
  SaveConfig()
EndWith
Nun habe ich versucht dieses Beispiel so zu verändern, dass ich es für meine Zwecke weiter verwenden kann.

Ich bekomme jedoch immer folgende Fehlermeldung:

In der Zeile

Code: Alles auswählen

WriteData(hFile, *Mem, MemSize)
erscheint die Fehlermeldung: The specified Buffer is 0

Könnte mir hier jemand Hilfestellung geben... wäre toll.

Hier ist der Code den ich verwende:

Code: Alles auswählen

XIncludeFile "EC_Include.pbi"

EC_Builder_SelfConfigHead()

Structure Zelle
  Zeile.l
  PatName.s
  PatFallNr.s
  PatDatum.s
EndStructure

Global NewList ArchivList.Zelle()

Procedure SaveConfig()
  EC_Builder_SelfConfig(ArchivList, SizeOf(Zelle), #True, #False)
EndProcedure

Procedure LoadConfig()
  Protected Loader = EC_Load_All()
  If Loader
    ArchivList = EC_Loader_GetMem(Loader)
  Else
    ArchivList = AllocateMemory(SizeOf(Zelle))
  EndIf
EndProcedure

LoadConfig()
AddElement(ArchivList())
  ArchivList()\Zeile = 1
  ArchivList()\PatName = "Meier"
  ArchivList()\PatFallNr = "12345"
  ArchivList()\PatDatum = "19.12.2009"

   Debug ArchivList()\Zeile
   Debug   ArchivList()\PatName
SaveConfig()
Schon mal vielen Dank für Eure Hilfe.

Verfasst: 03.05.2009 19:43
von cxAlex
Da gibts mehrere Probleme:

> EC_Builder_SelfConfig(ArchivList, SizeOf(Zelle), #True, #False)

1. ArchivListe hast nicht mit der LL Archivliste zu tun, das ist einfach ne leere Variable. Du müsstest den Inhalt aller Listen in einen Speicher packen mit einem eigenen Format, und wieder auslesen.

2. Hast du Strings in deiner Struktur. Speicherst du nun die Struk. ab speicherst du nur die Pointer auf die Strings die bein Laden natürlich nicht mehr da sind. Verwende fixed Strings oder verwalte die Strings in deinem Format extra.

Gruß, Alex

Verfasst: 03.05.2009 20:57
von TheSaint
Hallo cxAlex,

vielen Dank für Deine Antwort.
cxAlex hat geschrieben:Da gibts mehrere Probleme:

> EC_Builder_SelfConfig(ArchivList, SizeOf(Zelle), #True, #False)

1. ArchivListe hast nicht mit der LL Archivliste zu tun, das ist einfach ne leere Variable. Du müsstest den Inhalt aller Listen in einen Speicher packen mit einem eigenen Format, und wieder auslesen.
Leider fehlt mir wohl noch die Erfahrung, das von Dir beschriebene umzusetzen.

Trotzdem vielen Dank.

Verfasst: 03.05.2009 21:00
von cxAlex
TheSaint hat geschrieben: Leider fehlt mir wohl noch die Erfahrung, das von Dir beschriebene umzusetzen.
Ich werd mal schauen das ich die Woche noch ein Beispiel poste...

Gruß, Alex

Verfasst: 03.05.2009 21:01
von Kaeru Gaman
die Elemente einer LList müssen nicht lückenlos aufeinanderfolgen, da können andere Daten dazwischenstehen.

überleg dir, ob du nicht vielleicht ein strukturiertes Array benutzen kannst statt der Liste.
ein Array hat eine feststehende Reihenfolge und steht fortlaufend im Speicher, das kann man in einem Rutsch speichern.

und wichtig wie Alex schon sagte: strings in der Struct als Fixstrings einbinden, dynamische Strings werden ganz woanders gespeichert.

Verfasst: 03.05.2009 21:18
von TheSaint
cxAlex hat geschrieben:
TheSaint hat geschrieben: Leider fehlt mir wohl noch die Erfahrung, das von Dir beschriebene umzusetzen.
Ich werd mal schauen das ich die Woche noch ein Beispiel poste...
Wow, das wäre toll. Wollte Dich nur nicht damit belästigen.

Vielen Dank im voraus.

Verfasst: 03.05.2009 21:20
von TheSaint
Kaeru Gaman hat geschrieben:die Elemente einer LList müssen nicht lückenlos aufeinanderfolgen, da können andere Daten dazwischenstehen.
überleg dir, ob du nicht vielleicht ein strukturiertes Array benutzen kannst statt der Liste.
ein Array hat eine feststehende Reihenfolge und steht fortlaufend im Speicher, das kann man in einem Rutsch speichern.
Hm, das werde ich mir mal mit einem strukturierten Array ansehen. Aber, warum sollte es damit nicht auch gehen.
Schaue mal wo ich dazu Informationen finde.

Vielen Dank.

Verfasst: 04.05.2009 10:23
von andi256
config daten in die "exe" packen find ich persönlich eher nicht so schön

Ich verwende dazu immer ein "ini" File mit dem sehr einfach arbeiten kann.

(PrivateProfileString ist APi und geht daher leider nur unter Windows)

Code: Alles auswählen

 #defaultwert  = "10"
 #lange        =  20 
 
 OpenConsole()
 
 File$ =  GetCurrentDirectory()+"\program.ini"                 ; legt Pfad & file fest
 d$=Space(#lange) 
 GetPrivateProfileString_  ("UEBERSCHRIFT","WERT1",#defaultwert,d$,#lange,File$)
 PrintN("WERT1 : " + d$)
 Print("neuer WERT :")
 WritePrivateProfileString_("UEBERSCHRIFT","WERT1",Input(),File$)
 
 CloseConsole()
mfg

Verfasst: 04.05.2009 10:53
von Kiffi
andi256 hat geschrieben:(PrivateProfileString ist APi und geht daher leider nur unter Windows)
schau mal in die PB-Hilfe, Kapitel: "Preference" ;-)

Grüße ... Kiffi

Verfasst: 04.05.2009 11:46
von TheSaint
Hallo andi256,
andi256 hat geschrieben:config daten in die "exe" packen find ich persönlich eher nicht so schön
Ich verwende dazu immer ein "ini" File mit dem sehr einfach arbeiten kann.
Es handelt sich ja in diesem Sinne nicht um config daten.
Ich wollte das Beispiel von cxAlex auf meine Bedürfnisse anpassen.
Ich wollte nur eine Exe haben und in diese Exe Daten mitspeichern.
Diese Daten würde ich dann, wenn es erforderlich ist ergänzen.
Ansonsten würde ich, wenn ich eine ini Datei verwende, gefahr laufen,
dass diese mitkopiert wurde, bzw. versehentlich gelöscht wird.

Hm, ich hoffe ich konnte das ein wenig verständlich rüberbringen.

Schon mal vielen Dank für Deine Mühe und Zeit.