Forum: Mikrocontroller und Digitale Elektronik String to long integer


von Heiko (Gast)


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 ?
1
#include <stdlib.h>
2
3
char ausgabe[7];
4
unsigned long var;
5
6
var=atol(ausgabe);

Gruß Heiko

von Sven P. (Gast)


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.

von Timmo H. (masterfx)


Lesenswert?

Ja so ists richtig: 
http://www.cplusplus.com/reference/clibrary/cstdlib/atol.html

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

von Heiko (Gast)


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ß

von Karl H. (kbuchegg)


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.

von Heiko (Gast)


Lesenswert?

Nun ja,

ich habe einen String und folgenden Code:
char ausgabe[7];
1
unsigned long my_val = 2000;
2
signed int i;
3
char digit;
4
5
for (i = 28; i >= 0; i -= 4)
6
{
7
    digit = (my_val >> i) & 0x0000000f;
8
    digit = (digit > 9) ? (digit + 'A' - 10) : (digit + '0');
9
    send_char (digit); // z.B. Ausgabe auf UART
10
}

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 ?

von Karl H. (kbuchegg)


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?

von Heiko (Gast)


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ß

von Klaus W. (mfgkw)


Lesenswert?

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

von Heiko (Gast)


Lesenswert?

Jetzt versehe ich nichts mehr...

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

Warum kann das jetzt nicht klappen ?
1
unsigned long var;
2
signed int i;
3
char digit;
4
5
for (i = 28; i >= 0; i -= 4)
6
{
7
    digit = (var >> i) & 0x0000000f;
8
    digit = (digit > 9) ? (digit + 'A' - 10) : (digit + '0');
9
    send_char (digit); // z.B. Ausgabe auf UART
10
}

Bin ich denn zu doof dazu ?

von Urs (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


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
1
{'9', '9', '9', '9', '9', '9', '9', '\0'}

> unsigned long var;
> [/c]
> jetzt wandle ich den String in long interger um
>
1
> var=atol(ausgabe);
2
>
> 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.

von Blackbird (Gast)


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

von Karl H. (kbuchegg)


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 );

von Heiko (Gast)


Lesenswert?

Hallo Urs.

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

Verstehe ich nicht. Wie meinst Du das?

von Klaus W. (mfgkw)


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

von Heiko (Gast)


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

von Karl H. (kbuchegg)


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.

von Heiko (Gast)


Lesenswert?

Hallo Karl.

Erstmal wollte ich dir sagen :

Es hat so geklappt, wie du beschrieben hast...
1
char Buffer[20];
2
unsigned long Value;
3
Value=atol(ausgabe);
4
ultoa(Value,Buffer,16);
5
6
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

von Karl H. (kbuchegg)


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 ....

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.