  | 
					
						Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!   
						
						
					 | 
				 
			 
			 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	 
	
	
		| Autor | 
		Nachricht | 
	 
	
		ALWIM
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
  | 
		
			
				 Verfasst am: 14.03.2014, 01:29    Titel: Zahlen einlesen aus Datei - Wann ist Schluss? | 
				     | 
			 
			
				
  | 
			 
			
				In einer Datei stehen zum Beispiel mehr als 1.000.000 Zahlen drin. Wie kann man die aus einer Datei einlesen und daraus 5 bestimmte Zahlen auf dem Bildschirm ausgeben?
 
 
Wie viel Zahlen kann man maximal aus einer Datei einlesen? Wann ist Schluss?
 
 
 	  | Code: | 	 		  DIM AS ??? A = ???, Zahl(A)
 
DIM f AS INTEGER = FREEFILE
 
 
OPEN "Zahlen.txt" FOR INPUT AS #f
 
A = 0
 
DO UNTIL EOF(f)
 
   INPUT #f, Zahl(A)
 
   A += 1
 
LOOP
 
CLOSE #f
 
 
SCREENRES 640, 320, 32
 
 
COLOR &hFFFFFF
 
 
LOCATE 7,5: PRINT "A: "; A
 
SLEEP
 
LOCATE 9,5: PRINT Zahl(500)
 
LOCATE 11,5: PRINT Zahl(1)
 
LOCATE 13,5: PRINT Zahl(127)
 
 
SLEEP
 
END | 	  
 
 
erste Versuche sind Fehlgeschlagen!
 
Es gab Speicherzugriffsverletzungen!!!
 
 
Gruß
 
ALWIM _________________ SHELL SHUTDOWN -s -t 05 | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Sebastian Administrator
  
  Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
  | 
		
			
				 Verfasst am: 14.03.2014, 01:54    Titel: REDIM für sehr große Arrays. Listen für wachsende Datenmenge | 
				     | 
			 
			
				
  | 
			 
			
				Hallo ALWIM,
 
 
in FreeBASIC-Programmen, die mit der 32-Bit-Version des Compilers übersetzt wurden, können bis zu 2 GB Speicher in Beschlag genommen werden, vorausgesetzt, der PC bietet entsprechend viel freien Speicher.
 
 
Variablen, die mit DIM deklariert werden, landen standardmäßig auf dem kleinen Stack. Dessen Größe liegt normalerweise bei 1 MB, kann aber über die Kommandozeilenoption -t des fbc erhöht werden.
 
 
Variablen, die mit REDIM deklariert werden, werden auf dem Heap gespeichert. Das ist ein anderer Speicherbereich. Dort gilt nicht das Limit für den Stack.
 
 
Du kannst in FreeBASIC problemlos ein Double-Array zum Beispiel mit 10 Millionen Werten anlegen, wie das folgende Programm demonstriert. Aber auch noch mehr Einträge sind natürlich möglich.
 
 
 	  | Code: | 	 		  #define AnzahlArrayElemente 10000000
 
 
ReDim Daten(1 To AnzahlArrayElemente) As Double
 
 
Randomize Timer
 
For i As UInteger = 1 To AnzahlArrayElemente
 
    Daten(i) = RND * 100000
 
Next i
 
 
Print "Es wurden " & AnzahlArrayElemente & " Double-Array-Elemente erzeugt."
 
 
Dim As UInteger speicherbedarf = AnzahlArrayElemente * SizeOf(Double)
 
 
Print "Das Array belegt " & speicherbedarf & " Bytes, was ca. " & Int(speicherbedarf / 1024 / 1024) & " MB entspricht."
 
 
Sleep
 
End | 	  
 
 
Hier sieht man das Programm in Ausführung und den Taskmanager:
 
 
 
 
 
Arrays haben jedoch den Nachteil, dass man bei ihrer Deklaration angeben muss, wie groß sie sein sollen. Eine nachträgliche Vergrößerung eines Arrays ist nicht möglich. Stattdessen muss ein zu kleines Array insgeheim in ein neues, größeres umkopiert werden, wenn du REDIM PRESERVE benutzt. Das ist sehr aufwendig. Sie wachsen also nicht mit dem Speicherbedarf.
 
 
Wenn am Anfang unklar ist, wie viel Speicher gebraucht wird, verwendet man statt eines Arrays eine sog. verkettete Liste. Sie kann Element für Element zu gleichen "Kosten" wachsen.
 
 
Siehe dazu zum Beispiel:
 
