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:

Code: Alles auswählen

*FilePointer = ?IncludeStart_Data

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:

Code: Alles auswählen

1:
Return
2:
Return
3:
Return
....
n:
Return
Und jetzt möchte ich auf eine beliebige Sprungmarke z.B. per Zufallsgenerator zugreifen:

Code: Alles auswählen

Gosub Random(n)
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

Code: Alles auswählen

Restore Sprungmarke zu Datei x
mit x zwischen 1 und 1000 zu. Das hat bisher sehr gut funktioniert. Allerdings musste hinter dem Befehl

Code: Alles auswählen

Restore
die Sprungmarke literatisch ausgeschrieben werden.
Jetzt möchte ich das Programm soweit ändern, dass ich die Bezeichnung der Sprungmarke als Text$ eingebe. Zum Beispiel:

Code: Alles auswählen

text$ = Sprungmarke zu Datei x
Restore text$
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 :shock:

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 :mrgreen: