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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.