Ich wollte mir eigentlich gerade ein paar Zehnerpotenzen in einer
Lookup-Table speichern, da das generische pow() zu viel Platz braucht,
bekam beim kompilieren aber den Fehler:
1
main.h:36:24: warning: built-in function ‘pow10’ declared as non-function [enabled by default]
2
const uint16_t __flash pow10[] = {
Dachte ich mir nun also 'schön, bringt die Toolchain wohl schon mit.'
Aber doch nicht so ganz:
1
main.c:229:85: error: called object ‘pow10’ is not a function or function pointer
2
[…] -= pow10(menuepos-1);
Die Suche nach einem Header o.ä. zu dieser Funktion brachte mich auch
nicht wirlich weiter:
> paar Zehnerpotenzen in einer Lookup-Table speichern
Welche?
Die Frage ist nämlich auch, ob du dir für die kleinen 10-er Potenzen
überhaupt den Luxus eines double antun willst.
> ... avr-gcc -c -mmcu=attiny461 ....
Sicher, dass du überhaupt Floating Point haben willst?
Oder reicht dir nicht einfach nur eine Tabelle, die aus den Werten 1,
10, 100, 1000, 10000 als uint16_t besteht?
Dann nenn die Funktion ganz einfach nicht pow10, wenn dieser Name
(unzulässigerweise) schon vom gcc belegt ist, sondern irgendwie anders,
und alles ist gut.
Wozu brauchst du das überhaupt?
> built-in function ‘pow10’
build-in heisst eingebaut, nenne deine Tabelle (die sowieso ein
unzureichender Ersatz für pow10 wäre) p10 und greife per p10[x] darauf
zu.
Karl Heinz Buchegger schrieb:>> ... avr-gcc -c -mmcu=attiny461 ....> Sicher, dass du überhaupt Floating Point haben willst?> Oder reicht dir nicht einfach nur eine Tabelle, die aus den Werten 1,> 10, 100, 1000, 10000 als uint16_t besteht?
Genau die habe ich auch:
1
const uint16_t __flash powten[] = {
2
10000,
3
1000,
4
100,
5
10,
6
1
7
};
Dass sie "rückwärts" ist spart mit in dem Fall sogar eine Substraktion.
Mir ging es mehr um das generelle, falls ich das mal verwenden möchte,
wie es dann tut – also Lernen für die Zukunft, nicht für den aktuelle
Fall.
Moritz A. schrieb:> main.c:7:5: warning: implicit declaration of function ‘pow10’> [-Wimplicit-function-declaration]
Also ist pow10 nicht in math.h enthalten. Damit wird vom Compiler
der Funktionsprototyp int pow10(int) angenommen.
Und das wiederum erklärt den Folgefehler:
> main.c:7:11: warning: incompatible implicit declaration of built-in function
‘pow10’ [enabled by default]
Dir fehlt der passende Prototyp.
Mal in den Headerdateien gestöbert, wo pow10 deklariert wird?
Rufus Τ. Firefly schrieb:> Mal in den Headerdateien gestöbert, wo pow10 deklariert wird?
Genau das habe ich ja versucht, aber nix gefunden:
Moritz A. schrieb:> Die Suche nach einem Header o.ä. zu dieser Funktion brachte mich auch> nicht wirlich weiter:
Rufus Τ. Firefly schrieb:> der Funktionsprototyp int pow10(int) angenommen.
Ganz am Anfang war es auch int/int, nur nach dem Hinweis auf
http://linux.die.net/man/3/pow10 hatte ich es auf double geändert. Der
Fehler blieb der gleiche.
Das iostream und std::cout Zeug ist nur zur Demonstration. Das constexpr
an der Array-Definition stellt sicher dass die Berechnung vom Compiler
durchgeführt wird und nur das Ergebnis im Programm landet. Dank dem
Template funktioniert das auch mit allen numerischen Typen wie integer,
float etc.