Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

DIM und Logische Filenummer

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Nullchecker



Anmeldungsdatum: 03.08.2013
Beiträge: 34

BeitragVerfasst am: 21.07.2014, 18:41    Titel: DIM und Logische Filenummer Antworten mit Zitat

Hallo, mal eine Frage zu DIM und logischen Filenummern.
Wenn ich ein zweidimensionales Array erstellen möchte (z.B. DIM AS STRING bon (0 TO 1000, 20), wird das überhaupt korrekt ausgeführt beim Einlesen bzw. Abspeichern der Daten, da ich aus der Referenz ersehe, dass nur logische Files bis 255 gelesen (geöffnet) werden können (hier wären es ja 1000, oder mache ich einen Denkfehler?). Wie muss ich vorgehen um das Ziel zu erreichen?
_________________
Mein Brett vor`m Kopf bringt mich heute wieder um
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 21.07.2014, 19:43    Titel: Antworten mit Zitat

Soviele Nummern bräuchtest du nur, wenn du
1) tatsächlich so viele Dateien wie Array-Zellen anlegen möchtest, was ich mir nicht vorstellen kann
2) du tatsächlich so viele Dateien gleichzeitig geöffnet haben willst. Möchtest du tatsächlich 1000 Dateien mit Inhalten befüllen, bietet es sich an, die Dateien nacheinander zu öffnen, dann kann man dieselbe Dateinummer weiterverwenden. In dieser Hinsicht ist es auch sinnvoll, FREEFILE statt festkodierter Dateinummern zu verwenden.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Nullchecker



Anmeldungsdatum: 03.08.2013
Beiträge: 34

BeitragVerfasst am: 21.07.2014, 20:24    Titel: Antworten mit Zitat

Ich denke ich habe das Problem nicht richtig dargestellt.
Stelle Dir vor ich habe 1000 Pflanzen, der Wert 20 nach dem Komma bei DIM bezieht sich auf Angaben(Pflegehinweise) wie > Alter der Pflanze>Standort>Umtopftermin usw.
Laut Referenz würden ja die Namen und Pflegehinweise der ersten 255 Pflanzen eingelesen werden. Auch bei FREEFILE gelten laut Referenz 0 bis 255 Werte.
Wie kann ich die Werte der anderen Pflanzen (Nr. 256 bis 1000) verarbeiten (einlesen/abspeichern)?
_________________
Mein Brett vor`m Kopf bringt mich heute wieder um
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 21.07.2014, 20:56    Titel: Antworten mit Zitat

Stehen die Informationen in 1000 verschiedenen Dateien oder alle in einer einzigen?

Wenn ersteres - warum musst du alle Dateien gleichzeitig öffnen? Eine öffnen, Werte einlesen, schließen - nächste öffnen usw. Dann werden die Dateinummern immer wieder frei.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 22.07.2014, 08:15    Titel: Antworten mit Zitat

@Nullchecker: Ich glaube, du wirfst da zwei Dinge durcheinander: Was du bei "bon" angibst, sind die Indexgrenzen eines Arrays, und das ist etwas völlig anderes als eine Dateinummer. Ein Array liegt im Hauptspeicher, eine Datei (normalerweise) auf der Festplatte.

Du kannst z.B. das ganze Array in einer einzigen Datei unterbringen...
Code:
Dim As String bon (1000, 20)
Dim As Integer ff

For x As Integer = LBound(bon,1) To UBound(bon,1) 'testdaten in array schreiben
   For y As Integer = LBound(bon,2) To UBound(bon,2)
      bon(x,y) = ">"+ Str(x*20 + y) + "<"
   Next
Next

ff = FreeFile 'dateinummer generieren
Open "c:\pflanzen.txt" For Output As ff 'datei für ausgabe öffnen
Print #ff, LBound(bon,1) 'indices abspeichern zum späteren wiederherstellen des arrays
Print #ff, UBound(bon,1)
Print #ff, LBound(bon,2)
Print #ff, UBound(bon,2)

For x As Integer = LBound(bon,1) To UBound(bon,1) 'array in datei schreiben
   For y As Integer = LBound(bon,2) To UBound(bon,2)
      Print #ff, bon(x,y)
   Next
Next

Close ff
...und es anschließend wieder einlesen:
Code:
ReDim As String bon (1,1)
Dim As Integer ff, l1, u1, l2, u2

ff = FreeFile
Open "c:\pflanzen.txt" For Input As ff
Input #ff,l1 'arraygrenzen einlesen
Input #ff,u1
Input #ff,l2
Input #ff,u2

ReDim bon (l1 To u1, l2 To u2) 'array anlegen
For x As Integer = LBound(bon,1) To UBound(bon,1) 'datei einlesen und in array schreiben
   For y As Integer = LBound(bon,2) To UBound(bon,2)
      Input #ff, bon(x,y)
   Next
Next

Close ff

For x As Integer = LBound(bon,1) To UBound(bon,1) 'array ausdrucken
   For y As Integer = LBound(bon,2) To UBound(bon,2)
      Print x;y;" ";bon(x,y)
   Next
Next

Sleep


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Nullchecker



Anmeldungsdatum: 03.08.2013
Beiträge: 34

BeitragVerfasst am: 22.07.2014, 19:49    Titel: Antworten mit Zitat

Wie grindstone es vermutete, habe ich da etwas falsch verstanden. Ich hatte jetzt Zeit zum Testen und habe es hinbekommen.

@Jojo
Auf Deine prompte Antwort hin ahnte ich schon, dass ich irgendetwas nicht richtig verstanden habe.

@nemored
Die Daten stehen alle in einer Datei. Mein Denkfehler war wohl, dass ich angenommen habe, dass jeder Datensatz eine logische Filenummer hat.

@grindstone
Vielen Dank für Dein Code - Beispiel. Ich musste mich erstmal mit LBound und UBound in der Referenz auseinandersetzen (Ich hatte keine Ahnung wozu man das benötigt). Ich will aber auch ehrlich sagen das ich diese Befehle bei meinem Test nicht verwendet habe, da ich deren Sinn (derzeit) noch nicht ganz verstehe.

Ich Danke euch dreien für euere Antworten und Anregungen.
Aus einer einzelnen Antwort wäre ich wohl nicht viel schlauer geworden, aber im gesamten hat es mir die Augen geöffnet.

P.S. Falls ich mich wieder mal mit einer Frage im Forum melde, bedenkt bei eueren Antworten bitte immer das ich ein echter Laie bin und haltet alle Erklärungen und Beispiele so einfach wie möglich, damit ich euch folgen kann.
_________________
Mein Brett vor`m Kopf bringt mich heute wieder um
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 22.07.2014, 20:03    Titel: Antworten mit Zitat

Nullchecker hat Folgendes geschrieben:
@grindstone
Vielen Dank für Dein Code - Beispiel. Ich musste mich erstmal mit LBound und UBound in der Referenz auseinandersetzen (Ich hatte keine Ahnung wozu man das benötigt). Ich will aber auch ehrlich sagen das ich diese Befehle bei meinem Test nicht verwendet habe, da ich deren Sinn (derzeit) noch nicht ganz verstehe.


Grundsätzlich macht man damit sein Programm besser wartbar und verständlich, weil sie aktiv verhindern, dass du irgendwelche willkürzlich gewählten Konstanten in deinem Quelltext verstreust.
Wenn du jetzt z.B. 1000 Pflanzen hast und an jeder Stelle im Quelltext, wo das Array verwendet wirst, die Array-Grenzen 0 und 1000 explizit hinschreibst, wird dein Programm garantiert nicht mehr funktionieren, wenn du dich irgendwann mal dazu entscheiden solltest, die obere Grenze auf 2000 zu erhöhen (oder falls du ein dynamisch wachsendes Array verwendest), weil du irgendwo bestimmt vergessen wirst, die 1000 im Text anzupassen.

Mit Ubound findet der Compiler selbst raus, wie groß das Array ist, und du musst nicht überall im Programm selbst angeben, dass das Array (momentan) die obere Grenze 1000 hat.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.


Zuletzt bearbeitet von Jojo am 23.07.2014, 22:34, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 22.07.2014, 21:02    Titel: Antworten mit Zitat

Grundproblem der ganzen Diskussion hier: Bei vielen BASIC-Dialekten wurde das Thema Ressourcenidentifizierung (Dateien, aber auch Fenster und Screen [beim Commodore Amiga früher]) mit Nummern gelöst, während eigentlich professionelle Programmierung mit Handles (z.B. Pointer) oder ganz neu sogar Objekten arbeitet (z.B. VBScript macht es so: Ein FileSystemObjekt gibt ein TextStream-Objekt zurück, welches dann ReadLine(), WriteLine(), atEndOfStream(), Close() usw. als Methoden versteht).

Solche festen Nummern behindern natürlich die Wiederverwendbarkeit. Seit QB wurde deshalb FREEFILE als Abhilfe eingeführt. Für die hier diskutierte Sache:
Code:
' Falsch!
DIM fileHandle(1 TO 100) As Integer

FOR i=1 TO 100
  fileHandle(i) = FREEFILE
NEXT i
FOR i=1 TO 100
  OPEN "foodatei" + str(i) + ".txt" FOR INPUT AS fileHandle(i)
NEXT i

' Richtig!
DIM fileHandle(1 TO 100) As Integer

FOR i=1 TO 100
  fileHandle(i) = FREEFILE
  OPEN "foodatei" + str(i) + ".txt" FOR INPUT AS fileHandle(i)
NEXT i

d.h. nach einem FREEFILE-Aufruf muss immer die Datei sofort geöffnet werden, bevor der nächste FREEFILE-Aufruf kommt. Achtung Ressourcen: In Linux existiert sogar ein spezieller Kernel-Paremeter, mit dem die maximale Zahl der gleichzeitig offenen Dateien bestimmt werden kann:
man ulimit hat Folgendes geschrieben:
4 (Implemented but no symbolic constant provided.) Return the maximum number of files that the calling process can open.


Umgehert früher in GW-BASIC existierte noch "/f" als Parameter (je grösser, desto mehr gleichzeitig offene Dateien, aber auch umso weniger freier Speicher fürs BASIC-Programm) + auf MS-DOS-Ebene der "FILES="-Parameter in der CONFIG.SYS wichtig an dieser Stelle: Mehr gleichzeitig offene Dateien ging damals auf Kosten des freien konventionellen Speichers. In Form der CONFIG.NT existiert der FILES-Parameter übrigens auch heute noch.

Von daher ist ein rasches Schliessen empfehlenswert, z.B.
Code:
' Noch besser
DIM fileHandle As Integer, z As String

FOR i=1 TO 100
  fileHandle = FREEFILE
  OPEN "foodatei" + str(i) + ".txt" FOR INPUT AS fileHandle
  WHILE NOT EOF(fileHandle)
     LINE INPUT#fileHandle, z
     ' z verarbeiten
  WEND
  CLOSE fileHandle
NEXT i

=> durch sofortiges Schliessen entsteht keine Ressourcen-Überlastung.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 23.07.2014, 09:42    Titel: Antworten mit Zitat

Nullchecker hat Folgendes geschrieben:
bedenkt bei eueren Antworten bitte immer das ich ein echter Laie bin und haltet alle Erklärungen und Beispiele so einfach wie möglich, damit ich euch folgen kann.
In Ordnung. Ich werde in Zukunft ganz langsam schreiben. zwinkern

dreael hat Folgendes geschrieben:
Von daher ist ein rasches Schliessen empfehlenswert
Das kann man so pauschal auch nicht sagen, denn das Öffnen und Schließen einer Datei kostet sehr viel Zeit.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Nullchecker



Anmeldungsdatum: 03.08.2013
Beiträge: 34

BeitragVerfasst am: 23.07.2014, 18:52    Titel: Antworten mit Zitat

@ Jojo
Das ist eine tolle Erklärung von Dir, die selbst ich jetzt verstehe.

@dreael
Jetzt habe ich wohl auch den Sinn von FREEFILE verstanden.

@grindstone
grindstone hat Folgendes geschrieben:
In Ordnung. Ich werde in Zukunft ganz langsam schreiben.


Witzbold. Na ja, Ruhrpotthumor (ist O.K., ich wohne auch im Ruhrpott)
_________________
Mein Brett vor`m Kopf bringt mich heute wieder um
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz