Seite 2 von 2

Re: Sprungmarke/Label als Text möglich?

Verfasst: 06.12.2011 15:46
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

Re: Sprungmarke/Label als Text möglich?

Verfasst: 06.12.2011 19:22
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)

Re: Sprungmarke/Label als Text möglich?

Verfasst: 06.12.2011 19:55
von STARGÅTE
Ja aber GetDatei() wird ja vermutlich mehr als einmal aufgerufen und dann jedesmal per Hand FreeMemory?

Re: Sprungmarke/Label als Text möglich?

Verfasst: 06.12.2011 20:13
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:

Re: Sprungmarke/Label als Text möglich?

Verfasst: 06.12.2011 23:11
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 

Re: Sprungmarke/Label als Text möglich?

Verfasst: 07.12.2011 00:17
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

Re: Sprungmarke/Label als Text möglich?

Verfasst: 07.12.2011 02:25
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 :)