Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
g3m1n1
Anmeldungsdatum: 16.10.2008 Beiträge: 10
|
Verfasst am: 16.10.2008, 14:53 Titel: Binär Verschlüsselung - Problem |
|
|
Hi Leute...
Habe mich heute hier registiriert und schon kommt die erste Frage
Ich schreibe zur Zeit ein Programm welches Dateien binär einliest
um sie dann später verschlüsselt wieder auszugeben. Das funktioniert
soweit recht gut, aber als ich plötzlich meine test.txt Datei um ein paar
Zeilen vergrößert habe, stürzt mir der Interpreter EXAKT nach dem
45sten Schleifendurchlauf ab. Ist die Textdatei kleiner, hat er kein Problem.
Hier die Routine zum Einlesen :
OPEN "test.txt" FOR BINARY AS #f
do
GET #f, , array(x)
print x
x = x + 1
loop until EOF(1)
CLOSE #f
Wie gesagt, wenn mir "45" angezeigt wird in der Konsole, bleibt das
Programm hängen und FDIDETEMP reagiert nicht mehr. Wenn ich weniger Inhalt in der Textdatei habe, dass der Zähler beispielsweise nur auf 44 Läuft und nicht weiter, ist alles ok.
Hat das Array vielleicht eine Größenbeschränkung ???
Oder hab ich bei dem binären openmode was vergessen ???
Wär super wenn einer von euch mir helfen könnte
Viele Grüße, Andy |
|
Nach oben |
|
 |
The_Muh aka Mark Aroni

Anmeldungsdatum: 11.09.2006 Beiträge: 718
|
Verfasst am: 16.10.2008, 15:04 Titel: |
|
|
bitte mal den gesamten code. mich persönlich interessiert vorallem die zeile wo du das array dimensionierst... wahrscheinlich hast du dein array mit ner größenbeschränkung dimensioniert, das lässt sich aber ganz leicht beseitigen
gibt einfach mal den ganze code her. _________________ // nicht mehr aktiv // |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 16.10.2008, 15:58 Titel: |
|
|
Nebenbei (auch wenn das nichts mit dem Problem zu tun hat):
Statt
Code: | do
GET #f, , array(x)
print x
x = x + 1
loop until EOF(1) |
wäre ein
Code: | do while not EOF(1)
GET #f, , array(x)
print x
x = x + 1
loop |
besser, weil es ja immerhin sein kann, dass die Datei leer ist. Der erste Code führt dann die Schleife auf jeden Fall einmal aus und erzeugt deshalb einen Fehler, der zweite führt die Schleife in diesem Fall gar nicht erst aus. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
g3m1n1
Anmeldungsdatum: 16.10.2008 Beiträge: 10
|
Verfasst am: 16.10.2008, 17:50 Titel: |
|
|
Danke für den Tip mit der leeren Datei !
Und hier werden die Variablen initialisiert, steht direkt
über dem anderen code :
dim x as integer = 0
dim f as INTEGER = FREEFILE
dim array(x) as INTEGER
dim maxlength AS INTEGER
Wo hat sich da der Fehler eingeschlichen ?  |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 16.10.2008, 18:48 Titel: |
|
|
1. du nutzt 'f' als Filenummer. Darum sollte bei EOF auf f drin stehen! '1' in eof gibt immer an das die filenummer '1' gemeint ist ... in f >könnte< jedoch auch was anderes drin stehen.
2. Until immer in do da es sein kann das man nach dem öffnen der datei diese schon als leer gilt.
3. Du musst das array redimensionieren, wenn du ein dynamisches nutzt, und kein statisches.
4. freefile sollte man so kurz wie möglich vor dem open (is aber nur bei Threads wichtig) ausführen
5. Prüffe immer ob die datei auch geöffnet wurde. kann ja sein das sie gespert ist oder ein Rechteproblem vorliegt.
Code: |
dim x as integer = 0
dim array() as INTEGER
dim maxlength AS INTEGER
dim f as INTEGER = FREEFILE
If OPEN("test.txt" FOR BINARY AS #f) <> 0 then Print "Konnte Datei nicht öffnen!": end -1
do until EOF(f)
GET #f, , array(x)
print x
x = x + 1
redim preserve array(x) as integer
loop
CLOSE #f
|
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
g3m1n1
Anmeldungsdatum: 16.10.2008 Beiträge: 10
|
Verfasst am: 16.10.2008, 19:04 Titel: |
|
|
Danke für den Ansatz, aber es funktioniert immer noch
nicht....der gleiche Fehler... bis auf die Tatsache dass
nun garnicht mehr gezählt wird. Auch nicht bis 45.
Riesen Rätsel !!!
Vielleicht ein Fehler in FreeBasic ?!
Ich benutze übrigens die neuste freebasic version mit freebasic ide.
Soweit ich das der Hilfe entnehmen kann, bräuchte ich für REDIM PRESERVE
den Meta tag '$DYNAMIC.
Aber das geht laut Hilfe nicht mit der Version...?! |
|
Nach oben |
|
 |
The_Muh aka Mark Aroni

Anmeldungsdatum: 11.09.2006 Beiträge: 718
|
Verfasst am: 16.10.2008, 19:23 Titel: |
|
|
Code: |
dim x as integer = 0
dim array() as INTEGER
dim maxlength AS INTEGER
dim f as INTEGER = FREEFILE
If OPEN("test.txt" FOR BINARY AS #f) <> 0 then Print "Konnte Datei nicht öffnen!": end -1
while not EOF(f)
x += 1
redim preserve array(x)
GET #f, , array(x)
print x
wend
CLOSE #f |
so funktioniert es bei mir
Edit:
TPM:
a) man dimensioniert bevor man etwas ins array schreibt
b) warum "Do until EOF(f) ... loop" und nicht "while not EOF(f) ... wend"
c) Versuch mal deinen code auszuführen bevor du ihn hier postest
@g3m1n1:
Redim braucht nur 1 argument: den namen des arrays, alternativ kann man den Typ ändern oder ein Preverser vor den namen des arrays setzen, damit der bisherige inhalt beibehalten wird (es sei denn man macht das array kleiner, dann wird halt abgeschnitten) _________________ // nicht mehr aktiv // |
|
Nach oben |
|
 |
