 |
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 |
Leader4
Anmeldungsdatum: 20.01.2005 Beiträge: 99 Wohnort: Leipzig
|
Verfasst am: 13.11.2005, 16:15 Titel: Strings einladen |
|
|
Hi,
wenn ich aus einer größeren Datei, einer Bitmap beispielsweise, einen String in mein Programm einladen möchte, endet der bei mir nach 1024 Byte (ich nehme an, die Stringe können bei der Line-Input-Anweisung maximal 1024 Byte aufnehmen). Ein Bild, das ich mir über die Open-Anweisung in mein kleines Programm einladen möchte, wird, wenn es größer als 1 KByte ist, demnach nur unvollständig geladen, weil dann der String zu Ende ist (es werden also nur die ersten 1024 Pixel des Bildes geladen).
Welche Möglichkeiten gibt es, dieses Problem zu lösen? Ich hätte gedacht, dass die Strings wenigstens 32.768 Byte (32 KB) aufnehmen können, was ja bereits einem Bild mit rund 180x180 Pixeln entspräche, nur 1 KB-Bitmaps sind für meine Vorhaben viel zu klein.
Ich hab schon überlegt, mehrere Line-Input-Anweisungen in die Open-For-Input-As-Anweisung hineinzuschreiben und diese eingeladenen Strings dann einfach zu verknüpfen, was jedoch Quatsch ist, weil die Bitmap aus nur einem einzigen String besteht und damit also nichts geändert werden würde.
Jemand 'ne Idee?
Thanks im Voraus. _________________ Ein richtiger Programmierer muss so richtig faul sein und sich den ganzen Tag mit der Frage beschäftigen, wie man mal wieder etwas einfacher machen kann. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 13.11.2005, 17:04 Titel: |
|
|
hi,
Strings können bis 2000k lang sein!
Deine Methode mit Line-Input die Pixel eines Bildes einzulesen ist nicht günstig dafür. Sobald ein CR LF als Bitmuster in dem Bild auftaucht bricht sie ab, da ja die ganze Textzeile gelesen wurde!
Gruß
Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Leader4
Anmeldungsdatum: 20.01.2005 Beiträge: 99 Wohnort: Leipzig
|
Verfasst am: 13.11.2005, 17:17 Titel: |
|
|
Ja, ganz sicher ist es im Allgemeinen so, aber leider nicht in meinem Fall. Ich habe von den Bitmaps bereits nur die verwendbaren Bytes aussortiert und die müssen allesamt gelesen werden können.
Ich habs jetzt noch mal in QBasic gesehen, und siehe da: Das Bild wird bis zum letzten Byte geladen. Haargenau dasselbe Programm, nur in QBasic kompiliert, lädt die Datei bis zum letzten Pixel, wo's in Freebasic bei 1024 aufhört. Auch andere Dateien werden in QBasic geladen, aber unter dem selben Programm, das in FreeBasic kompiliert wurde: Ende nach dem 1024. Byte (= 5 + 3/25 Zeilen eines Bildes mit 200 Pixel Breite).
Damit bin ich aber auch nicht weiter, schließlich brauche ich das Programm für FreeBasic und nicht für QBasic. Auch an den Unterschieden zwischen Ansi-Code und ASCII-Code kann es leider nicht liegen: Byte 1023, Byte 1024, Byte 1025... das sind alles dieselben Bytes, es gibt keinen Grund, bei 1024 plötzlich mit der Bearbeitung aufzuhören.
Ich habe irgendwie langsam den Eindruck, FreeBasic hat hier einfach einen riesigen Rückschritt gemacht, wo es doch sonst so viele Vorteile gegenüber QBasic hat.
M. f. G.
Leader4. _________________ Ein richtiger Programmierer muss so richtig faul sein und sich den ganzen Tag mit der Frage beschäftigen, wie man mal wieder etwas einfacher machen kann. |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 13.11.2005, 17:21 Titel: |
|
|
Hallo,
du kannst doch aus einem BMP nicht einfach alle Zeichen mit ASC(...)<32 rausfiltern! Dann klappt das sicherlich nicht. Für Bitmaps und alles Andere, was nicht nur reinen Klartext enthält, solltest du tunlichst BINARY als Zugriffsmodus nehmen. INPUT und LINE INPUT sind für Textzeilen gedacht.
FreeBASIC ist kein Rückschritt, sondern Bitmaps via INPUT/LINE INPUT zu öffnen ist einfach eine Schnapsidee!
BTW: Du solltest die aktuellste Version von FreeBasic verwenden, da alte Versionen das Problem hatten, Nullbytes nicht als Strings speichern zu können.
Hier ein funktionierender Bitmaploader für FB: http://fb.exp-soft.de/fbnp/?view=50 Damit kannst du auch in Strings abgelegte BMPs anzeigen lassen, wenn du den Source ein kleines bisschen umbaust.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 13.11.2005, 18:00 Titel: |
|
|
hi,
ich hoffe das Basicprogramm würde so auch in QBasic funktionieren
(ich kann es nicht unter QBasic ausprobieren, hab ich nicht).
Code: | Open "c:\freebasic\fbc.exe" For Input As #1
do
Line Input #1,a$
Print Len(a$);" ";
Loop Until EOF(1)
Close #1
sleep |
Zitat: | ....wo's in Freebasic bei 1024 aufhört. |
In freeBASIC ist hier in vielen Fällen a$ 2000 bis 5000 Byte lang.
Probier das mal selbst aus!
Gruß
Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Leader4
Anmeldungsdatum: 20.01.2005 Beiträge: 99 Wohnort: Leipzig
|
Verfasst am: 13.11.2005, 18:18 Titel: |
|
|
Die Datei besteht aus maximal verschiedenen 256 Byte, weil es eine 256-Farben-Bitmap ist. In QBasic wird auch genau das getan, was zu erwarten ist: Die Grafik wird geladen. Das ist das einzig logische, wenn man den Programmcode betrachtet. Und zwar mit nichts weiter als mit Line Input. Für so was brauch ich keine Binary, das sind ganz normale Bytes: ÿ steht für ein weißes Pixel, ü steht für ein blaues Pixel und mehr Farben hat dieses zu ladene Bild nicht. Das ganze Bild besteht aus 20.000 ÿ-Bytes und ü-Bytes, lückenlos. Was soll da nicht gehen? Wenn er ein Byte lädt, muss er doch auch das andere laden, wenn alle identisch sind.
Ich zeig euch mal den Programmcode. Im Anschluss folgt die Datei, die geladen werden soll. Diese steht im isi-Format (von mir selbst gewählt), in der sich nur noch die Farbinformationen der Pixel befinden... der Rest ist für das Programm nicht relevant.
SCREEN 7 'Grafikmodus
OPEN "IMG1.isi" FOR INPUT AS #2 'isi ist das Bild, das ursprünglich
Mal bmp war.
LINE INPUT #2, A$ 'A$: Horizontale Bildlänge In Pxl
LINE INPUT #2, B$ 'B$: Vertikale Bildlänge in Pxl
LINE INPUT #2, C$ 'C$: X-Startbildpunkt (1)
LINE INPUT #2, D$ 'D$ Y-Startbildpunkt (1)
LINE INPUT #2, E$
CLOSE #2
'E$ ist der Großstring mit den Bildinformationen. Jedes Byte steht
'logischerweise für ein Pixel. Die richtige Anordnung der Bytes auf dem
'Bildschirm sowie die richtige Umwandlung der Bytes in die jeweilige
'Farbe führt zum Laden des Bildes.
Z = 1 'Ein einfacher Zähler
Y = VAL(B$) + VAL(D$) 'Der Y-Startpunkt des Bildladens auf dem
'Bildschirm (Bsp.: Y=20: Bildet das
'Bild bei Y=20 auf dem Bildschirm ab)
'Hinweis: Bmps werden von unten nach
'oben geladen, daher ist Y am Anfang
'größer als am Ende.
X = VAL(C$) 'Der X-Startpunkt beim Bildladen (sollte
'im Normalfall 1 sein).
10
M = 1 'Wiederhole solange, bis Bildzeilenumbruch stattfinden muss
DO UNTIL M = VAL(A$)
B$ = MID$(E$, Z, 1) 'Byte-für-Byte-Einlesen der Datei
IF B$ = "ÿ" THEN COLOR 15: PSET (X, Y)
IF B$ = "ú" THEN COLOR 10: PSET (X, Y)
IF B$ = "û" THEN COLOR 14: PSET (X, Y)
IF B$ = "ù" THEN COLOR 12: PSET (X, Y)
IF B$ = "ý" THEN COLOR 13: PSET (X, Y)
IF B$ = "ü" THEN COLOR 9: PSET (X, Y)
IF B$ = "þ" THEN COLOR 11: PSET (X, Y)
IF B$ = " " THEN COLOR 0: PSET (X, Y)
IF B$ = "¤" THEN COLOR 8: PSET (X, Y)
'Hier wurden nun die Bytes in die jeweiligen Pixelfarben umgewandelt
und auf dem Bildschirm angezeigt. Somit wird das Bild geladen - bei
Dateien < 1 KB vollständig, bei Dateien > 1 KB unvollständig.
M = M + 1 'Geht ein Byte weiter
X = X + 1 'Addiert ein Pixel weiter
Z = Z + 1 'Zähler wird um 1 erhöht --> nächstes Byte lesen
LOOP
Z = Z + 1
Y = Y - 1 'Startet die nächste Bildzeile
X = VAL(C$)
B$ = "xxxxxxxxx"
IF Y <= VAL(D$) THEN GOTO 20 'Ist das letzte Byte eingeladen,
GOTO 10 'beende
20
SLEEP
Hier jetzt noch eine relativ kleine Datei zum einladen (Bild.isi):
12 'A$
12 'B$
1 'C$
1 'D$
úúúúúúúúúúúúúúúúúúûûúúúúúúúùùúúûûúúúúúúúùùúûûúúúúúúúúùûúúúúúúúúúúûùúúúúúúúúúûþþùúúúúúúúþûþþùùùúúúúúþûþþþúúúúúúúúûþþþúúúúúúúúúþþúúúúúúúúúúúúúúúúú
'ú = grünes Pixel
'û = gelbes Pixel
'ù = rotes Pixel
'þ = türkises Pixel
Ich hoffe, dass damit meine Gedanken vielleicht besser nachvollzogen werden können. _________________ Ein richtiger Programmierer muss so richtig faul sein und sich den ganzen Tag mit der Frage beschäftigen, wie man mal wieder etwas einfacher machen kann. |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 13.11.2005, 18:30 Titel: |
|
|
Nun, früher habe ich selbst auch so seltsame Dateiformatsgeschichten gemacht, um ein bisschen Erfahrungen mit sowas zu sammeln, aber wenn man schon dazu fähig ist oder es vom Compiler angeboten bekommt, ein normales Dateiformat zu benutzen, dann sollte man das doch auch bitte tun... In FB kann man beliebige BMPs mit ein paar Zeilen oder wenn man : benutzt auch mit einer einzigen laden, ohne dass man sich mit dem Dateiformat auseinandersetzen muss. _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
Leader4
Anmeldungsdatum: 20.01.2005 Beiträge: 99 Wohnort: Leipzig
|
Verfasst am: 13.11.2005, 18:33 Titel: |
|
|
Hab das Problem erkannt.
Die Strings nehmen tatsächlich nur maximal 1024 Byte auf. Hab einfach mal ne txt-Datei mit 2000 Buchstaben erstellt und sie einladen lassen: Da fehlte die Hälfte der Buchstaben (genauer: 974 Zeichen). Ich versuch ne neue FB-Version zu kriegen, dann wird das Programm funktionieren.
Danke für eure Beiträge.  _________________ Ein richtiger Programmierer muss so richtig faul sein und sich den ganzen Tag mit der Frage beschäftigen, wie man mal wieder etwas einfacher machen kann. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 13.11.2005, 23:36 Titel: |
|
|
Sebastian hat Folgendes geschrieben: | In FB kann man beliebige BMPs mit ein paar Zeilen oder wenn man : benutzt auch mit einer einzigen laden,
ohne dass man sich mit dem Dateiformat auseinandersetzen muss. |
hey, ich gaube der Spruch von Leader4
Zitat: | Ein richtiger Programmierer muss so richtig faul sein
und sich den ganzen Tag mit der Frage beschäftigen,
wie man mal wieder etwas einfacher machen kann. |
passt eher zu dir Sebastian  _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 14.11.2005, 15:29 Titel: |
|
|
Leader4 hat Folgendes geschrieben: | Hab das Problem erkannt.
Die Strings nehmen tatsächlich nur maximal 1024 Byte auf. Hab einfach mal ne txt-Datei mit 2000 Buchstaben erstellt und sie einladen lassen: Da fehlte die Hälfte der Buchstaben (genauer: 974 Zeichen). Ich versuch ne neue FB-Version zu kriegen, dann wird das Programm funktionieren.
Danke für eure Beiträge.  |
Hast du die neue Version??
Bei mir klappt alles. Habe zuerst eine Datei mit 2048 Zeichen gemacht und dann nacher eingelesen. Alle Zeichen sind da.
Michael _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Leader4
Anmeldungsdatum: 20.01.2005 Beiträge: 99 Wohnort: Leipzig
|
Verfasst am: 14.11.2005, 18:26 Titel: |
|
|
Es ging auch ohne neue Version.
Ich hab einfach 50 Line-Input-Anweisungen in eine Routine eingebracht und er hat dann an der Stelle den String neu eingeladen, wo er sonst immer abgebrochen hat (bei 1024 Byte). Ist der größte Blödsinn und völlig unlogisch, in QB hätte es bei so was 100 Fehlermeldungen angezeigt, aber solange es funktioniert, ist das nicht mein Problem.
Grüßle.
Leader4. _________________ Ein richtiger Programmierer muss so richtig faul sein und sich den ganzen Tag mit der Frage beschäftigen, wie man mal wieder etwas einfacher machen kann. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 15.11.2005, 21:04 Titel: |
|
|
..ist ja hier eigentlich erledigt, aber...
hier ist ein Beitrag aus dem engl. Forum:
http://www.freebasic.net/forum/viewtopic.php?p=13734#13734
da wird ein 100MB String in FB gebastelt und gespeichert! _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 15.11.2005, 23:19 Titel: |
|
|
In der readme datei steht, dass strings ne länge bis 2gb haben können
Wer braucht so einen langen string??
Da reicht bei vielen doch der arbeitsspeicher nicht mehr.
Michael _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 15.11.2005, 23:41 Titel: |
|
|
LINE INPUT hat bei binären Dateien überhaupt nichts zu suchen, sondern da sollte man schon eher auf INPUT$() zurückgreifen. Mache ich in der Regel in QB; ich nehme mal an, dass diese Funktion auch in FreeBASIC mit derselben Semantik portiert wurde. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
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.
|
|