- http://www.freebasic-portal.de/downloads/bibliotheken/mdtypes-308.html
 
- http://www.freebasic-portal.de/tutorials/verkettete-listen-in-freebasic-37.html
 
 
Viele Grüße!
 
Sebastian _________________
  
 
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		grindstone
 
 
  Anmeldungsdatum: 03.10.2010 Beiträge: 1283 Wohnort: Ruhrpott
  | 
		
			
				 Verfasst am: 14.03.2014, 10:31    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo ALWIM!
 
 
Was bedeuten die Fragezeichen in deinem Programmcode? Weißt du nicht, als was du die Variablen dimensionieren sollst?
 
Wenn die Zahlen als Strings in einem Textfile (".txt") stehen, muß das Array als STRING und die Indexvariable (A) als INTEGER dimensioniert werden.
 
 
Sollte die Datei die Werte als Zahlen enthalten (INTEGER, SINGLE oder DOUBLE) gibt es eine sehr viel elegantere Möglichkeit, auf bestimmte Werte zuzugreifen, ohne alles in ein Array zu kopieren, nämlich direkt auf die Datei über einen berechneten Dateipointer. Aber das geht nur, wenn alle Werte die gleiche Anzahl von Bytes belegen.
 
 
Gruß
 
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Jojo alter Rang
  
  Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
  | 
		
			
				 Verfasst am: 14.03.2014, 14:25    Titel: Re: REDIM für sehr große Arrays. Listen für wachsende Datenm | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Sebastian hat Folgendes geschrieben: | 	 		  | ...können bis zu 2 GB Speicher in Beschlag genommen werden... | 	  
 
Ist FB etwa nicht large address aware? Ansonsten können bis zu 4 GB benutzt werden. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ALWIM
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
  | 
		
			
				 Verfasst am: 14.03.2014, 14:52    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Zitat: | 	 		  | Was bedeuten die Fragezeichen in deinem Programmcode? | 	  
 
Die Fragezeichen dienen nur als Platzhalter! 
 
 
 	  | Zitat: | 	 		  | Weißt du nicht, als was du die Variablen dimensionieren sollst? | 	  Doch, das weiß ich schon! Ich weiß nur noch nicht wie viele Zahlen es letztendlich werden! Davon hängt ja auch die Art der Dimensionierung ab.
 
Ob als Integer oder als Double oder als Single! Deswegen ja auch die Fragezeichen als Platzhalter.
 
 
Im Moment habe ich bei Tests ca. 2,3 Millionen Zahlen eingelesen. Der Speicherverbrauch war enorm! Kann man es nicht so machen, dass man nur ab einer bestimmten Zeile mit dem einlesen beginnt? Dann würde man auch nicht so viel Speicher verbrauchen.
 
 
Ich danke euch schon mal für eure Hilfe!
 
 
Mal schauen, was man da machen kann! So wie es momentan ist, schaut es nicht besonders brauchbar für mich.
 
 
 
Jeden Tag 60 Jahre lang 100 Zahlen in 1 Minute in eine Datei schreiben und man erhält ca. 2,3 Millionen Zahlen. Wer macht das schon? von dem her wäre das noch in Ordnung? Aber was ist wenn es nicht 1 Minute sondern nur 15 Sekunden sind? oder gar 200-300 Zahlen?
 
 
Irgendwann kommen halt dann so viel Zahlen zusammen, dass das einlesen 3 Minuten oder länger dauert. Das ist meine Sorge!
 
 
Gruß
 
ALWIM _________________ SHELL SHUTDOWN -s -t 05 | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		nemored
 
  
  Anmeldungsdatum: 22.02.2007 Beiträge: 4712 Wohnort: ~/
  | 
		
			
				 Verfasst am: 14.03.2014, 17:00    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Ich zitiere einfach mal ganz frech  
 
 	  | grindstone hat Folgendes geschrieben: | 	 		  | Sollte die Datei die Werte als Zahlen enthalten (INTEGER, SINGLE oder DOUBLE) gibt es eine sehr viel elegantere Möglichkeit, auf bestimmte Werte zuzugreifen, ohne alles in ein Array zu kopieren, nämlich direkt auf die Datei über einen berechneten Dateipointer. Aber das geht nur, wenn alle Werte die gleiche Anzahl von Bytes belegen. | 	  
 
 
