Probleme mit dem umgang von eingabe Fehlern



  • Sipps schrieb:

    Mir ist leider nicht klar wie ich auch "Zeichen" testen kann, könnt ihr mir das erklären oder einen Link schicken in dem das steht?

    Schau dir mal eine ASCII Tabelle an.

    Da hat das Zeichen, das die Ziffer Eins darstellt den Wert 49.
    jetzt kannst du in deinem Programm case 49: schreiben.

    Das ist aber blöd, da es schlecht lesbar ist (du verwendest eine Magic Number)
    (und es gibt noch andere Codes als ASCII)

    Du kannst daher in C++ einfach das Zeichen angeben. Das geschieht, indem du es zwischen einfache Hochkommas einschließt: '1'
    Dies ist für C++ auch nur ein Ganzzahlwert. (Im Gegensatz zu dem Stringliteral "1")

    Darum schreibst du case '1':



  • @DirkB

    Ah, danke für die Erklärung 🙂

    das war mir garnicht klar, das wir in meinem Buch auch nicht erwähnt 😃
    danke 🙂



  • Sipps schrieb:

    @DirkB

    Ah, danke für die Erklärung 🙂

    das war mir garnicht klar, das wir in meinem Buch auch nicht erwähnt 😃
    danke 🙂

    Und weil die Zeichen '0', '1', '2', ..., '9' laut Asciitable aufeinander folgen, kannst du einfach das Zeichen '0' von jedem Zeichen abziehen und bekommst die Zahlen 0,1,2, ... 9. 🙂



  • ja oder xor 48 bzw. xor 0x30 verknüpfen, geht schneller. 🙄

    jedenfalls sollte man bei einstelligen zahlen, mit denen man nicht rechnen will, immer char verwenden und auf zeichenwerte prüfen.



  • HansKlaus schrieb:

    ja oder xor 48 bzw. xor 0x30 verknüpfen, geht schneller. 🙄

    jedenfalls sollte man bei einstelligen zahlen, mit denen man nicht rechnen will, immer char verwenden und auf zeichenwerte prüfen.

    Kannst du das begründen?



  • HansKlaus schrieb:

    ja oder xor 48 bzw. xor 0x30 verknüpfen, geht schneller. 🙄

    Was das nicht so um 1998 zum letzten mal der Fall?



  • HansKlaus schrieb:

    ja oder xor 48 bzw. xor 0x30 verknüpfen, geht schneller. 🙄

    Mal abgesehen vom xor: 0x30, 48 oder '0' ist bei ASCII identisch. Da ist kein Unterschied im Maschinencode.

    Vermeide Magic Numbers. Das ist schlecht lesbar.



  • Vorsicht mit impliziten Voraussetzungen. C++11 garantiert (2.3), daß die values von '0', '1', ... '9' im Abstand von 1 aufeinander folgen. Deshalb kann man z.B. '4' - '2' berechnen.



  • Andromeda schrieb:

    HansKlaus schrieb:

    ja oder xor 48 bzw. xor 0x30 verknüpfen, geht schneller. 🙄

    jedenfalls sollte man bei einstelligen zahlen, mit denen man nicht rechnen will, immer char verwenden und auf zeichenwerte prüfen.

    Kannst du das begründen?

    additionen benötigen mehr takte als xor-verknüpfungen, da erstere zusätzlich zur eigentlichen summe noch das carry-bit berechnen müssen, während letztere quasi in einem arbeitsgang ausgeführt werden können.



  • HansKlaus schrieb:

    Andromeda schrieb:

    HansKlaus schrieb:

    ja oder xor 48 bzw. xor 0x30 verknüpfen, geht schneller. 🙄

    jedenfalls sollte man bei einstelligen zahlen, mit denen man nicht rechnen will, immer char verwenden und auf zeichenwerte prüfen.

    Kannst du das begründen?

    additionen benötigen mehr takte als xor-verknüpfungen, da erstere zusätzlich zur eigentlichen summe noch das carry-bit berechnen müssen, während letztere quasi in einem arbeitsgang ausgeführt werden können.

    Und den zweiten Satz?



  • naja welchen zweck hat es, bei der abfrage von tastendrücken bzw. von einzelnen zeichen den zahlenwert zu verwenden?



  • HansKlaus schrieb:

    additionen benötigen mehr takte als xor-verknüpfungen, da erstere zusätzlich zur eigentlichen summe noch das carry-bit berechnen müssen, während letztere quasi in einem arbeitsgang ausgeführt werden können.

    Das kannste so pauschal nicht sagen. Die Summe und das Carry-Bit entstehen doch in einem Rutsch. XOR, AND, OR wie auch SUB und ADD müssten gleich schnell sein, nämlich 1 Takt für die eigentliche Operation. Das Laden der Operanden in die Register lassen wir mal unberücksichtigt.

    Relativ langsam sind Multiplikation und Division mit Digitalrechnern, wenn man nicht gerade mit Zweierpotenzen arbeitet.


Anmelden zum Antworten