strtoul führt zu Kompilerfehler

#3107689
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.
#3107729
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"
#3107745
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.
Gast #3108238
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.
#3108264
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);
#3108593
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)
Angehängte Dateien:
#3108609
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?
#3109002
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).
Angehängte Dateien:
#3109036
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.
#3109100
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.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren