Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
1igel
Anmeldungsdatum: 15.03.2006 Beiträge: 21
|
Verfasst am: 25.04.2006, 11:15 Titel: Fehler beim Drucken in eine *.TXT-File |
|
|
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 |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 25.04.2006, 18:14 Titel: |
|
|
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 |
|
 |
1igel
Anmeldungsdatum: 15.03.2006 Beiträge: 21
|
Verfasst am: 25.04.2006, 19:32 Titel: |
|
|
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 |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 25.04.2006, 20:03 Titel: |
|
|
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 |
|
 |
1igel
Anmeldungsdatum: 15.03.2006 Beiträge: 21
|
Verfasst am: 26.04.2006, 08:59 Titel: |
|
|
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 |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 26.04.2006, 17:34 Titel: |
|
|
Ich würde mal gant startk auf einen Bug in freeBASIC plädieren...
jb _________________ Elektronik und Programmieren |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 26.04.2006, 18:34 Titel: |
|
|
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 |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 26.04.2006, 18:49 Titel: |
|
|
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 26.04.2006, 21:27 Titel: |
|
|
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 |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 27.04.2006, 06:36 Titel: |
|
|
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 |
|
 |
1igel
Anmeldungsdatum: 15.03.2006 Beiträge: 21
|
Verfasst am: 27.04.2006, 08:19 Titel: |
|
|
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 |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 27.04.2006, 17:58 Titel: |
|
|
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 27.04.2006, 18:27 Titel: |
|
|
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.
Gruß Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
1igel
Anmeldungsdatum: 15.03.2006 Beiträge: 21
|
Verfasst am: 28.04.2006, 15:15 Titel: |
|
|
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" ?
Gruß 1igel |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 28.04.2006, 17:22 Titel: |
|
|
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 |
|
 |
1igel
Anmeldungsdatum: 15.03.2006 Beiträge: 21
|
Verfasst am: 28.04.2006, 17:32 Titel: |
|
|
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 |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 28.04.2006, 18:02 Titel: |
|
|
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 |
|
 |
1igel
Anmeldungsdatum: 15.03.2006 Beiträge: 21
|
Verfasst am: 28.04.2006, 18:16 Titel: |
|
|
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 |
|
 |
|