mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik String to long integer


Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grüße Euch.
Ich habe folgendes Problem:

Gegeben ist :
char ausgabe[7];
Dahinter verbirgt sich ein String!!! z.B. 9999999


Nun möchte ich den String 9999999 in unsigned long integer umwandeln.
Wäre es so richtig ???

Wie sieht denn die Variable var aus ?
#include <stdlib.h>

char ausgabe[7];
unsigned long var;

var=atol(ausgabe);


Gruß Heiko

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guck sie dir doch im Debugger an. äh !!!

'atol' ist übrigens auch fast tot, nimm lieber 'strtol', das ist 
flexibler und du kannst Fehler abfangen.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja so ists richtig: 
http://www.cplusplus.com/reference/clibrary/cstdli...

Und wie soll var dann aussehen? Da steht dann halt der Wert drin, der 
vorher noch ein String war.

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok.

vielleicht sollte ich das ganze Problem schildern.

Ich möchte also den String :

char ausgabe[7];

als hex ausgeben:

Weiß jemand wie ich das ohne print_f hinbekomme???

Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heiko wrote:
> ok.
>
> vielleicht sollte ich das ganze Problem schildern.
>
> Ich möchte also den String :
>
> char ausgabe[7];
>
> als hex ausgeben:

Jetzt wirds völlig unverständlich.

Wenn du einen String hast (also einen Text), dann gibt man den 'in Hex' 
aus, indem man für jedes Zeichen den ASCII Code in Hex ausgibt.

Wie da jetzt strtol oder atol oder überhaupt unsigned long ins Spiel 
kommt, ist nicht wirklich einsichtig.

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun ja,

ich habe einen String und folgenden Code:
char ausgabe[7];
unsigned long my_val = 2000;
signed int i;
char digit;

for (i = 28; i >= 0; i -= 4)
{
    digit = (my_val >> i) & 0x0000000f;
    digit = (digit > 9) ? (digit + 'A' - 10) : (digit + '0');
    send_char (digit); // z.B. Ausgabe auf UART
}


Ich wollte also den String ausgabe in long integer konvertieren.
Dann den long integer wert umwandeln und als hex ausgeben.

Mache ich da einen groben Fehler ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du kein ultoa zur Verfügung?

> Mache ich da einen groben Fehler ?

So beim schnellen Drüberschauen ist mir jetzt nichts aufgefallen. 
Funktionierts nicht?

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo KArl.

Jetzt bin ich aber bißchen durcheinander...
ultoa wandelt doch einen unsigned long integer zu einem String oder???
ich habe aber einen String und möchte daraus ein hex machen...
Ich kann da leider keinen Zusammenhang sehen...


Gruß

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anstatt:
    digit = (digit > 9) ? (digit + 'A' - 10) : (digit + '0');
    send_char (digit); // z.B. Ausgabe auf UART
ist folgendes wohl deutlich schneller:
    send_char ("0123456789ABCDEF"[digit]); // z.B. Ausgabe auf UART

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt versehe ich nichts mehr...

Ich habe folgendes:
char ausgabe[7];  // z.B. 9999999
unsigned long var;
jetzt wandle ich den String in long interger um
var=atol(ausgabe);
habe also in var den Wert 9999999 also long integer.

Warum kann das jetzt nicht klappen ?
unsigned long var;
signed int i;
char digit;

for (i = 28; i >= 0; i -= 4)
{
    digit = (var >> i) & 0x0000000f;
    digit = (digit > 9) ? (digit + 'A' - 10) : (digit + '0');
    send_char (digit); // z.B. Ausgabe auf UART
}

Bin ich denn zu doof dazu ?

Autor: Urs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleine Anmerkung: Ein '9999999' passt nicht zusammen mit der nötigen 
zerotermination in ein char[7].

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heiko wrote:
> Jetzt versehe ich nichts mehr...
Da bist Du nicht der einzige!

> char ausgabe[7];  // z.B. 9999999
Das ist kein String. Erstens wäre es "9999999". Zweitens ist String in C 
immer nullterminiert, also passt "9999999" gar nicht in ein Array mit 7 
Elementen hinein. Du brauchst mindestens 8. "9999999" ist nämlich
{'9', '9', '9', '9', '9', '9', '9', '\0'}

