mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Typumwandlung ???


Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

ich hab mal eine wahrscheinlich recht dämliche Frage. Scheinbar hab ich
die Typumwandlung doch noch
nicht so recht drauf. Schaut euch bitte mal die beiden folgenden
Programme an. Programm 1 funktioniert
Programm 2 nicht. Wo versteckt sich der Fehler?

Programm1
---------

unsigned int myint;
myint = 1;

funktion (myint);


Programm2
---------

unsigned int myint;
unsigned char zeichen;

zeichen = '1';
myint = (unsigned int)z;

funktion (myint);





dabei wird jeweils eine Funktion aufgerufen, die wie folgt ausschaut:

void funktion(unsigned int pin)
{.....}



Mark

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned int myint;
  myint = 1;

myint ist hier 1.

  unsigned int myint;
  unsigned char zeichen;

  zeichen = '1';
  myint = (unsigned int)zeichen;

myint ist hier 0x31 (49 dezimal)

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Dir vielmals

meinst du mir atoi komme ich besser hin ?

Mark

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auch mit atoi () bin ich nicht sonderlich weiter gekommen

Die Lösung hab ich dann letztendlich irgendwo in diesem Forum gefunden,
nämlich:

myint = zeichen - '0';

Das funktioniert wunderbar, nur leider kapier ich nicht wieso
kann mir das vielleicht einer erklären

Mark

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
atoi erwartet einen String als Argument; '1' ist kein String, sondern
ein einzelnes Zeichen. Damit's zum String wird, müsstest Du schon
"1" schreiben:

  myint = atoi("1");

Wenn sichergestellt ist, daß nur eine einstellige Zahl zwischen 0 und 9
auftreten kann, könntest Du auch 48 abziehen.

  myint = '1' - 48;

damit ist myint auch wieder 1

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
'1' ist 0x31 oder decimal 49.
'0' ist 0x30 oder decimal 48.

Folglich ist '1' - '0' = 0x1 oder decimal 1.
'1' - 48 ist natürlich auch decimal 1.

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke euch vielmals

Mark

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber aufpassen!

char zeichen;
zeichen = "1";

Geht mächtig in die Hose!
Weis jetzt grad nicht, ob sich das überhaupt übersetzen lässt, aber
falls doch: "1" besteht aus zwei bytes, 0x31 und 0x00. '1'
besteht aus einem byte, 0x31!
Das Problem: cahr zeichen hat für genau ein byte Platz ;-)

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist halt der Unterschied zwischen einzelnen Zeichen und Strings.

Vielleicht sollte mal das Buch "Programmieren in C" von Kernighan &
Ritchie (zweite Auflage, Hanser Verlag) gelesen werden?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.