Forum: Compiler & IDEs strtoul führt zu Kompilerfehler


von Heiko F. (fuchsle)


Lesenswert?

Hallo,

ich habe ein Problem mit der Funktion "strtoul".
Es soll aus einem String ein unsigned Integer mit 16 Bit gelesen werden.

Genutzt wird das Atmel-Studio 6
die folgende Zeile sorg dafür, dass ich keine "Fehlermeldung" in dem 
Error-Fenster bekomme, sondern das mein Programm nicht mehr kompiliert.
1
...
2
uint16_t iwert
3
...
4
iwert = strtoul(daten, NULL, 10);
5
...

Folgende Fehler treten auf wenn das Programm nicht mehr kompiliert 
werden kann.
1
Done executing task "RunCompilerTask" -- FAILED.
2
Done building target "CoreBuild" in project "PID_Reglerkarte.cproj" -- FAILED.
3
Done building project "PID_Reglerkarte.cproj" -- FAILED.

Vielen Dank für eure Hilfe.

von Karl H. (kbuchegg)


Lesenswert?

Heiko Fuchs schrieb:


> Folgende Fehler treten auf wenn das Programm nicht mehr kompiliert
> werden kann.
> Done executing task "RunCompilerTask" -- FAILED.

und das ist die erste Fehlermeldung, die du zu Gesicht bekommst, oder 
gibt es davor noch irgendwelche Ausgaben, die 'ungewöhnlich' sind?

Aus dieser Meldung geht nur hervor, dass der Compiler einen Fehler 
gemeldet hat, aber nicht welcher das war. Sie ist ungefähr so hilfreich 
wie "Mein Auto fährt nicht" oder "Es tut weh"

von (prx) A. K. (prx)


Lesenswert?

Ausserdem ist der Quellcodeauszug derart minimalisiert, dass relevante 
Information fehlt (=> daten).

von Karl H. (kbuchegg)


Lesenswert?

A. K. schrieb:
> Ausserdem ist der Quellcodeauszug derart minimalisiert, dass relevante
> Information fehlt (=> daten).

Ausschliessen kann man es natürlich nicht, aber ich denke, diesmal hat 
es tatsächlich was mit der Toolchain selber zu tun bzw. der Anbindung an 
AVR-Studio.
Wenns was im Code wäre, dann gäbs eine Fehlermeldung im Error-Fenster.

D.h. es ist sicher irgendwas im Code. Aber was hilft dir das, wenn es 
den Compiler zum Absturz bringt (beispielsweise). Egal was im Code 
steht, abschmieren darf er auf keinen Fall, bzw. Fehlermeldungen dürfen 
nicht verloren gehen.

von B e r n d W. (smiley46)


Lesenswert?

Hallo Heiko

Kannst Du mal nachschauen, wie genau strtoul() in string.h deklariert 
ist?

von Heiko F. (fuchsle)


Lesenswert?

B e r n d W. schrieb:
> Hallo Heiko
>
> Kannst Du mal nachschauen, wie genau strtoul() in string.h deklariert
> ist?

String.h habe ich nicht eingebunden.
Die Funktion ist in der Stdlib.h implementiert.

Bin gerade unterwegs, werde heute Abend nochmal reinschauen.
Danke schonmal für die Infos.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Heiko Fuchs schrieb:
> Die Funktion ist in der Stdlib.h implementiert.

Ganz sicher ist sie das nicht. Da wird sie deklariert sein, d.h., da 
steht der Funktionsprototyp, aber nicht der Code, der die Funktion 
ausmacht.

von Heiko F. (fuchsle)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Heiko Fuchs schrieb:
>> Die Funktion ist in der Stdlib.h implementiert.
>
> Ganz sicher ist sie das nicht. Da wird sie deklariert sein, d.h., da
> steht der Funktionsprototyp, aber nicht der Code, der die Funktion
> ausmacht.

Korrekt.
Danke, dass stimmt natürlich.