> unsigned long var;
> [/c]
> jetzt wandle ich den String in long interger um
>
> var=atol(ausgabe);
> 
> habe also in var den Wert 9999999 also long integer.
Nur, wenn Du Glück hast und in der an den Originalstring anschließenden 
Stelle eine 0 steht. Falls nicht, kommt Müll raus.

> Bin ich denn zu doof dazu ?
Du bist möglicherweise einfach nur "zu doof", Dein Problem Schritt für 
Schritt so zu erläutern, dass andere das auch verstehen.

Autor: Blackbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in
    char ausgabe[7];  // z.B. 9999999

paßt nur 999999, dann kommt '\0' wenn es ein ASCII-String ist.
Nach
   var=atol(ausgabe);

steht dann 0x000F423F drin.

Der Rest ist dann so i.O.

Die Ausgabe sollte dann so aussehen: "00F423F" auf dem Terminal (?)

Oder täusche ich mich da so sehr?


Blackbird

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heiko wrote:
> Hallo KArl.
>
> Jetzt bin ich aber bißchen durcheinander...
> ultoa wandelt doch einen unsigned long integer zu einem String oder???

Ja und?
Du kannst angeben, in welchem Zahlensystem die Ausgabe gemacht wird.

> ich habe aber einen String und möchte daraus ein hex machen...

Du hast keinen String, den du zu einem Hex machen willst.
Du schmeisst ständig 2 Schritte durcheinander.

* Zunächst mal generierst du dir mit atol (oder strtol) einen unsigned 
long, der der 'Zahl' in deinem String entspricht.
* Und dann sagst du ultoa es soll daraus wieder eine 
Stringrepräsentierung machen, aber diesmal zur Basis 16 (also Hex)

  char Buffer[20] = "99999";
  unsigned long Value;

  Value = atol( Buffer );
  ultoa( Buffer, Value, 16 );

  lcd_puts( Buffer );

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Urs.

Die Feldgröße [7] passt doch allemal für eine 7 Stellige Zahl.

Verstehe ich nicht. Wie meinst Du das?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil ein String in C immer mit einem Nullbyte abgeschlossen wird.
7 Zeichen (z.B. die '9'-en) und die abschließende 0 macht 8 
Feldelemente.
-> elementare Grundlagen C

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK.

Danke für Eure Hilfe. Ich glaube ich muß mich da noch etwas
einarbeiten. Bis heute abend sage ich bescheid ob es geklappt hat.

Danke erstmal
Heiko

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heiko wrote:
> Hallo Urs.
>
> Die Feldgröße [7] passt doch allemal für eine 7 Stellige Zahl.
>
> Verstehe ich nicht. Wie meinst Du das?

Jetzt gehst du, nein du läufst, ganz schnell in die nächste Buchhandlung 
und besorgst dir ein Grundlagenbuch über C. Es ist mir völlig 
unverständlich, wie man eine Programmiersprache ohne vernünftge 
Unterlagen lernen können möchte.

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl.

Erstmal wollte ich dir sagen :

Es hat so geklappt, wie du beschrieben hast...
char Buffer[20];
unsigned long Value;
Value=atol(ausgabe);
ultoa(Value,Buffer,16);

lcd_puts( Buffer );

Danke nochmal.

Zweitens das mit dem Buch ist keine schlechte Idee.
Habe bis jetzt nicht vernünftiges im Internet gefunden (Script)

Vielen Dank noch mal
und bis zum nöchsten Mal!

Heiko

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heiko wrote:

> Zweitens das mit dem Buch ist keine schlechte Idee.
> Habe bis jetzt nicht vernünftiges im Internet gefunden (Script)

Von Internet halt ich nicht viel.
Bücher sollten aus Papier sein. Da kann man dann auch Notizen dazu 
anbringen, sich PostIt an wichtige Seiten kleben und abends im Bett noch 
mal ein Kapitel schmöckern. Nicht zu vergessen, dass das Buch wie 
selbstverständlich bei den ersten Versuchen neben dem Montor liegt und 
zur Hand genommen wird, um den letzten Abschnitt noch mal zu lesen und 
mit dem Code am Monitor zu vergleichen. Und wenn man ein Buch vor Wur 
mal an die Wand pfeffert, ist auch nichts verloren :-)

Wenn du deine erste Sprache so einigermassen beherrscht, gehts auch mit 
Internet-Online-Tutorien. Aber bis dorthin ist ein physisches Buch durch 
nichts zu schlagen. Ausser vielleicht durch einen 2.ten Mann, der mit 
dir dasselbe Buch durchrackert ....

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.