g3m1n1
Anmeldungsdatum: 16.10.2008 Beiträge: 10
|
Verfasst am: 16.10.2008, 19:37 Titel: |
|
|
Wunderbar !
Ich übernehme den code jetzt so. Danke !
Allerdings hab ich mittlerweile selbst etwas rumpriobiert und
der code hier geht auch....( ich wette aber, dass damit was nicht stimmt )
Code: | DIM x AS INTEGER = 0
DIM array() AS INTEGER
DIM maxlength AS INTEGER
DIM f AS INTEGER = FREEFILE
IF OPEN ("aufg.txt" FOR BINARY AS #f) <> 0 THEN PRINT "Konnte Datei nicht öffnen!": END -1
maxlength = LOF(f)
CLOSE #f
print maxlength
REDIM array(maxlength)
SLEEP
OPEN "aufg.txt" FOR BINARY AS #f
DO UNTIL EOF(f)
GET #f, , array(x)
PRINT x;" ";array(x)
x = x + 1
LOOP
CLOSE #f
|
Jetzt muss ich nurnoch rausfinden wieso zur Hölle Basic bei ner
Input Anweisung nicht stehenbleibt und alles läuft.
Besser gesagt, manchmal bleibt es stehen, manchmal nicht.
Achja...und rausfinden muss ich auch noch wieso, wenn ich ein Bitmap
Bild binär einlese, dann codiere, und die codierte Datei wieder encodiere,
die Farben zum Teil nicht mehr stimmen ....
Jaaaa.... ich hab noch zu tun. Macht höllisch spass mal wieder Qbasic
zu programmieren  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 16.10.2008, 23:27 Titel: |
|
|
g3m1n1 hat Folgendes geschrieben: | Vielleicht ein Fehler in FreeBasic ?! |
Aus Erfahrung gesprochen: Meistens nicht.
The_Muh hat Folgendes geschrieben: | b) warum "Do until EOF(f) ... loop" und nicht "while not EOF(f) ... wend" |
Kannst du machen, wie du willst; nur ein DO ... LOOP UNTIL EOF(f) ist für eine leere Datei ungeeignet. WHILE ... WEND ist gleichbedeutend mit DO WHILE ... LOOP, und ob du nun WHILE oder UNTIL verwendest ist reine Geschmackssache (musst halt die Bedingung umformulieren).
g3m1n1 hat Folgendes geschrieben: | Jetzt muss ich nurnoch rausfinden wieso zur Hölle Basic bei ner
Input Anweisung nicht stehenbleibt und alles läuft.
Besser gesagt, manchmal bleibt es stehen, manchmal nicht. |
Hmm ... Quellcodebeispiel?
edit: Frage übersehen
Zitat: | Soweit ich das der Hilfe entnehmen kann, bräuchte ich für REDIM PRESERVE
den Meta tag '$DYNAMIC. |
Nicht wenn du das Array ohne Grenzen dimensionierst (wie hier mir DIM array() ) oder wenn du stattdessen gleich REDIM nimmst. Wenn du allerdings z. B. DIM array(5) nimmst, kannst du das später nicht redimensionieren. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
g3m1n1
Anmeldungsdatum: 16.10.2008 Beiträge: 10
|
Verfasst am: 16.10.2008, 23:43 Titel: |
|
|
Ich meine, früher in QB wars immer so, dass wenn der Befehl INPUT oder LINE INPUT kommt, der Programmablauf pausiert. Eben, damit man etwas eingeben kann. Jetzt ist es so, dass das ab und an klappt, und dann wieder nicht. z.b.
DIM code AS STRING
LINE INPUT "Passwort: ";code
...
Das Programm übergeht einfach die Input Anweisung. War früher nie so.
Bei nem SLEEP dahinter wird der erste Tastendruck als Beendigung der SLEEP Anweisung genommen...bei GETKEY ebenso.
Packt man das alles in ne Schleife, was mir nicht wirklich gefällt...macht das
Programm sowieso was es will. Bei ner Abbruchbedingung z.b. Tastendruck
von Enter oder x oder ähnlichem....
Ich will doch nur ne Eingabe tätigen
cin>>code ( c++ )
input code oder line input code ( Qbasic eigentlich )
Readln etc. etc. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 17.10.2008, 00:15 Titel: |
|
|
Zitat: | Das Programm übergeht einfach die Input Anweisung. |
Das sollte eigentlich nicht passieren. Ich könnte mir höchstens vorstellen, dass aus irgend einem Grund irgendwas ein Signal an die Anwendung schickt, was diese auffängt und als Eingabe interpretiert ... k. A., vielleicht weiß jemand anderes mehr dazu. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
g3m1n1
Anmeldungsdatum: 16.10.2008 Beiträge: 10
|
Verfasst am: 17.10.2008, 00:41 Titel: |
|
|
ich habs.
Sehr komischer Fehler.
Wenn im code vor einer input bzw. line input Anweisung ein
sleep Befehl steht, ohne Zeitlimit, wird input übergangen.
Dabei ist egal ob SLEEP direkt vorher steht oder 10 Zeilen
vorher.
Dachte erst das könnte vielleicht daran liegen dass ein Enter-drücken
mehrere Steuerbefehle an QB schickt und deswegen die nächste
Tastaturabfrage welche mit Enter beendet wird mit dem ersten Tastendruck
auch automatisch beendet....aber z.b. hier :
SLEEP
print "blablabla"
SLEEP
DIM x AS String
line input "Eingabe: ";x
...
wird das 1. Sleep mit Enter beendet und das Programm steht dann
am 2. Sleep. d.h. es werden nicht zu viele Steuerzeichen gelesen ( ein
Tastendruck bewirkt nicht mehrere im Code bei kurzem drücken ).
Jedenfalls....das muss es sein. Als ich alle sleeps vor der input zeile
weggemacht habe, liefs wie gewohnt. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 17.10.2008, 00:49 Titel: |
|
|
Referenz-Lesen bildet:
Sleep hat Folgendes geschrieben: |
ACHTUNG: Der Tastaturpuffer wird dadurch nicht beeinflusst! Er muss nach einem Aufruf von SLEEP erst neu geleert werden! |
Alternative: GETKEY benutzen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
|