von meckerziege (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Heiko Fuchs schrieb:
>> Die Funktion ist in der Stdlib.h implementiert.
>
> Ganz sicher ist sie das nicht. Da wird sie deklariert sein, d.h., da
> steht der Funktionsprototyp, aber nicht der Code, der die Funktion
> ausmacht.

Womit dem OP ja sehr geholfen ist...


Frage: Tritt das Problem nur in DIESEM Projekt auf, oder auch in einem 
Minimalbeispiel? Wenn du ein Code reinstellst, bei welchem dieser Fehler 
auftritt bei dir, dann können wir es auch mal kompilieren und evtl. den 
Fehler finden.

von Heiko F. (fuchsle)


Lesenswert?

Heiko Fuchs schrieb:
> B e r n d W. schrieb:
>> Hallo Heiko
>>
>> Kannst Du mal nachschauen, wie genau strtoul() in string.h deklariert
>> ist?
>
> String.h habe ich nicht eingebunden.
> Die Funktion ist in der Stdlib.h implementiert.
>
> Bin gerade unterwegs, werde heute Abend nochmal reinschauen.
> Danke schonmal für die Infos.

Deklaration in stdlib.h:
1
/**
2
    The strtoul() function converts the string in \c nptr to an
3
    unsigned long value.  The conversion is done according to the
4
    given base, which must be between 2 and 36 inclusive, or be the
5
    special value 0.
6
7
    The string may begin with an arbitrary amount of white space (as
8
    determined by isspace()) followed by a single optional \c '+' or \c '-'
9
    sign.  If \c base is zero or 16, the string may then include a
10
    \c "0x" prefix, and the number will be read in base 16; otherwise,
11
    a zero base is taken as 10 (decimal) unless the next character is
12
    \c '0', in which case it is taken as 8 (octal).
13
14
    The remainder of the string is converted to an unsigned long value
15
    in the obvious manner, stopping at the first character which is
16
    not a valid digit in the given base.  (In bases above 10, the
17
    letter \c 'A' in either upper or lower case represents 10, \c 'B'
18
    represents 11, and so forth, with \c 'Z' representing 35.)
19
20
    If \c endptr is not NULL, strtoul() stores the address of the first
21
    invalid character in \c *endptr.  If there were no digits at all,
22
    however, strtoul() stores the original value of \c nptr in \c
23
    *endptr.  (Thus, if \c *nptr is not \c '\\0' but \c **endptr is \c '\\0'
24
    on return, the entire string was valid.)
25
26
    The strtoul() function return either the result of the conversion
27
    or, if there was a leading minus sign, the negation of the result
28
    of the conversion, unless the original (non-negated) value would
29
    overflow; in the latter case, strtoul() returns ULONG_MAX, and \c
30
    errno is set to \ref avr_errno "ERANGE".  If no conversion could 
31
    be performed, 0 is returned.
32
*/
33
extern unsigned long strtoul(const char *__nptr, char **__endptr, int __base);

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Heiko Fuchs schrieb:
> Deklaration in stdlib.h:

Die könnten wir selbst nachlesen.  Da sie aber ohnehin dem
C-Standard (ISO IEC 9899:1990) entspricht, braucht man dafür
nicht einmal den Auszug aus der Headerdatei.

Das bringt bei der Annäherung an deinen Fehler leider nur nichts.

von Heiko F. (fuchsle)


Angehängte Dateien:

Lesenswert?

Karl Heinz Buchegger schrieb:
> A. K. schrieb:
>> Ausserdem ist der Quellcodeauszug derart minimalisiert, dass relevante
>> Information fehlt (=> daten).
>
> Ausschliessen kann man es natürlich nicht, aber ich denke, diesmal hat
> es tatsächlich was mit der Toolchain selber zu tun bzw. der Anbindung an
> AVR-Studio.
> Wenns was im Code wäre, dann gäbs eine Fehlermeldung im Error-Fenster.
>
> D.h. es ist sicher irgendwas im Code. Aber was hilft dir das, wenn es
> den Compiler zum Absturz bringt (beispielsweise). Egal was im Code
> steht, abschmieren darf er auf keinen Fall, bzw. Fehlermeldungen dürfen
> nicht verloren gehen.

Habe meine Toolchain geändert, nun passt es.
Vielen Dank für eure Unterstützung.

Folgende Option war aktiviert:

Toolchain
  --> AVR/GNU Linker[/code]
    --> General
      --> Use vprintf library(-Wl,-u,vprintf)

von Heiko F. (fuchsle)


Lesenswert?

Die FloatingPoint Unterstützung kommt mir in die Quere.

Hatte bisher die o.g. Option aktiviert und die “printf_flt” und 
“scanf_flt” Libaries hinzugefügt. Das benötige ich um meine 
Gleitkommazahlen mit sprintf korrekt zu formatieren. Ausgabe über USART.

Sobald ich die “printf_flt” und “scanf_flt” Libaries hinzufüge UND die 
"strtoul()" nutze kompiliert mein Programm nicht. Nehme ich eines der 
beiden weg klappt es.

Gibt es einen anderen Weg, eine Gleitkommazahl mit Test in einen String 
zu packen, ohne das Rad neu zu erfinden?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Heiko Fuchs schrieb:
> Sobald ich (...) kompiliert mein Programm nicht.

Auf die Frage von Karl Heinz 
Beitrag "Re: strtoul führt zu Kompilerfehler" bist Du bislang noch 
nicht eingegangen.

von Heiko F. (fuchsle)


Angehängte Dateien:

Lesenswert?

Karl Heinz Buchegger schrieb:
> Heiko Fuchs schrieb:
>
>
>> Folgende Fehler treten auf wenn das Programm nicht mehr kompiliert
>> werden kann.
>> Done executing task "RunCompilerTask" -- FAILED.
>
> und das ist die erste Fehlermeldung, die du zu Gesicht bekommst, oder
> gibt es davor noch irgendwelche Ausgaben, die 'ungewöhnlich' sind?
>
> Aus dieser Meldung geht nur hervor, dass der Compiler einen Fehler
> gemeldet hat, aber nicht welcher das war. Sie ist ungefähr so hilfreich
> wie "Mein Auto fährt nicht" oder "Es tut weh"

Im Anhang befinden sich die Meldungen aus meinem Output-Fenster.

Es gibt keine Einträge in der Error-List (keine Fehler, Warnungen oder 
Meldungen).

von Stefan E. (sternst)


Lesenswert?

Heiko Fuchs schrieb:
> Im Anhang befinden sich die Meldungen aus meinem Output-Fenster.
>
> Es gibt keine Einträge in der Error-List (keine Fehler, Warnungen oder
> Meldungen).

Es gibt aber im Output Fehler, die die eigentliche Ursache deiner 
Probleme sind, nämlich all die lustigen Zeilen mit
"... relocation truncated to fit: R_AVR_13_PCREL against symbol ...".

1
... -Wl,-lm -Wl,-lprintf_flt ...
Das gehört auf jeden Fall schon mal anders herum. Es ist zwar nicht 
100%ig sicher, dass mit dieser Korrektur die Fehler verschwinden, aber 
die Wahrscheinlichkeit ist hoch.

von Heiko F. (fuchsle)


Angehängte Dateien:

Lesenswert?

Stefan Ernst schrieb:
>
>
1
... -Wl,-lm -Wl,-lprintf_flt ...
> Das gehört auf jeden Fall
> schon mal anders herum. Es ist zwar nicht 100%ig sicher, dass mit dieser
> Korrektur die Fehler verschwinden, aber die Wahrscheinlichkeit ist hoch.

Danke für den Tipp.
Hätte es nicht gedacht, aber nun scheint es keine weiteren 
Beanstandungen zu geben.

Habe die Reihenfolge meiner eingebundenen Libraries geändert (siehe Bild 
im Anhang).
Output ist nochmals dabei, aber mit einem
1
Build succeeded.
2
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
 gebe ich mich erstmal zufrieden.

Dank all den Helferlein.

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.