Hilfe! Addition von unsigned char in C



  • Hallo!

    Ich verzweifel hier grad langsam aber sicher und hoffe, ihr könnt mir helfen.
    Ich schreibe gerade ein Programm zum Addieren von zwei Dezimalzahlen (oder zumindest versuch ich es), die für die Addition aber in einem Pointer als unsigned char gespeichert sind. Nun würde ich gerne zwei Stellen dieses Pointers addieren und den Wert an der entsprechenden Stelle eines dritten Pointers speichern:

    addiert->ziffern[addiert->laenge-j] = a->ziffern[a->laenge-i] + b->ziffern[b->laenge-j];
    

    Da kommt aber leider irgendein Murks raus, in meinem Testfall "d" als char-Ausgabe. Die beiden zu addierenden Werte habe ich mir direkt vor diesem Rechenschritt ausgeben lassen, die haben beide den char-Wert "2". Als Ergebnis hätte ich also total gerne den Wert "4" und nicht "d". Alle angegebenen Pointer sind als unsigned char initialisiert.

    Ich hab auch schon versucht, die beiden Additionswerte mit (int) zu casten, kommt zum gleichen Ergebnis.

    Hat jemand eine Idee?

    Ich liefer auch gern mehr vom Code, aber da der sehr umfangreich ist und ich vermute, dass ich einfach "nur" irgendein Verständnisproblem habe, erst mal nur der kleine Ausschnitt.



  • Du addierst Zeichen.
    Schau dir mal ein ASCII-Tabelle an.

    2 ist etwas anderes als '2' ist etwas anderes als "2"


  • Mod

    Zeichen sind zwar Zahlen, jedoch ist '2' != 2 . Wenn du wirklich mit den Werten von Ziffernzeichen rechnen möchtest, dann subtrahiere vorher den Wert des Zeichens '0' . Denn '2' - '0' == 2 , das ist vom C-Standard garantiert. Ebenso für alle anderen Ziffern*.

    Ich möchte noch anmerken, dass du das Wort Pointer sehr komisch benutzt. Ein Array ist kein Pointer und es wird erst recht nichts "an der Stelle eines Pointers gespeichert". Du solltest nochmal genau angucken, wie Arrays, Pointer, usw. funktionieren. Du scheinst es zwar richtig zu machen, du solltest es aber besser auch richtig verstehen, sonst bekommst du später Probleme.

    *: Aber nicht für das Alphabet! 'd' - 'a' ist nicht unbedingt 3.



  • "2" != '2'

    "2" = '2' und '\0'

    '2' = '2'

    wenn du in c was in "Anführungszeichen" setzt, dann ist das ein string, dh. er wird automatisch mit '\0' beendet.
    beispiel:
    "string" = 's' + 't' + 'r' + 'i' + 'n' + 'g' + '\0'

    wenn du ein einzelnes zeichen in einstrichige anführungszeichen schreibst, dann ist das ein char.
    beispiel:
    '5' = '5'

    "2" bedeutet also, dass du einen string mit dem inhalt '2' und dem '\0'-endbyte erzeugst.
    '2' bedeutet also, dass du einen einzelnen char mit dem wert '2' erzeugst.

    und bitte noch eins merken: du hast hier zeichen!
    '2' ist nicht 2 sondern 50!
    wollt ich nur mal gesagt haben, falls du das noch nicht wusstest.



  • Vielen vielen Dank für eure Antworten, vor allem die von SeppJ hat mir sehr geholfen!
    Stimmt, in Sachen Pointer hab ich mich recht ungeschickt ausgedrückt, natürlich wird der Wert nicht in einem Pointer gespeichert, sondern in dem Speicherplatz, auf den er zeigt. Ich hab die "Arrays" hier Pointer genannt, weil sie bei mir in ihrer Grundform ein Pointer sind (mit Speicherallokierung durch malloc usw.). Da ich noch einigermaßen neu bin in C, sitzen einige Begrifflichkeiten noch nicht so 🙄
    Dass als char eine "2" != '2' ist, weiß ich zwar, aber irgendwie stand ich total auf dem Schlauch.

    Ja, wie gesagt, vielen Dank, ihr habt mir echt geholfen, wusste nicht mehr weiter!



  • Ein Ausdruck wie "2" liefert einen Zeiger auf ein Stringliteral, das dann im Speicher eine '2' und eine '\0' ist.

    Und '2' muss nicht 50 sein. Es gibt noch andere Codes als ASCII.

    @breakingbad6
    Dein Problem war nicht "2" != '2' sondern 2 != '2'.

    Mit der "2" hast du dich nur unglücklich in deiner Problembeschreibung ausgedrückt.



  • Wenn das Ergebnis wieder eine Ziffer 0 .. 9 sein soll kommt man wohl nicht darum
    herum auch Überlauf zu berücksichtigen.
    Der Übertrag müsste dann an der höheren Stelle mitberücksichtigt werden.

    Das vorliegenden Schema lässt keine Addition mit negativen Zahlen zu, sodas es
    nicht auch noch zu einem Unterlauf kommen kann.

    Es wäre ausserdem ratsam vor der Rechnung zu prüfen, ob in dem Array wirklich
    nur die erwarteten Ziffern stehen.


Anmelden zum Antworten