(Dazu seien mal die Stichworte BINARY und SEEK in den Raum geworfen.) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		grindstone
 
 
  Anmeldungsdatum: 03.10.2010 Beiträge: 1283 Wohnort: Ruhrpott
  | 
		
			
				 Verfasst am: 14.03.2014, 20:35    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				...und ergänzend dazu gäbe es aus der Rubrik "was nicht passt, wird passend gemacht" noch die Möglichkeit, alle Zahlen aus der (Text-) Datei auszulesen, in eine geeignete Zahl zu konvertieren und in eine neue Datei zu schreiben, aus der dann anschließend die Werte gezielt per Dateipointer ausgelesen werden können. Das Konvertieren dauert zwar auch eine Weile, braucht aber nur einmal gemacht zu werden.
 
 
Die maximale Dateigröße bei NTFS beträgt z.Z. ca. 16TB. Das dürfte für deine Zwecke wohl reichen   .
 
 
Gruß
 
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ALWIM
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
  | 
		
			
				 Verfasst am: 17.03.2014, 01:38    Titel: Re: REDIM für sehr große Arrays. Listen für wachsende Datenm | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Sebastian hat Folgendes geschrieben: | 	 		  Hallo ALWIM,
 
 
in FreeBASIC-Programmen, die mit der 32-Bit-Version des Compilers übersetzt wurden, können bis zu 2 GB Speicher in Beschlag genommen werden, vorausgesetzt, der PC bietet entsprechend viel freien Speicher.
 
 
Variablen, die mit DIM deklariert werden, landen standardmäßig auf dem kleinen Stack. Dessen Größe liegt normalerweise bei 1 MB, kann aber über die Kommandozeilenoption -t des fbc erhöht werden.
 
 
Variablen, die mit REDIM deklariert werden, werden auf dem Heap gespeichert. Das ist ein anderer Speicherbereich. Dort gilt nicht das Limit für den Stack.
 
 
Du kannst in FreeBASIC problemlos ein Double-Array zum Beispiel mit 10 Millionen Werten anlegen, wie das folgende Programm demonstriert. Aber auch noch mehr Einträge sind natürlich möglich.
 
 
 	  | Code: | 	 		  #define AnzahlArrayElemente 10000000
 
 
ReDim Daten(1 To AnzahlArrayElemente) As Double
 
 
Randomize Timer
 
For i As UInteger = 1 To AnzahlArrayElemente
 
    Daten(i) = RND * 100000
 
Next i
 
 
Print "Es wurden " & AnzahlArrayElemente & " Double-Array-Elemente erzeugt."
 
 
Dim As UInteger speicherbedarf = AnzahlArrayElemente * SizeOf(Double)
 
 
Print "Das Array belegt " & speicherbedarf & " Bytes, was ca. " & Int(speicherbedarf / 1024 / 1024) & " MB entspricht."
 
 
Sleep
 
End | 	  
 
 
Hier sieht man das Programm in Ausführung und den Taskmanager:
 
 
 
 
 
Arrays haben jedoch den Nachteil, dass man bei ihrer Deklaration angeben muss, wie groß sie sein sollen. Eine nachträgliche Vergrößerung eines Arrays ist nicht möglich. Stattdessen muss ein zu kleines Array insgeheim in ein neues, größeres umkopiert werden, wenn du REDIM PRESERVE benutzt. Das ist sehr aufwendig. Sie wachsen also nicht mit dem Speicherbedarf.
 
 
Wenn am Anfang unklar ist, wie viel Speicher gebraucht wird, verwendet man statt eines Arrays eine sog. verkettete Liste. Sie kann Element für Element zu gleichen "Kosten" wachsen.
 
 
Siehe dazu zum Beispiel:
 
- http://www.freebasic-portal.de/downloads/bibliotheken/mdtypes-308.html
 
- http://www.freebasic-portal.de/tutorials/verkettete-listen-in-freebasic-37.html
 
 
Viele Grüße!
 
