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:

Binär Verschlüsselung - Problem

 
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
g3m1n1



Anmeldungsdatum: 16.10.2008
Beiträge: 10

BeitragVerfasst am: 16.10.2008, 14:53    Titel: Binär Verschlüsselung - Problem Antworten mit Zitat

Hi Leute...
Habe mich heute hier registiriert und schon kommt die erste Frage lächeln

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 lächeln

Viele Grüße, Andy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The_Muh
aka Mark Aroni


Anmeldungsdatum: 11.09.2006
Beiträge: 718

BeitragVerfasst am: 16.10.2008, 15:04    Titel: Antworten mit Zitat

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 happy

gibt einfach mal den ganze code her.
_________________
// nicht mehr aktiv //
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 16.10.2008, 15:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
g3m1n1



Anmeldungsdatum: 16.10.2008
Beiträge: 10

BeitragVerfasst am: 16.10.2008, 17:50    Titel: Antworten mit Zitat

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 ? lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 16.10.2008, 18:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
g3m1n1



Anmeldungsdatum: 16.10.2008
Beiträge: 10

BeitragVerfasst am: 16.10.2008, 19:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The_Muh
aka Mark Aroni


Anmeldungsdatum: 11.09.2006
Beiträge: 718

BeitragVerfasst am: 16.10.2008, 19:23    Titel: Antworten mit Zitat

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 happy

@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
Benutzer-Profile anzeigen Private Nachricht senden
g3m1n1



Anmeldungsdatum: 16.10.2008
Beiträge: 10

BeitragVerfasst am: 16.10.2008, 19:37    Titel: Antworten mit Zitat

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 happy )

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 grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



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

BeitragVerfasst am: 16.10.2008, 23:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
g3m1n1



Anmeldungsdatum: 16.10.2008
Beiträge: 10

BeitragVerfasst am: 16.10.2008, 23:43    Titel: Antworten mit Zitat

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 lächeln

cin>>code ( c++ )
input code oder line input code ( Qbasic eigentlich )
Readln etc. etc.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



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

BeitragVerfasst am: 17.10.2008, 00:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
g3m1n1



Anmeldungsdatum: 16.10.2008
Beiträge: 10

BeitragVerfasst am: 17.10.2008, 00:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jojo
alter Rang


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

BeitragVerfasst am: 17.10.2008, 00:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
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