Forum: Compiler & IDEs ANSI nach ASCII Konverter tuts nicht


von Boris H. (abschaedler)


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');
}

von pow (Gast)


Lesenswert?

> *ANSI++;
meintest du nicht eher ANSI++; ?

von Peter D. (peda)


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

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Boris H. (abschaedler)


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

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg Wunsch schrieb:
> ("ANSI" umfasst per definitionem die Zeichen von 0 bis 127, [...]

Du meinst "ASCII" ;-)

von Christian G. (christian_g83)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Christian Gudrian schrieb:
> Für die Akten: Du meintest bestimmt "ASCII". :)

Jaja, na klar.

von Peter D. (peda)


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

von Marwin (Gast)


Lesenswert?

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.

von Boris H. (abschaedler)


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

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
Noch kein Account? Hier anmelden.