Sebastian | 	  
 
 
Wie ist es mit Strings? Ich habe in einer Datei ein paar Wörter mit Zahlen drin stehen. Wenn ich versuche, die mit zu laden, kommt wieder die Speicherzugriffsverletzungsmeldung. Kann ich die genauso wie die Zahlen mit Redim deklarieren? Wären letztendlich genauso viele Wörter wie Zahlen.
 
 
Im Moment bin ich noch ein wenig am rumexperimentieren! Nichts klappt so wie ich will.
 
 
Gruß
 
ALWIM _________________ SHELL SHUTDOWN -s -t 05 | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Eternal_pain
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
  | 
		
			
				 Verfasst am: 17.03.2014, 02:37    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Evtl solltest Du Dir erst einmal im klaren sein was du eigentlich erreichen möchtest.. auch wenn ich denke das es problemlos möglich ist bis zu 2GB (oder mehr) Daten in den Speicher zu laden, halte ich es für absolut sinnlos wenn man ja nur 5 Datensätze (zahlen oder Text+Zahlen oder was auch immer) brauch...
 
 
Wieso baust du dir deine Datei nicht nach einem festen Schema auf? So das Ein Datensatz (sinnvollerweise im einem UDT) eine feste Größe hat... zB 128byte entspricht ein Datensatz, dann kannst anhand der Dateigröße ermitteln wie viele Datensätze enthalten n=(Dateigröße / 128) sind und kann dann einfach Datensatz x direkt auslesen... _________________
   | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		grindstone
 
 
  Anmeldungsdatum: 03.10.2010 Beiträge: 1283 Wohnort: Ruhrpott
  | 
		
			
				 Verfasst am: 17.03.2014, 11:39    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				@ALWIM: Hantierst du in deinem Programm mit irgendwelchen Pointern? Mit normalen Dateioperationen ist es nämlich unmöglich, eine Schutzverletzung zu erzeugen. Selbst wenn du versuchst, einen Text in eine Integer-Variable einzulesen, bekommst du nur eine 0 als Wert, ansonsten arbeitet das Programm ungerührt weiter.
 
 
Es wäre hilfreich, wenn du etwas genauer erläutern würdest, was du vorhast (wieviele der Werte brauchst du tatsächlich, in aufsteigender Reihenfolge oder wild hin- und herspringend, jeden Wert nur einmal oder mehrfach... ?).
 
 
Gruß
 
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ALWIM
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
  | 
		
			
				 Verfasst am: 17.03.2014, 13:57    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | grindstone hat Folgendes geschrieben: | 	 		  @ALWIM: Hantierst du in deinem Programm mit irgendwelchen Pointern? Mit normalen Dateioperationen ist es nämlich unmöglich, eine Schutzverletzung zu erzeugen. Selbst wenn du versuchst, einen Text in eine Integer-Variable einzulesen, bekommst du nur eine 0 als Wert, ansonsten arbeitet das Programm ungerührt weiter.
 
 
Es wäre hilfreich, wenn du etwas genauer erläutern würdest, was du vorhast (wieviele der Werte brauchst du tatsächlich, in aufsteigender Reihenfolge oder wild hin- und herspringend, jeden Wert nur einmal oder mehrfach... ?).
 
 
Gruß
 
grindstone | 	  
 
 
In einer Datei stehen ein bzw. zweistellige Zahlen drin. Mit Datum und Uhrzeit versehen. 5-10 davon (die neuesten hinzugekommenden Zahlen) will ich laden.
 
Die Zahlen sind durcheinander und kommen mehrfach vor!
 
Es können theoretisch 10 Billionen Zahlen und mehr sein, die in der Datei drin stehen!
 
 
Als ich das ganze ein wenig getestet habe, war ich wahrscheinlich schon zu müde! Da werde ich nochmals meinen Grips einschalten müssen.
 
 
 	  | Zitat: | 	 		  | Hantierst du in deinem Programm mit irgendwelchen Pointern? | 	  
 
Nein. Da muss ich mir nochmal Gedanken drüber machen!
 
 
Gruß
 
ALWIM _________________ SHELL SHUTDOWN -s -t 05 | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		nemored
 
  
  Anmeldungsdatum: 22.02.2007 Beiträge: 4712 Wohnort: ~/
  | 
		
			
				 Verfasst am: 17.03.2014, 17:21    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | grindstone hat Folgendes geschrieben: | 	 		  | @ALWIM: Hantierst du in deinem Programm mit irgendwelchen Pointern? Mit normalen Dateioperationen ist es nämlich unmöglich, eine Schutzverletzung zu erzeugen. | 	  
 
