Seite 1 von 2
Sprungmarke/Label als Text möglich?
Verfasst: 06.12.2011 11:36
von Gonzo
Hallo zusammen,
in der Hilfe von PureBasic steht zu Sprungmarken (Labels) folgendes:
Sprungmarken
Allen Sprungmarken (Labels) muss ein : (Doppelpunkt) folgen. Die Namen von Sprungmarken dürfen keine Operatoren (+,-,...) oder Sonderzeichen (ß,ä,ö,ü,...) enthalten.
Beispiel:
Ich_bin_eine_Sprungmarke:
Meine Frage:
Ist es möglich, Sprungmarken als Text zu definieren? Zum Beispiel so:
Code: Alles auswählen
DataSection
IncludeStart_Data:
IncludeBinary "data.xxx"
EndDataSection
...
Datei$ = IncludeStart_Data
Restore Datei$
Viele Grüße,
Gonzo
Re: Sprungmarke/Label als Text möglich?
Verfasst: 06.12.2011 11:57
von NicTheQuick
Nein, aber du kannst dir die Speicheradresse mit dem ?-Operator holen und dann mit Pointern oder Peek-Befehlen darauf zugreifen:
Re: Sprungmarke/Label als Text möglich?
Verfasst: 06.12.2011 12:08
von Danilo
Wenn es eine Textdatei ist, kannst Du folgendes probieren:
Code: Alles auswählen
DataSection
IncludeStart_Data:
IncludeBinary "data.xxx"
Data.l 0,0
EndDataSection
Datei$ = PeekS(?IncludeStart_Data,-1,#PB_UTF8)
#PB_UTF8 mit dem Kodierungsformat der Textdatei ersetzen.
Re: Sprungmarke/Label als Text möglich?
Verfasst: 06.12.2011 13:34
von Gonzo
Danke für die Antworten, aber geholfen hat es mir leider nicht:
Ich versuche das Problem einfacher zu beschreiben:
Das Programm setzt sich aus zig Sprungmarken zusammen:
Und jetzt möchte ich auf eine beliebige Sprungmarke z.B. per Zufallsgenerator zugreifen:
Das es nicht möglich ist, weiß ich. Aber wie kann man das Problem umgehen.
Viele Grüße, Gonzo
Re: Sprungmarke/Label als Text möglich?
Verfasst: 06.12.2011 13:39
von NicTheQuick
Was ist denn dein eigentliches Problem? Ich wette das kann man anders lösen als mit Sprungmarken.
Re: Sprungmarke/Label als Text möglich?
Verfasst: 06.12.2011 14:09
von Gonzo
Das eigentliche Problem ist folgendes:
Mein Programm greift auf etwa 1000 Dateien zu, die innerhalb einer DataSection abgelegt sind.
Jede dieser 1000 Datei wird innerhalb der DataSection mit IncludeBinary innerhalb der zugehörigen Sprungmarke eingelesen.
Das sieht in etwa so aus:
Code: Alles auswählen
DataSection
Sprungmarke zu Datei 1:
IncludeBinary "Datei_1.liq"
Sprungmarke zu Datei 2:
IncludeBinary "Datei_2.liq"
usw. für 1000 Dateien
EndDataSection
Im späteren Verlauf des Programms greife ich beliebig auf die einzelnen Dateien über
mit x zwischen 1 und 1000 zu. Das hat bisher sehr gut funktioniert. Allerdings musste hinter dem Befehl
die Sprungmarke literatisch ausgeschrieben werden.
Jetzt möchte ich das Programm soweit ändern, dass ich die Bezeichnung der Sprungmarke als Text$ eingebe. Zum Beispiel:
Aber es geht nicht.
Ich hoffe, dass ich mein Problem ausführlich beschrieben habe.
Gruss, Gonzo
Re: Sprungmarke/Label als Text möglich?
Verfasst: 06.12.2011 15:16
von STARGÅTE
Das geht zumindest nicht mit Restore und Read.
Du kannst aber deinen Dateien im Speicher selbst per PeekS/L/B/F... lesen.
Dann kannst du die Labels alle in einer Map/Array speichern und dann "per Zufall" ansprechen:
Code: Alles auswählen
Macro _DQ_
"
EndMacro
Macro MyLabel(Name)
EndDataSection
*Label(_DQ_#Name#_DQ_) = ?Name
DataSection
Name:
EndMacro
NewMap *Label()
DataSection
MyLabel(Label1)
Data.s "Hier ist Label1"
MyLabel(Label2)
Data.s "Hier ist Label2"
MyLabel(Label3)
Data.s "Hier ist Label3"
MyLabel(Label4)
Data.s "Hier ist Label4"
MyLabel(Irgendwas)
Data.s "Hier ist Irgendwas"
EndDataSection
Debug PeekS(*Label("Label"+Str(Random(3)+1)))
Debug PeekS(*Label("Irgendwas"))
Re: Sprungmarke/Label als Text möglich?
Verfasst: 06.12.2011 15:18
von Kiffi
1000 Includes sind ne Menge Holz
Ich nehme an, dass Du die Datasection (hoffentlich) mittels eines
PB-Schnippsels erstellt hast. Diesen müsstest Du so erweitern,
dass er Dir auch noch die Prozedur GetDatei() (siehe unten) ausgibt.
Dann könnte Dein Code wie folgt aussehen.
Code: Alles auswählen
Structure sDateiInfos
Start.l
Length.l
EndStructure
Procedure GetDatei(Zufall)
Protected *ReturnValue.sDateiInfos
*ReturnValue = AllocateMemory(SizeOf(sDateiInfos))
Select Zufall
Case 0
*ReturnValue\Start = ?Datei_0_Start
*ReturnValue\Length = ?Datei_0_Ende - ?Datei_0_Start
Case 1
*ReturnValue\Start = ?Datei_1_Start
*ReturnValue\Length = ?Datei_1_Ende - ?Datei_1_Start
Case 2
*ReturnValue\Start = ?Datei_2_Start
*ReturnValue\Length = ?Datei_2_Ende - ?Datei_2_Start
Case [ und so weiter und so fort ]
EndSelect
ProcedureReturn *ReturnValue
EndProcedure
*Datei.sDateiInfos = GetDatei(Random(2))
Debug *Datei\Start
Debug *Datei\Length
; An dieser Stelle weißt Du, an welcher Position sich
; Deine Datei befindet und wie lang sie ist. Mach was draus! :-)
DataSection
Datei_0_Start:
IncludeBinary "Datei_0.liq"
Datei_0_Ende:
Datei_1_Start:
IncludeBinary "Datei_1.liq"
Datei_1_Ende:
Datei_2_Start:
IncludeBinary "Datei_2.liq"
Datei_2_Ende:
[ und so weiter und so fort ]
EndDataSection
@all: An welcher Stelle wird eigentlich der Speicher, den
ich für *ReturnValue angefordert habe, wieder freigegeben?
Grüße ... Kiffi
Re: Sprungmarke/Label als Text möglich?
Verfasst: 06.12.2011 15:24
von STARGÅTE
@Kiffi: nirgends, was ja ein Problem darstellt.
Benutze lieber eine Globleme Variable mit DateiInfos.sDateiInfos, ansonsten gibt es n großen Speicherleck.
Re: Sprungmarke/Label als Text möglich?
Verfasst: 06.12.2011 15:26
von ts-soft
Kiffi hat geschrieben:
@all: An welcher Stelle wird eigentlich der Speicher, den
ich für *ReturnValue angefordert habe, wieder freigegeben?
Grüße ... Kiffi
Beim Programmende
