mikrocontroller.net

Forum: Compiler & IDEs Probleme mit der atoi-Funktion


Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich hab Probleme mit der atoi-Funktion. Ich lese aus einer Datei 
(config.dat) ein 9 stelligen Zahlenwert in den config_buffer ein. Diesen 
eingelesenen Zahlenwert möchte ich nun in einen int-Zahlenwert umwandeln 
und in zahlen_wert[i] schreiben. zahlen_wert[] ist global als unsigned 
in deklariert. Die ganze Geschichte funktioniert bis zu einer 5 
stelligen Zahl (z.B. 000012345), leider ab einer 6 stelligen Zahl 
(000123456) nicht mehr. Hat einer von euch eine Idee was ich falsch 
mache?

Ich dank euch.
Gruß
Stephan
  S32 config_offset = 0;
  unsigned char config_buffer[9];
  U8 mode_fseek = 0;

  config_offset = 188;
  Fopen("config.dat",'r');        //öffnen der config Datei
  for(i=0; i<15; i++)            //15 Schleifendurchläufe für 15 mögliche Identifier
  {
    config_offset = config_offset + 27;  //den Offset auf den ersten Identifier im Config-File setze
    Fseek(config_offset, mode_fseek);   //im Config-File von vorne um den Ofsett verschieben
    Fread(config_buffer, 9);       //auslesen von 9 Zeichen in den config_buffer


    zahlen_wert[i] = atoi(&config_buffer); 
  }
  Fclose();

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Integer sind 2 Byte --> 2^16 = 65536!

Eine größere Zahl wirst du also zahlen_wert nicht reinbekommen. Wähle 
einen anderen Typ (longint z.B.)

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort. Leider funktioniert es als long 
zahlen_wert auch nicht. Gibts sonst noch Ideen?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
atoi => integer, also -32768..32767 bei 8/16-Bit Controller. Für mehr: 
atol oder strtol verwenden.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stephan schrieb:
> Danke für die schnelle Antwort. Leider funktioniert es als long
> zahlen_wert auch nicht. Gibts sonst noch Ideen?

man-page von atoi lesen. Falls keine man-page vorhanden, im C-Buch 
gucken. Falls kein C-Buch vorhanden, umgehend bestellen. Bis dahin atol 
nehmen. Oder gleich strtol.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... bei letzterem (strtol) aber die Nullterminierung nicht 
vergessen...;-)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weshalb? strtol/strtoul hört beim ersten Zeichen auf, das nicht ins 
Schema passt. Ob das \0 ist oder was anderes ist egal. Das ist bei 
atoi/atol auch nicht anders - wie auch?

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ A. K. und Peter Stegemann

   Juhuuuuu! Mit atol funktioniert's.

@ Peter Stegemann

   C-Buch ist schon bestellt


Ich danke euch für eure schnelle Hilfe.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Satz aus der man-Page:

The conversion is done according to the given base, which must be 
between 2
and 36 inclusive, or be the special value 0.

Prinzipiell hast du recht, steht ja auch in dem Satz, aber man weis ja 
nie, was das für Daten sind. Und Strings sollten immer mit \0 terminiert 
sein, um sich nicht über irgendwelche Nebeneffekte wundern zu müssen... 
(zumindestens nach meiner Meinung)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie muss die Ziffernfolge beendet werden, dass ist klar. Aber wenn 
der Programmierer der Funktion(en) keinen grandiosen Mist gebaut hat, 
dann ist es egal ob das \0 oder ein Komma oder das Ende der Zeile ist.

Das ist ja grad der Witz an strtol. Man kann diese Funktion verwenden, 
um bestehende Zeichenfolgen mit enthaltenen Zahlen inkrementell zu 
parsen.

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.