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');
}
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
1 | void TpANSI2ASCII(char *s ) |
2 | {
|
3 | for(;; s++) |
4 | switch( (unsigned char)*s ){ |
5 | case 196: *s = 142; break; |
6 | case 214: *s = 153; break; |
7 | case 220: *s = 154; break; |
8 | case 228: *s = 132; break; |
9 | case 246: *s = 148; break; |
10 | case 252: *s = 129; break; |
11 | case 223: *s = 225; break; |
12 | case 0: return; |
13 | }
|
14 | }
|
Peter
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 | void TpANSI2ASCII(char *ANSI) { |
2 | while (*ANSI != '\0') { |
3 | switch (*ANSI) { |
4 | case 196: *ANSI = 142; break; |
5 | case 214: *ANSI = 153; break; |
6 | case 220: *ANSI = 154; break; |
7 | case 228: *ANSI = 132; break; |
8 | case 246: *ANSI = 148; break; |
9 | case 252: *ANSI = 129; break; |
10 | case 223: *ANSI = 225; break; |
11 | }
|
12 | ANSI++; |
13 | }
|
14 | }
|
Danke an alle, jetzt gehts. Boris
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.