ANSI nach ASCII Konverter tuts nicht

OP #2698743
Lesenswert?

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');
}
#2698774
Lesenswert?

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
OP #2698794
Lesenswert?

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
#2698852
Lesenswert?

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
OP #2699033
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren