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:

Fehler beim Drucken in eine *.TXT-File

 
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
1igel



Anmeldungsdatum: 15.03.2006
Beiträge: 21

BeitragVerfasst am: 25.04.2006, 11:15    Titel: Fehler beim Drucken in eine *.TXT-File Antworten mit Zitat

Hi,
am Ende eines Programms mit Berechnungen und Grafik soll eine Text- und Wertetabelle in einer *.TXT-File abgelegt werden.
Das klappt prima bis auf einen Haken. Das Wort "Gleichmäßigkeitszahl" wird verstümmelt zu "Gleichm„áigkeitszahl". Für ä wird ASC 132 und für ß ASC 225 gesendet.
Wird jeweils einer der beiden Buchstaben weggelassen, so kommt der andere richtig. Wird anstelle ä (klein) Ä (groß) gesendet, so ist alles korrekt!
Und nun das Verrückteste: Wenn ich den Code-Schnipsel, der die Übertragung macht, ausschneide und als eigenes Programm laufenlasse, wird das Wort nicht zerschossen. Dann steht für ä ASC 228 und für ß ASC 223. Übrigens: Das Wort "Größe" wird ebenso fehlerfrei dargestellt wie andere Sonderzeichen (z.B. "µm"). Vertausche ich die Buchstaben ä und ß zu "Gleichmßäigkeitszahl", so wird das auch aus dem eigentlichen Programm heraus "richtig" übertragen.
Hat jemand schon mal eine ähnliche Beobachtung gemacht?
Gruß 1igel
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 25.04.2006, 18:14    Titel: Antworten mit Zitat

Das mit den Sonderzeichen wie ü ö ä Ü Ö Ä etc. ist eine Tatsache.
Freebasic verwendet einen etwas unüblichen Zeichensatz.
Mach doch einfach statt ü ein ue und soweiter oder mach ein +CHR$(Irgendwas)+

Siehe auch
http://forum.qbasic.at/viewtopic.php?t=2394
(es gibt auch noch ältere Threads darüber -> Suchfunktion)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
1igel



Anmeldungsdatum: 15.03.2006
Beiträge: 21

BeitragVerfasst am: 25.04.2006, 19:32    Titel: Antworten mit Zitat

Hi Michael,
dass FB mit Sonderlauten anders umgeht, ist mir klar und nicht das Problem. Ein Programmschnipsel macht alles richtig und der selbe Schnipsel als Bestandteil eines umfangreicheren Codes macht einen reproduzierbaren Fehler, der aber abhängig ist von der Reihenfolge der Buchstaben. Seltsam, oder?
Gruß 1igel
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

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

Es könnte ein Bug von Freebasic sein.
Versuch den Fehler auf möglichst wenig Zeilen einzudampfen.
Am besten wäre es, wenn der Fehler Reproduzierbar ist und auf möglichst wenig Zeilen Platz findet.
(Dann kann man einen Bug Report an die Freebasic Entwickler machen)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
1igel



Anmeldungsdatum: 15.03.2006
Beiträge: 21

BeitragVerfasst am: 26.04.2006, 08:59    Titel: Antworten mit Zitat

Hier kommt der Extrakt, der für den vermeintlichen Fehler zuständig ist:
Code:
#include windows.bi
declare function StrGfxDe(byval strASCII as string) as string
screen 20,,,1
color 0,15
screeninfo w%,h%,D%
line (0,0)-(w%,H%),15,bf
close
locate 9,10 : Print "Gleichmäßigkeitszahl"
open "F:\FB\text.txt" for output as #1
print #1,"    Gleichmäßigkeitszahl"
locate 10,10 :print strgfxde("Gleichmäßigkeitszahl")
print #1,"   nach strgfxde   ";
print #1,"Gleichmäßigkeitszahl"
print #1,"    um ein Leerzeichen verlängert:   ";
print #1,"Gleichmäßigkeitszahl "
print #1,"    und wieder ohne Leerzeichen:   ";
print #1,"Gleichmäßigkeitszahl"
close
shell "NOTEPAD.exe f:\fb\text.txt"
close
sleep
end
function StrGfxDe(byval strASCII as string) as string   
  dim as integer i,l=len(strASCII)-1
  if l<0 then return ""
  for i=0 to l
    select case strASCII[i]
      case 196:strASCII[i]=142 ' Ä
      case 214:strASCII[i]=153 ' Ö
      case 220:strASCII[i]=154 ' Ü
      case 223:strASCII[i]=225 ' ß
      case 228:strASCII[i]=132 ' ä
      case 246:strASCII[i]=148 ' ö
      case 252:strASCII[i]=129 ' ü
      case 181:strASCII[i]=230 ' µ
    end select
  next
  return strASCII
end function


Die Funktion wandelt die Sonderzeichen so um, dass sie am Bildschirm richtig erscheinen. Für das Speichern in einer Textfile muss aber der nicht-gewandelte ASCII-Code genommen werden.
Warum geht das mit dem Wort Gleichmäßigkeitszahl nicht?
Warum geht es, wenn ein Leerzeichen angehängt wird?
Warum geht es wieder nicht, wenn das Leerzeichen fehlt?
Gruß 1igel
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 26.04.2006, 17:34    Titel: Antworten mit Zitat

Ich würde mal gant startk auf einen Bug in freeBASIC plädieren...

jb
_________________
Elektronik und Programmieren
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 26.04.2006, 18:34    Titel: Antworten mit Zitat

Hi,
ich habe mir mal die asm-Datei davon angesehen und glaube den "Fehler" gefunden zu haben.
Code:
   #global initialized constants

.section .data
.balign 16
.balign 4
Lt_0000:   .ascii   "\0"
.balign 4
Lt_001B:   .ascii   "Gleichm\344\337igkeitszahl\0"
.balign 4
Lt_001C:   .ascii   "text.txt\0"
.balign 4
Lt_001D:   .ascii   "   nach strgfxde   \0"
.balign 4
Lt_001E:   .ascii   "um ein Leerzeichen verl\344ngert:   \0"
.balign 4
Lt_001F:   .ascii   "Gleichm\344\337igkeitszahl \0"
.balign 4
Lt_0020:   .ascii   "und wieder ohne Leerzeichen:   \0"
.balign 4
Lt_0021:   .ascii   "NOTEPAD.exe text.txt\0"
.balign 4
Lt_003D:   .float   0
FB legt den Text aus dem Quelltext als Daten ab. Wenn ein Begriff mehrfach vorkommt wird er nur einmal abgelegt (siehe oben).
Mit einem Leerzeichen mehr sind die Daten nicht gleich, also erneut anlegen.
Die Function StrGfxDe greift auf die ersten Daten zu kopiert sie nicht, sondern ändert sie im Datenbereich und so wird das geänderte Wort mehrfach verwendet.
Jetzt kann man sich darüber streiten ob das ein Bug ist?
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 26.04.2006, 18:49    Titel: Antworten mit Zitat

Ich bin für Bug.
Dank Voltas Beitrag, konnte ich es vereinfachen:
Code:
declare function test(byval in as string) as string

? "Hello World!"
? test("Hello World!")
? "Hello World!"
sleep

function test(byval in as string) as string
  dim as integer i,l
 
  l=len(in)-1
  if l<0 then return ""
  for i=0 to l
    in[i]=in[i]-1
  next
  return in
end function


Edit:/
Offizieller Bug Report
Normellerweisse ist das bald erledigt und im nächsten Release geht's dann.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 26.04.2006, 21:27    Titel: Antworten mit Zitat

