|
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 |
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 24.12.2013, 00:55 Titel: FBIDE: Unterschied "Quick-Run" und "Compile+R |
|
|
Kann mir jemand erklären, warum sich mein Programm leicht unterschiedlich verhält, je nachdem ob ich es in FBIDE mit "Quick Run" laufen lasse, oder mit "Compile+Run"?
Für diejenigen, die eine andere IDE verwenden: Auch bei "Quick Run" wird das Programm compiliert, aber als temporäre exe-Datei (mit Namen fbidetemp.exe) gespeichert. Es *dürfte* also keinen Unterschied geben...
Die temporäre Datei und die "eigentliche" exe haben die selbe Größe, und unterscheiden sich in exakt 2 x 2 Bytes.
Grüße
Rainer
Zuletzt bearbeitet von TimesChange am 24.12.2013, 02:15, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 24.12.2013, 01:27 Titel: |
|
|
"Quickrun" erzeugt eine temporäre exe, nicht "Run". "Run" startet eine bereits existierende exe mit dem Namen der bas.
Da sich FBIDE die Parameter für alle fbc-Aufrufe teilt, sollte es eigentlich keine Unterschiede geben (bis auf den Namen der exe). Wie äußert sich denn dieses "unterschiedliche Verhalten"? Was hast du unter Settings>FreeBASIC beim fbc-Aufruf eingestellt?
Achte auch darauf, dass eine alte Compile+Run-Datei nicht zufällig noch irgendwo läuft. Es könnte nämlich sein, dass dein Compile+Run und Run scheitern, weil irgendwer die exe noch nutzt und deswegen die Datei gesperrt ist, während Quickrun ja auch immer ohne Speichern eine temporäre exe für den aktuellen Code erstellt. |
|
Nach oben |
|
|
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 24.12.2013, 02:48 Titel: |
|
|
Sorry (und Danke für's Anpassen des Titels), da habe ich die Begriffe "Run" und "Quick-Run" durcheinander gebracht. Gemeint habe ich in der Tat QuickRun.
Vorab: Ich habe zwar die fragliche FBIDETEMP.EXE gesichert, aber nicht den entsprechenden Zwischenstand der .bas und der mit Compile+Run erzeugten exe-Datei. Und jetzt kann ich das abweichende verhalten nicht mehr reproduzieren. Wer sich also denkt, das Problem sitzt wie üblich vor dem Rechner, und der bildet sich das nur ein, der muss nicht weiterlesen...
Bei diesem Portierungsprojekt hab eich mich schon manchmal so dämlich angestellt, dass mich selber nichts mehr wundern würde. Aber in diesem Fall habe ich es mehrfach überprüft, weil ich es nicht glauben konnte.
Hintergrund: Das Programm ist ursprünglich für QB geschrieben.
Geäußert hat es sich folgendermaßen:
Ich habe Felder eines UDT, in die ich Suchbegriffe eingeben will.
Für die Eingabemaske will ich zunächst den Eingabebereich "markieren", in dem ich mit PRINT eine entsprechende Anzahl von Leerzeichen für das jeweilige Element ausgebe. Die Einzelnen Elemente sind als Strings fester Länge definiert.
Unter Quickbasic habe ich dazu einfach den Adressensatz mit dem Index 0 ausgegeben. Beim Programmstart wurden alle Elemente von Index 0 auf 1 Leerzeichen gesetzt (z.B. von Adr(0).NN=" ").
Adr(0).NN enthält also im ersten Bit den Wert 32, gefolgt von lauter Nullen.
Das "Markieren" sieht so aus: Code: |
TYPE AdrType
VN AS STRING * 20
NN AS STRING * 35
...
END TYPE
...
' "Markieren:"
PRINT Adr(0).VN: LOCATE 14, 23
PRINT Adr(0).NN: LOCATE 16, 23
...
|
Bei Aufruf mit QuickRun werden wie gewünscht und wie unter QB Leerzeichen-Strings in Länge der FixedString ausgegeben, also bei Adr(0).NN 35 Leerzeichen.
Bei Compile+Run bzw. Aufruf der compilierte Exe, wurde 1 Leerzeichen ausgegeben, gefolgt von 31 "nicht druckbaren" Zeichen, angezeigt als Rechteck.
Ich habe die Datei mehrfach neu compiliert und überprüft, das Ergebnis war immer dasselbe.
Das "Problem" der unerwünschten Ausgabe habe ich durch entsprechende SPACE(x) Befehle gelöst, aber ich verstehe nicht woher der Unterschied kommt.
Dass die "alte" exe noch lief, glaube ich ausschließen zu können.
Unter SETTINGS ist als Compile command der Standard "<$fbc>" "<$file>" eingetragen.
Grüße
Rainer
Ach ja: Frohe Weihnachten ! |
|
Nach oben |
|
|
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 28.12.2013, 13:38 Titel: |
|
|
Und wieder das gleiche:
Heute FBIDE geöffnet und .bas-Datei geladen.
Beim Ausführen mit "RUN" sieht meine Eingabemaske so aus:
Die mit "Compiler" erzeugte .exe-Datei aufgerufen, ergibt folgende Maske:
Und was ich jetzt gar nicht mehr kapiere: Nächster Start von FBIDETEMP.EXE mit "RUN" zeigt auf einmal dasselbe Bild wie Bild2 oben, also mit den "Kästchen"...
Woran kann das liegen?
Grüße
Rainer
EDIT:
Jetzt bin ich ein bisschen schlauer.
Wie ihr an den Bildern oben seht, habe ich unterschiedliche Schriftarten verwendet. Bei FBIDETEMP "Rasterschriftart" als Standard für das Konsolenfenster, bei "meiner" exe "Lucida Console".
Wenn ich jetzt bei der exe von "Lucida Console" auf Rasterschriftart wechsle, wird die Maske wieder ohne Kästchen angezeigt.
Wechsel zurück auf "Lucida Console" -> Maske immer noch ok, ohne Kästchen...
Es liegt also offenbar nicht daran, dass unterschiedlich compiliert wird, sondern nur an der unterschiedlichen Darstellung je nach Schrifttyp.
Warum ein Zwischenwechsel zu Rasterschriftart dazu führt, dass sich die Anzeige mit Lucida Console ändert (vorher Kästchen, nachher keine Kätschen) ist mir schleierhaft, ist aber jedenfalls kein FBIDE-Problem. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 28.12.2013, 16:38 Titel: |
|
|
TimesChange hat Folgendes geschrieben: | Es liegt also offenbar nicht daran, dass unterschiedlich compiliert wird, sondern nur an der unterschiedlichen Darstellung je nach Schrifttyp.
Warum ein Zwischenwechsel zu Rasterschriftart dazu führt, dass sich die Anzeige mit Lucida Console ändert (vorher Kästchen, nachher keine Kätschen) ist mir schleierhaft, ist aber jedenfalls kein FBIDE-Problem. |
Das hat weder mit IDE noch mit dem Compiler zu tun. Die Schriftart im zweiten Screenshot kommt nicht mit den Zeichen klar, die du für die Maske verwendest. Daher diese falschen Sonderzeichen.
Du kannst die Schriftart für alle Konsolenfenster (Windows-weit) oder nur bestimmte Konsolenfenster anpassen. Das wäre hier der erste Lösungsweg.
Die zweite Möglichkeit wäre, die Maske nicht mit speziellen Zeichen darzustellen, sondern einfach mit Leerzeichen, die eine andere Hintergrundfarbe haben. Dann ist man nicht darauf angewiesen, dass die Konsolenschriftart ein bestimmtes "Kästchen-Zeichen" unterstützt. Der Nachteil der Methode ist, dass man immer wieder mit den Farben wechseln muss.
Hier ein kleines Beispiel:
Code: | color 0, 7
cls
Print "Hallo Welt"
Print
Print "Geben Sie Ihren Namen ein: ";
Color 14, 1
Print " "
Dim As String Benutzername
Locate 3, 28: Input "", Benutzername
Color 0, 7
Print
Print "Ihr Name ist: "; Benutzername
Sleep
End |
So sieht das dann aus:
Die Maske ist natürlich sehr minimalistisch und prüft z. B. nicht die maximale Eingabelänge. D. h. man kann einfach über das blaue Kästchen hinausschreiben.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 28.12.2013, 19:32 Titel: |
|
|
Das mache ich eigentlich auch so.
Seltsam ist das unterschiedliche Verhalten, auch mit ein und derselben Schriftart:
Links nach Aufruf des Programms, rechts dasselbe Fenster, nur nach Ändern der Schrift auf Raster und zurück zu "Lucida Console".
Zur Klarstellung: Ich will keine "Kästchen" oder sonstige Sonderzeichen ausgeben, es soll lediglich der Eingabebereich mit Leerzeichen gefüllt werden, wie auch in deinem Beispiel.
Das war in QB mit String fester Länge kein Problem, da diese bei Initialisierung mit Leerzeichen gefüllt wurde, bei FB eben nun mit Nullen, was gelegentlich zu der seltsamen Ausgabe führt.
Na gut, dann muss ich eben die Strings zuvor "von Hand" mit 32 füllen...
Wichtig ist, dass nicht der Compiler "komische Sachen" macht, sondern offenbar die Konsole.
Grüße
Rainer |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 28.12.2013, 20:31 Titel: |
|
|
Ah, OK, verstehe.
TimesChange hat Folgendes geschrieben: | Das war in QB mit String fester Länge kein Problem, da diese bei Initialisierung mit Leerzeichen gefüllt wurde, bei FB eben nun mit Nullen, was gelegentlich zu der seltsamen Ausgabe führt.
Na gut, dann muss ich eben die Strings zuvor "von Hand" mit 32 füllen... |
Vielleicht noch als Nachtrag zu meinem Kurzbeispiel von heute Nachmittag: Statt die Leerzeichen so "grobmechanisch" als Stringliteral in den Quelltext zu schreiben wie in dem Beispiel, könnte man auch in FB u. a. die STRING-Funktion benutzen:
Code: | print chr(34); string(16, "x"); chr(34)
print chr(34); string(16, " "); chr(34) ' 16 Leerzeichen
sleep |
_________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
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.
|
|