Hallo zusammen!
Habe mir um ein Display anzusteuern, das mit ASCII Sonderzeichen
arbeitet, folgende Prozedur geschrieben. Soweit läuft auch alles richtig
durch. Mit dem Debugger sehe ich, dass in die richtigen IF-Anweisungen
gesprungen wird, aber es wird nichts zugewiesen. Wenn Beispielsweise
eine 196 reinkommt, spring ich in den entsprechenden Zweig, wo sie dann
durch die 142 ersetzt werden soll. Tuts aber nicht.
Hat jemand eine Idee?
Viele Dank im Voraus,
Boris
void TpANSI2ASCII(char *ANSI) {
do {
if (*ANSI == 196)
*ANSI = 142; //Ä
if (*ANSI == 214)
*ANSI = 153; //Ö
if (*ANSI == 220)
*ANSI = 154; //Ü
if (*ANSI == 228)
*ANSI = 132; //ä
if (*ANSI == 246)
*ANSI = 148; //ö
if (*ANSI == 252)
*ANSI = 129; //ü
if (*ANSI == 223)
*ANSI = 225; //ß
*ANSI++;
} while (*ANSI != '\0');
}
Gast
#2698755
> *ANSI++;
meintest du nicht eher ANSI++; ?
Ich würde das als Switch schreiben, dann ist es besser lesbar und wird auch vom Compiler besser optimiert (weniger Code). Und ich würde es erst bei der Ausgabe des Bytes machen, dann erspart man sich das ganze Pointergewusel. Registerzugriffe sind schneller und weniger Code als Pointerzugriffe. Warum erst umständlich ins Array zurückschreiben, wenn man es eh gleich wieder rausholen und ans Display senden muß. Peter
Boris Henn schrieb: > void TpANSI2ASCII(char *ANSI) { void TpANSI2ASCII(unsigned char *ANSI) { wäre besser, denn meist geht der Wertebereich von signed chars nur von -128 bis +127. Deine ANSI-Werte sind aber höher. Deshalb kann das nicht funktionieren. P.S. Lass den Stern bei *ANSI++; weg.
Boris Henn schrieb: > das mit ASCII Sonderzeichen > arbeitet Also eine leere Menge. ;-) ("ANSI" umfasst per definitionem die Zeichen von 0 bis 127, alles andere ist was anderes.) Wenn du den Platz hast, wäre übrigens eine Umcodierungstabelle die schnellste (und durchaus übersichtliche) Lösung.
Hallo, erstmal Danke für die Antworten. @pow: Du hast Recht, obwohl das natürlich in beiden Fällen funktioniert, da die Plüsse dahinter ja die Adresse hochsetzen. @Peter: Ja, mit Switch hatte ich es vorher. Ich habs nur aus Verzweiflung so umgeschrieben. Den eigentlichen Grund hab ich noch immer nicht gefunden. Ich kann die Zeichen nicht ändern wo sie byteweise rauspurzeln, da dort auch schonmal Grafikbefehle durchkommen. Daher muss ich Strings vorher abfangen, bevor sie "zerhackt" werden. Gruß, Boris
Jörg Wunsch schrieb: > ("ANSI" umfasst per definitionem die Zeichen von 0 bis 127, [...] Du meinst "ASCII" ;-)
Jörg Wunsch schrieb: > ("ANSI" umfasst per definitionem die Zeichen von 0 bis 127, alles > andere ist was anderes.) Für die Akten: Du meintest bestimmt "ASCII". :) Christian
Christian Gudrian schrieb: > Für die Akten: Du meintest bestimmt "ASCII". :) Jaja, na klar.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
Peter
Gast
#2698873
Peter Dannegger schrieb: > Ich würde das als Switch schreiben, dann ist es besser lesbar und wird > auch vom Compiler besser optimiert (weniger Code). Wie ueblich bei Optimierungen kann man sowas nicht pauschal sagen. Auf Solaris bin ich schon selbst ueber einen Fall gestolpert, wo genau das Gegenteil zutraf.
Peter! Sauber. Fast so hat ichs auch. Aber deins sieht noch schlanker aus.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
Danke an alle, jetzt gehts. Boris
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.