Mmmm,
eigentlich muss man selber auf Fehler achten wenn man mit Pointern direkt Daten manipuliert, aber in diesem Fall...
Abhilfe schafft das umkopieren in der Funktion
Code:
Function StrGfxDe(ByVal strASCII as string) as string   
  dim as integer i,l=len(strASCII)
  Dim f As String
  f=strASCII
  if l=0 then return ""
  for i=0 to l-1
    select case f[i]
      case 196:f[i]=142 ' Ä
      case 214:f[i]=153 ' Ö
      case 220:f[i]=154 ' Ü
      case 223:f[i]=225 ' ß
      case 228:f[i]=132 ' ä
      case 246:f[i]=148 ' ö
      case 252:f[i]=129 ' ü
      case 181:f[i]=230 ' µ
    end select
  next
  Return f
end Function
egal ob das als Bug durchgeht oder nicht.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 27.04.2006, 06:36    Titel: Antworten mit Zitat

Da man die Daten BYVAL übergibt, ist der Fall eigentlich klar.

Übrigens:
sf.net hat Folgendes geschrieben:
Date: 2006-04-26 22:43
Sender: v1ctorProject Admin
Logged In: YES
user_id=1144638

That's know that byval as string parameters aren't passed as a copy, that's in the TODO list, they were added to support C function prototypes to convert string to CHAR * when the ZSTRING wasn't been added.

Es ist also bereits bekannt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
1igel



Anmeldungsdatum: 15.03.2006
Beiträge: 21

BeitragVerfasst am: 27.04.2006, 08:19    Titel: Antworten mit Zitat

Hi,
na schön und danke für die Erweiterung der Funktion, mit der das Problem nicht auftritt. Aber dennoch: müsste das Problem denn nicht mit allen deutschen Sonderzeichen auftreten und nicht nur mit der Kombination "äß" und dann auch nur in dieser Reihenfolge?
Also doch ein bug?
Gruß 1igel
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 27.04.2006, 17:58    Titel: Antworten mit Zitat

Es ist ein Bug, das steht auch im SF.net Zitat von v1ctor.
Nur hat der Fehler keine Priorität ("that's in the TODO list").
Wie volta gesagt hat, hat der Bug nichts Direkt mit den deutschen Sonderzeichen zu tun, es liegt am Arbeiten mit den Eckigen Klammern. (Damit Adressierst du ja die Bytes des Strings)

Wie mein kurzes Beispiel zeigt, liegt's wirklich an den Eckigen Klammern.

Kurz:
Ja es ist ein Bug.
Er ist den Entwicklern bekannt.
Er steht auf der Todo List.
Irgendwann gibt es einen Bugfix, der es behebt.
(Aber nicht alzu schnell)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 27.04.2006, 18:27    Titel: Antworten mit Zitat

Hi 1igel,
schmeiß die ganze Funktion StrGfxDe raus.
Da du schon die windows.bi eingebunden hast kannst du auch eine Windowsfunktion benutzen die diese Schwierigkeiten nicht macht.
Code:
#include windows.bi

'Umlaute richtig PRINTen
Sub UPrint( Umlaute As String )
 CharToOem StrPtr(Umlaute), StrPtr(Umlaute):Print Umlaute
End Sub

Screen 16
color 0,15
screeninfo w%,h%,D%
line (0,0)-(w%,H%),15,bf
close
locate 9,10 : Print "Gleichmäßigkeitszahl"
open "text.txt" for output as #1
print #1,"Gleichmäßigkeitszahl"
locate 10,10 :uPrint "Gleichmäßigkeitszahl"
print #1,"   nach strgfxde   ";
print #1,"Gleichmäßigkeitszahl"
print #1,"um ein Leerzeichen verlängert:   ";
print #1,"Gleichmäßigkeitszahl "
print #1,"und wieder ohne Leerzeichen:   ";
print #1,"Gleichmäßigkeitszahl"
close
shell "NOTEPAD.exe text.txt"
close
sleep
End
Ich vermute, dass du durch den direkten Speicherzugriff auch die Fehler in der Sonderzeichenbearbeitung produzierst.
Du tauschst mit deiner Funktion im Datenbereich ein Byte aus, da kann schon Datenmüll entstehen. verwundert
Gruß Volta
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
1igel



Anmeldungsdatum: 15.03.2006
Beiträge: 21

BeitragVerfasst am: 28.04.2006, 15:15    Titel: Antworten mit Zitat

Hi Volta,
Uprint klingt gut - aber: wie kann man erreichen, dass nach uPrint die Schreibposition nach dem letzten Zeichen positioniert wird (wie mit dem Semikolon nach Print: PRINT "TEXT"zwinkern?
Gruß 1igel
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 28.04.2006, 17:22    Titel: Antworten mit Zitat

Code:
'Umlaute richtig PRINTen
Sub UPrint( Umlaute As String )
 CharToOem StrPtr(Umlaute), StrPtr(Umlaute):Print Umlaute;
End Sub

Oder Irre ich mich?
Also einfach
Print Umlaute;
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
1igel



Anmeldungsdatum: 15.03.2006
Beiträge: 21

BeitragVerfasst am: 28.04.2006, 17:32    Titel: Antworten mit Zitat

Hi
'Print Umlaute; ' würde, solange es in der SUB steht, i m m e r die Position nach dem letzten Zeichen festlegen. so als ob immer print text; gesetzt wäre.
Das soll aber natürlich nicht der Fall sein. Ich weiss, dass ich hilfsweise einfach nach der Rückkehr aus der Sub einen leeren print-Befehl ausgeben könnte, um wieder an den nächsten Zeilenanfang zu kommen. Wäre aber etwas umständlcih und entgegengesetzt zum normalen print-Verhalten.
1igel
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 28.04.2006, 18:02    Titel: Antworten mit Zitat

mit den Augen rollen
Dann mach doch 2 Subs oder ein weiteres Parameter.

Bei einem weiteren Parameter gibt es dann mehre Lösungen:

Code:
Sub UPrint( Umlaute As String, q as byte)
 CharToOem StrPtr(Umlaute), StrPtr(Umlaute)
 If q then
  Print Umlaute;
 Else
  Print Umlaute
 End if
End Sub


Code:
Sub UPrint( Umlaute As String, q as byte)
 CharToOem StrPtr(Umlaute), StrPtr(Umlaute)
 Print Umlaute;
 If q=0 then PRINT
End Sub


Code:
Sub UPrint(byval Umlaute As String, q as byte)
 CharToOem StrPtr(Umlaute), StrPtr(Umlaute)
 If q then Umlaute+=CHR(10,13)
 Print Umlaute;
End Sub
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
1igel



Anmeldungsdatum: 15.03.2006
Beiträge: 21

BeitragVerfasst am: 28.04.2006, 18:16    Titel: Antworten mit Zitat

Danke auch Michael
Ich hab's jetzt für mich so gelöst
Code:
#include windows.bi
dim  as string dtext    'Zeichen werden umgewandelt  zur Darstellung am Bildschirm
dim as string ftext     'Zeichen werden nicht umgewandelt zum Ausdrucken in eine *.TXT-File

Sub UPrint( dtext As String, ftext as string )
    ftext = dtext
 CharToOem StrPtr(dtext), StrPtr(dtext)
End Sub
dtext = "Gleichmäßigkeitszahl"
uprint  (dtext,ftext)

Print dtext,ftext,
print "  nach uPrint"
open "text.txt" for output as #1
print #1,dtext,ftext
close
shell "NOTEPAD.exe f:\fb\text.txt"
sleep
end

So kann es sowohl am Bildschirm als auch in einer TXT-File richtig dargestellt werden. Wenn nämlich der Text über input eingegeben wird, ist er nach dem ersten Durchgang durch die sub für die TXT-File 'falsch'.
Der Print-Befehl außerhalb der sub bietet wieder das gewohnte Print-Verhalten.
1igel
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