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_tiwert
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.
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"
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.
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.
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.
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.
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.
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
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.
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)
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?
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).
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.
> 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