So eine Schutzverletzung müsste schon möglich sein, etwa wenn man Werte in Speicherbereiche liest, die außerhalb des reservierten Bereichs liegen. Dann wäre das aber auf jeden Fall kein Problem eines zu geringen Speichers, sondern einer falschen Berechnung der Array-Größe. Wie immer in einem solchen Fall lässt sich natürlich ohne zugehörigem Code hervorragend spekulieren, jedoch nichts konkretes sagen.
 
 
Meine erste Reaktion auf eine allgemeine Schutzverletzung ist immer, das Programm mit -exx zu compilieren; das findet schon eine ganze Menge. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		RockTheSchock
 
 
  Anmeldungsdatum: 04.04.2007 Beiträge: 138
 
  | 
		
			
				 Verfasst am: 17.03.2014, 23:14    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | ALWIM hat Folgendes geschrieben: | 	 		  In einer Datei stehen ein bzw. zweistellige Zahlen drin. Mit Datum und Uhrzeit versehen. 5-10 davon (die neuesten hinzugekommenden Zahlen) will ich laden. Die Zahlen sind durcheinander und kommen mehrfach vor! Es können theoretisch 10 Billionen Zahlen und mehr sein, die in der Datei drin stehen!
 
 | 	  
 
 
Leider wissen wir immer noch nicht so recht was du eigentlich machen möchtest. Ich fasse mal zusammen:
 
 
5-10 bestimmte neu hinzugekommene Zahlen in einer Datei mit 10 Billionen Zahlen finden. 
 
Das finden der Zahlen soll möglichst schnell gehen(keine 3 Minuten)
 
Eine Datei enthält als Text die Zahlen zusammen mit Datums und Zeitangaben
 
Eine andere Datei enthält auch Strings. 
 
 
 
Meine Fragen:
 
 
- Hast du Einfluss auf das Format der Textdatei. Wird die Datei von einem Programm dass du selbst geschrieben hast erzeugt?
 
- Wie soll das genaue Format der Textdatei sein? Hast du mehr als ein Format bzw. mehrere Dateien?
 
Warum ließt du die Textdatei nicht rückwärts aus, solange bis die Werte gefunden wurden oder die Datei den Anfang erreicht hat bzw. bist du den Punkt erreicht hast, ab dem du im Durchgang davor schon gesucht hast?
 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ALWIM
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
  | 
		
			
				 Verfasst am: 18.03.2014, 00:42    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Zitat: | 	 		  | Leider wissen wir immer noch nicht so recht was du eigentlich machen möchtest. | 	  
 
 
 
Also: Ein Computerspiel (Roulette) speichert die gewonnenen Roulettezahlen mit Datum und Uhrzeit in einer Datei ab. Ich möchte lediglich die letzten 5-10 gewonnenen Roulettezahlen einlesen und auf dem Bildschirm ausgeben!
 
 
Format:
 
 
 	  | Code: | 	 		   32           04-20-2013    16:49:56
 
 21           05-17-2013    17:19:30
 
 7            12-17-2013    19:39:26
 
 9            12-17-2013    19:40:04 | 	  
 
so wie oben werden die Daten gespeichert!
 
Habe Mangels Zeit, mir nicht mehr Gedanken darüber gemacht!
 
Hin bekommen habe ich es vor langer Zeit schon mal. Das war damals bei einem früheren Rouletteprogramm mit Qbasic! Funktioniert allerdings mit Freebasic nicht so einfach. Komme mit dem Alt-Quellcode sehr schnell an eine der Grenzen. Mit 7 Millionen Zahlen in der Datei könnte ich gut leben. Bloß kann es sein, dass dann irgendwann das Programm nicht mehr richtig funktioniert, wegen der Speicherzugriffsverletzungen. 
 
 
Ich will ja von euch keinen fertigen Quellcode haben, aber im moment komme ich da kein Stückchen weiter. Sofern ich mal ein wenig Zeit und Lust habe, werde ich das ganze nochmal in Angriff nehmen. Eine Idee habe ich schon mal! Ist halt nur ne Notlösung, aber die würde funktionieren!
 
 
 	  | Zitat: | 	 		  | Wie immer in einem solchen Fall lässt sich natürlich ohne zugehörigem Code hervorragend spekulieren, jedoch nichts konkretes sagen. | 	   Den kann ich euch leider nicht liefern, da ich nichts als die obigen geposteten Zeilen (Beitrag 1) habe!
 
 
