Sprungmarke/Label als Text möglich?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Sprungmarke/Label als Text möglich?

Beitrag von Kiffi »

an ne globale Variable habe ich gar nicht gedacht. Danke für den Hinweis!

Code: Alles auswählen

EnableExplicit

Structure sDateiInfo
  Start.l
  Length.l
EndStructure

Global DateiInfo.sDateiInfo

Procedure GetDatei(Zufall)
  
  Select Zufall
      
    Case 0
      DateiInfo\Start  = ?Datei_0_Start
      DateiInfo\Length = ?Datei_0_Ende - ?Datei_0_Start
      
    Case 1
      DateiInfo\Start  = ?Datei_1_Start
      DateiInfo\Length = ?Datei_1_Ende - ?Datei_1_Start
      
    Case 2
      DateiInfo\Start  = ?Datei_2_Start
      DateiInfo\Length = ?Datei_2_Ende - ?Datei_2_Start

    ; Case [ und so weiter und so fort ]
      
  EndSelect
  
EndProcedure

GetDatei(Random(2))

Debug DateiInfo\Start
Debug DateiInfo\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
@Gonzo: Alternativ könnte man auch überlegen, die ganzen Dateien
als BLOBs in einer SQLite-Datenbank zu speichern. Dann könntest
Du bequem über Angabe eines Index auf die Dateien zugreifen.
Allerdings ergeben sich daraus zwei Nachteile, die unter Umständen
Ausschlußkriterien sein könnten: Erstens wird Dein Prog um die
SQLite-Lib größer (genaue Zahl habe ich nicht im Kopf) und zweitens
hättest Du mit der SQLite-Datenbank eine externe Datei mitzuschleppen.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Sprungmarke/Label als Text möglich?

Beitrag von HeX0R »

Kiffi hat geschrieben: @all: An welcher Stelle wird eigentlich der Speicher, den
ich für *ReturnValue angefordert habe, wieder freigegeben?
STARGÅTE hat geschrieben:Benutze lieber eine Globleme Variable mit DateiInfos.sDateiInfos
Ich würde dafür keine Globleme Variable nehmen (vielleicht weil das Wort schon vorhersagt, dass es Globale Probleme geben wird :mrgreen: ), ich würde das so machen:

Code: Alles auswählen

; An dieser Stelle weißt Du, an welcher Position sich
; Deine Datei befindet und wie lang sie ist. Mach was draus! :-)

;Ach, du bist nun fertig? Dann entledige dich der Altlasten:
FreeMemory(*Datei)
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 »

Ja aber GetDatei() wird ja vermutlich mehr als einmal aufgerufen und dann jedesmal per Hand FreeMemory?
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 »

STARGÅTE hat geschrieben:Ja aber GetDatei() wird ja vermutlich mehr als einmal aufgerufen und dann jedesmal per Hand FreeMemory?
Man kann ja auch eine statische Variable nutzen und in GetDatei() am Anfang ggfls. freigeben.
Lediglich bei exportierten Prozeduren (DLLs) sollte man da vorsichtig sein.

Ich bin auch kein Freund von globalen Variablen :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
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 »

Ich mag dieses denglische "GetDatei" nicht. Warum denn nicht so?

Code: Alles auswählen

EnableExplicit

Structure sFileInfo
	*Start
	Length.i
EndStructure

Procedure GetFile(fileNumber.i, *fileInfo.sFileInfo)
	Select fileNumber
			
		Case 0
			*fileInfo\Start  = ?File_0_Start
			*fileInfo\Length = ?File_0_Ende - ?File_0_Start
			
		Case 1
			*fileInfo\Start  = ?File_1_Start
			*fileInfo\Length = ?File_1_Ende - ?File_1_Start
			
		Case 2
			*fileInfo\Start  = ?File_2_Start
			*fileInfo\Length = ?File_2_Ende - ?File_2_Start
			
			; Case [ und so weiter und so fort ]
			
	EndSelect
	
EndProcedure

Define fileInfo.sFileInfo

GetFile(Random(2), @fileInfo)

Debug fileInfo\Start
Debug fileInfo\Length

; An dieser Stelle weißt Du, an welcher Position sich
; Deine File befindet und wie lang sie ist. Mach was draus! :-)

DataSection
	
	File_0_Start:
		IncludeBinary "File_0.liq"
	File_0_Ende:
	
	File_1_Start:
		IncludeBinary "File_1.liq"
	File_1_Ende:
	
	File_2_Start:
		IncludeBinary "File_2.liq"
	File_2_Ende:
	
	; [ und so weiter und so fort ]
	
EndDataSection 
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Sprungmarke/Label als Text möglich?

Beitrag von Kiffi »

NicTheQuick hat geschrieben:Ich mag dieses denglische "GetDatei" nicht. Warum denn nicht so?
Das can you halten like a Dachdecker :-)

Grüße ... Kiffi
a²+b²=mc²
Ramihyn_
Beiträge: 61
Registriert: 20.06.2007 10:56

Re: Sprungmarke/Label als Text möglich?

Beitrag von Ramihyn_ »

Wenn man es einfacher und ohne Prozeduren oder Memoryhandling haben will:

Code: Alles auswählen

DataSection 

Sprungmarke_Datei1:
  IncludeBinary "Datei1.txt"
  
Sprungmarke_Datei2:
  IncludeBinary "Datei2.txt"
  
Sprungmarke_Datei3:
  IncludeBinary "Datei3.txt"
  
Sprungmarke_Datei_Anker:

Sprungmarken_Liste: 
    Data.i ?Sprungmarke_Datei1, ?Sprungmarke_Datei2, ?Sprungmarke_Datei3
    Data.i ?Sprungmarke_Datei_Anker

EndDataSection

#NUMBER_OF_RANDOMENTRIES        = 3



; example how to use the data


RandomSeed(ElapsedMilliseconds())


RndNum = Random(#NUMBER_OF_RANDOMENTRIES - 1)

Dummy.i

*Buffer = PeekI(?Sprungmarken_Liste + (RndNum * SizeOf(Dummy)))
BufferLen = PeekI(?Sprungmarken_Liste + ((RndNum + 1) * SizeOf(Dummy))) - *Buffer

MessageRequester("Your lucky choice is...", PeekS(*Buffer, BufferLen, #PB_Ascii))
und wenn Du daraus eine "CallRandomFunction" machen willst, nimmst Du einfach CallFunctionFast. Mein Beispiel sollte mit 32 und 64Bit funktionieren und sowohl als Unicode Binary als auch als Ascii. Das mit dem "Sizeof(Dummy)" geht vielleicht eleganter und Memory Alignment sollte kein Problem sein, muss man aber bei Pointer Arithmetic immer im Hinterkopf behalten :)
Antworten