Sprungmarke/Label als Text möglich?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Gonzo
Beiträge: 24
Registriert: 24.04.2006 14:24

Sprungmarke/Label als Text möglich?

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Sprungmarke/Label als Text möglich?

Beitrag 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
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Sprungmarke/Label als Text möglich?

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Gonzo
Beiträge: 24
Registriert: 24.04.2006 14:24

Re: Sprungmarke/Label als Text möglich?

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Sprungmarke/Label als Text möglich?

Beitrag von NicTheQuick »

Was ist denn dein eigentliches Problem? Ich wette das kann man anders lösen als mit Sprungmarken.
Gonzo
Beiträge: 24
Registriert: 24.04.2006 14:24

Re: Sprungmarke/Label als Text möglich?

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sprungmarke/Label als Text möglich?

Beitrag 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"))
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Sprungmarke/Label als Text möglich?

Beitrag 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
a²+b²=mc²
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sprungmarke/Label als Text möglich?

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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: Sprungmarke/Label als Text möglich?

Beitrag 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:
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
Antworten