Gruß
 
ALWIM _________________ SHELL SHUTDOWN -s -t 05 | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		grindstone
 
 
  Anmeldungsdatum: 03.10.2010 Beiträge: 1283 Wohnort: Ruhrpott
  | 
		
			
				 Verfasst am: 18.03.2014, 00:57    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Eine Anmerkung am Rande zum Thema "große Dateien":
 
 
Die Funktion "Eof" arbeitet bei Dateien >4 GB nicht korrekt. Als Workaround kann mandurchersetzen. Das liefert bei Erreichen des Dateiendes korrekt "-1" zurück.
 
 
Gruß
 
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ALWIM
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
  | 
		
			
				 Verfasst am: 18.03.2014, 03:29    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Jetzt liefere ich doch noch einen Quellcode:
 
 
 	  | Code: | 	 		  REDIM SHARED Roulettezahl(10000000) As DOUBLE
 
REDIM SHARED gewonneneZahl(10000000) As DOUBLE
 
DIM SHARED AS STRING Datum
 
DIM SHARED AS STRING Uhrzeit
 
DIM SHARED k AS UINTEGER
 
DIM SHARED i AS UINTEGER
 
DIM f AS INTEGER = FREEFILE
 
SCREENRES 640, 320, 32
 
COLOR &hFFFFFF
 
OPEN "Test.txt" FOR INPUT AS #f
 
i = 0
 
DO UNTIL EOF(f)
 
   INPUT #f, Roulettezahl(i), Datum, Uhrzeit
 
   IF MULTIKEY(&h01) THEN END
 
   i += 1
 
LOOP
 
CLOSE #f
 
LOCATE 5,5: PRINT "i: "; i
 
SLEEP
 
k = 1
 
DO
 
i -= 1
 
gewonneneZahl(k) = Roulettezahl(i)
 
IF k > i THEN exit DO
 
k += 1 
 
LOCATE 7,5: PRINT "k: "; k
 
LOCATE 9,5: PRINT "i: "; i
 
IF MULTIKEY(&h01) THEN END
 
LOOP
 
FOR k = 1 TO i
 
LOCATE k, 5: PRINT USING "##"; gewonneneZahl(k)
 
NEXT
 
SLEEP
 
END | 	  
 
 
Test.txt:
 
 	  | Code: | 	 		   32           04-20-2013    16:49:56
 
 21           05-17-2013    17:19:30
 
 7            12-17-2013    19:39:26
 
 9            12-17-2013    19:40:04 | 	  
 
 
Funktioniert doch oder?      
 
 
Gruß
 
ALWIM _________________ SHELL SHUTDOWN -s -t 05 | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		grindstone
 
 
  Anmeldungsdatum: 03.10.2010 Beiträge: 1283 Wohnort: Ruhrpott
  | 
		
			
				 Verfasst am: 18.03.2014, 10:14    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | ALWIM hat Folgendes geschrieben: | 	 		  REDIM SHARED Roulettezahl(10000000) As DOUBLE
 
REDIM SHARED gewonneneZahl(10000000) As DOUBLE
 
...  | 	  Ist das ein neuartiges Roulette, das mit Kommazahlen arbeitet?  
 
 
Und welchen Sinn hat es, die hintere Hälfte eines Arrays in umgekehrter Reihenfolge in ein zweites Array zu kopieren?   
 
 
Gruß
 
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		RockTheSchock
 
 
  Anmeldungsdatum: 04.04.2007 Beiträge: 138
 
  | 
		
			
				 Verfasst am: 18.03.2014, 17:52    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Ich habe mal ein Beispiel geschrieben wo die Datei Rückwärts eingelesen wird und ein Array mit Roulettezahlen gefüllt wird. Wobei du die indizes des Arrays auch etwas ändern kannst.
 
 
 	  | Code: | 	 		  Type Roulettezahlen
 
   wert As Integer
 
   datum As String
 
   zeit As String
 
