char-Werte "umdefinieren"



  • Gibt es eine Möglichkeit, dass ich die Zahlenwerte für char umdefiniere?

    Wenn ich zum Beispiel ein Tile-basiertes Videospiel habe, in dem die Tiles für die Buchstaben, Zahlen und Satzzeichen nicht an der Position sind, wo sie im ASCII-Code vorkommen, ist es dann möglich, dass ich deklariere, dass z.B. 'A' jetzt den Wert 10 statt 65 hat und dass '1' identisch mit dem Zahlenwert 1 ist und dass der Punkt '.' den Wert 36 hat (weil er im Tilesheet das erste Satzeichen nach Zahlen und Buchstaben ist)?

    Ich würde das gerne machen, damit ich einen Text trotzdem noch so hier deklarieren kann:

    const char Text[] = "HALLO, WIE GEHT'S?";
    

    und er mir dann die selbst definierten Werte daraus kompiliert statt die ASCII-Werte.

    Ansonsten müsste ich jeden Buchstaben und Satzzeichen als enum deklarieren und dann sowas hier machen:

    const unsigned char Text[] =
    {
        H, A, L, L, O, Comma, _, W, I, E, _, G, E, H, T, Apostrophe, S, QuestionMark, TextEnd
    }
    

  • Mod

    Du möchtest etwas in der Art

    const char Text[] = TRANSLATE("HALLO, WIE GEHT'S?");
    

    mit einem magischen Makro.
    In C geht das in dieser Form nicht. Das Problem hierbei ist, dass das Ergebnis ein konstanter Ausdruck (bzw. eine Liste konstanter Ausdrücke) sein muss. Gleichzeitig müsste das Makro die einzelnen Zeichen untersuchen, was die Verwendung des [] oder * Operators erfordert. Diese Operatoren dürfen aber in konstanten Ausdrücken nicht auftreten.
    Wenn dem Makro die Zeichen einzeln übergeben werden, kann man etwas basteln, dass ist dann aber nicht erheblich besser lesbar als dein Workaround.
    Eine saubere Lösung verwendet externe Tools (wie z.B. sed, wenn man nichts besseres hat) um einen entsprechenden Header als Teil der Buildprozesses zu erzeugen.

    In C++ ist die Angelegenheit recht trivial zu bewältigen, hier würde man i.d.R. Literaloperatoren einsetzen.



  • Max Muster-Man schrieb:

    und dass '1' identisch mit dem Zahlenwert 1

    Wenn dann das Zeichen '0' den Wert 0 hat, kannst du sämtliche Standardstringfunktionen nicht mehr benutzen.
    Das ist es einfacher, eine totile bzw. strtotile Funktion zu schreiben, die das macht. Das ist ja auch nur eine Tabelle.

    Es gibt aber auch Compiler, die für das Zielsystem die Kodierung ändern können.



  • camper schrieb:

    Du möchtest etwas in der Art

    const char Text[] = TRANSLATE("HALLO, WIE GEHT'S?");
    

    mit einem magischen Makro.
    In C geht das in dieser Form nicht. Das Problem hierbei ist, dass das Ergebnis ein konstanter Ausdruck (bzw. eine Liste konstanter Ausdrücke) sein muss. Gleichzeitig müsste das Makro die einzelnen Zeichen untersuchen, was die Verwendung des [] oder * Operators erfordert. Diese Operatoren dürfen aber in konstanten Ausdrücken nicht auftreten.

    Ja, dass es mit einem Makro wohl nicht geht, war mir schon mehr oder weniger klar.
    Ich dachte mehr an etwas, das dem Compiler direkt sagt, dass 'A' jetzt immer den Wert 10 hat. Also sprich: Man definiert eine eigene Zeichentabelle, so dass der Compiler nicht ASCII benutzt, sondern das eigens Definierte.

    Auf keinen Fall meine ich übrigens eine Funktion, die den String zur Laufzeit umwandelt. Wenn ich am Ende zu der Erkenntnis komme, dass ich das machen muss, wäre das ja simpel umzusetzen.

    DirkB schrieb:

    Wenn dann das Zeichen '0' den Wert 0 hat, kannst du sämtliche Standardstringfunktionen nicht mehr benutzen.

    Ja, das stimmt wohl, denn selbst wenn man '\0' ebenfalls umdefinieren könnte, so dass '\0' z.B. 0xFF entspricht, werden Codestellen, wo einfach nur if (string[i]) steht, nicht mehr gehen.



  • Ich dachte mehr an etwas, das dem Compiler direkt sagt, dass 'A' jetzt immer den Wert 10 hat.

    Nein das geht so nicht und mit zunehmender Erfahrung wird dir immer mehr klar werden wie sinnfrei deine "Anforderung" ist

    mach einfach eine Mapping-Funktion und dein Problem ist gelöst

    stell dir einfach vor ich würde jetzt den Zahlenwert gerne als Farbe oder Icon haben wollen, dann wäre das einfache Value-Mapping direkt völlig nutzlos in der Sprache/Kompiler, hätte aber trotzdem die komplexität von beiden unnötig gesteigert


Log in to reply