End Type
 
 
Function Einlesen(dateiname As String, z() As Roulettezahlen) As Integer
 
   
 
   Dim f AS Integer = FreeFile
 
   ScreenRes 640, 320, 32
 
   Color &hFFFFFF
 
   Open dateiname FOR Binary AS #f
 
   
 
   Dim i As Integer
 
   Dim p As LongInt
 
   Dim zeile As String 
 
   Dim zeichen As UByte
 
   Dim leerpos As Integer,leerpos2 As Integer
 
   Dim eingelesen As Integer
 
   
 
   
 
   i = LBound(z)
 
   
 
   p=Lof(f)
 
   Do UNTIL p<1            
 
      Seek #f,p      
 
      
 
      Get #f, ,zeichen
 
      If zeichen>31  And zeichen <128  Then
 
         zeile = chr(zeichen)+zeile          
 
      Else         
 
         If zeichen = 13 Or p=2  Then
 
            leerpos = InStr(zeile," ")
 
            z(i).wert= Cint(Left(zeile,leerpos))            
 
            leerpos2=InStrRev(zeile," ")            
 
            z(i).datum=Trim(Mid(zeile,leerpos,leerpos2-leerpos))
 
            z(i).zeit=Trim(Mid(zeile,leerpos2))
 
            
 
            'Print zeile,z(i).wert,z(i).datum,z(i).zeit
 
                  
 
            zeile=""
 
            i=i+1
 
            eingelesen = eingelesen+1
 
            If i>UBound(z) Then Return eingelesen            
 
         End If
 
      End If   
 
      
 
         
 
      p=Seek(f)-2
 
      IF MULTIKEY(&h01) Then End
 
   Loop
 
 
   leerpos = InStr(zeile," ")
 
   z(i).wert= Cint(Left(zeile,leerpos))            
 
   leerpos2=InStrRev(zeile," ")            
 
   z(i).datum=Trim(Mid(zeile,leerpos,leerpos2-leerpos))
 
   z(i).zeit=Trim(Mid(zeile,leerpos2))
 
   'Print zeile,z(i).wert,z(i).datum,z(i).zeit
 
   
 
   
 
   eingelesen = eingelesen+1   
 
   Return eingelesen
 
   Close #f   
 
End Function
 
 
ReDim zahl(-16 To -13) As Roulettezahlen
 
'ReDim zahl(6 To 8) As Roulettezahlen
 
Dim eingelesen As Integer
 
 
 
eingelesen = Einlesen("Test.txt", zahl())
 
Print "Zahlen eingelesen: ";eingelesen
 
sleep
 
For i As Integer = LBound(zahl) To UBound(zahl)      
 
   Print zahl(i).wert,zahl(i).datum,zahl(i).Zeit   
 
Next
 
 
sleep
 
 | 	 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		nemored
 
  
  Anmeldungsdatum: 22.02.2007 Beiträge: 4712 Wohnort: ~/
  | 
		
			
				 Verfasst am: 18.03.2014, 18:28    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Statt Datum- und Zeit-Strings würde ich außerdem eher [url]Serial Numbers[/url] verwenden - sparen eine Mange Platz, und wenn dann jeder Datensatz exakt 4+8 Byte groß ist (wobei 1+8 Byte auch ausreichen würden), kannst du bequem an jede beliebige Stelle springen zum auslesen. Die Datei ist dann allerdings nicht mehr für Menschen lesbar, aber das scheint mir ja auch nicht das Ziel zu sein. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ALWIM
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
  | 
		
			
				 Verfasst am: 18.03.2014, 19:06    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Jetzt habe ich die ideale Lösung!
 
Ich erstelle 2 Dateien. In der einen Datei werden die Roulettezahlen mit Datum und Uhrzeit gespeichert. Diese wird weder gelöscht noch eingelesen.
 
Die andere Datei speichert ebenfalls die Roulettezahlen mit Datum und Uhrzeit, wird aber nach 5-10 gewonnenen Zahlen wieder gelöscht. Diese lese ich dann ein. So bleibt der Speicher, den ich beim einlesen verbrauche,  mehr als gering!
 
 
Somit kann ich ganz normal wie gehabt "DIM" und nicht "REDIM" verwenden!
 
 
Gruß
 
ALWIM _________________ SHELL SHUTDOWN -s -t 05 | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
  | 
   
 
     |