ANSI-C Problem bei trunc(x), round(x) wenn x Variable
-
Hallo,
ich möchte die Funktionen aus math.h trunc(x), round(x) in einem größeren Programm verwenden.....
....struct dezihex dezitohex(int dezimal){
int a1, a2;
double help1, help2;
char b1, b2;help1 = 19.097;
a1 = trunc(help1);
a2 = dezimal-trunc(help1)*16;
b1='0';
b2='0';
if (a1 == 0 ){
b1="0";
....
....igw900_dnp5280.c:211: undefined reference to `trunc'
aber mit
struct dezihex dezitohex(int dezimal){
int a1, a2;
double help1, help2;
char b1, b2;help1 = 19.097;
a1 = trunc(19.097);
a2 = dezimal-trunc(19.097)*16;
b1='0';
b2='0';
if (a1 == 0 ){
b1="0";
.....funtioniert es.
Woran kann das liegen, dass beim Einsatz von Zahlen das Programm läuft, die Zahl in einer Variable aber nicht?
Gruß Markus
-
Ähm... diese Funktionen gehören nicht zur math.h . Jedenfalls nicht zur der math.h, die der C89 Standard vorgibt. Welchen Compiler + OS verwendest du?
-
Hallo,
ich verwende gcc version 4.0.2 20050901 (prerelease) (SUSE Linux) unter SuSE 10.0.
-
Hm. In ANSI C (C89) gibt's die Funktionen nicht, aber in ISO C (C99) sind die drin. Du musst unter Unix-Systemen allerdings mit -lm kompilieren, wenn du die math.h verwendest.
Außerdem solltest du evtl. -std=c99 angeben, damit der Compiler checkt, dass er die Funktionen nehmen darf.
MfG
GPC
-
Hallo und danke,
ich weiss zwar noch nicht genau ob das Programm läuft, brachte aber auf der Konsole erst einmal keine Fehlermeldung. Auch ausführbare Datei ist entstanden.
golbs@amdwork:~/arm-c> gcc -Wall -std=c99 -o igw900_dnp5280_i586 igw900_dnp5280_i586.c -lmWie ist es, wenn ich das z.B. auf arm-elf-gcc -march=armv4 -mtune=arm7tdmi -Wall -Wl,-elf2flt -Os -o igw900_dnp5280_i586 igw900_dnp5280_i586.c -lc
bzw. auf
m68k-elf-gcc -Wall -m5307 -Wl,-elf2flt -Os -o igw900_dnp5280_i586 igw900_dnp5280_i586.c -lc
bringen möchte. Kann ich dann -std=c99 und -lm auch angeben? Die Optionen -std=c99 und -lm lassen sich doch im KDevelop bestimmt auch integrieren?
Gruß und Dankeschön Markus
-
Klar, das geht natürlich. -std=c99 und -lm tun keinem weh.
Na ja, aber du musst halt beachten, dass ein für C99 geschriebener C Code nicht unter C89 kompiliert.
-
Hallo,
kann man eventuell die Funktionen trunc() bzw. round() auch in C89 realisieren? Ziel ist es den Kerncode primär für Microcontroler zu verwenden.
Gruß Markus
-
MGolbs schrieb:
Hallo,
kann man eventuell die Funktionen trunc() bzw. round() auch in C89 realisieren? Ziel ist es den Kerncode primär für Microcontroler zu verwenden.
Gruß Markus
Jo, öffne die entsprechende Datei im include Verzeichnis deines Compilers ( /usr/include/ und dann g++ oder so in die Richtung ), kopiere den Quellcode heraus und dann hast du deine eigenen trunc und round Funktionen. Musst halt schauen, ob die intern noch was von C99 verwenden, was du dann auch noch rausziehen musst.
Aber evtl. kann der Compiler für den Mikrocontroller ja auch C99?! Einfach mal schauen, falls du dir unsicher bist.
-
Hallo,
danke, danke! Ich glaube jetzt habe ich erst mal richtig zu tun
.
Einen schönen Nachmittag und Gruß Markus
-
Hallo,
kämpfe noch mit den gcc Optionen unter KDevelop. Wenn ich nun mit -lm linke, was man nach umfangreicher Suche für math.h machen muss, stellt sich für mich die Frage: Funktioniert das erzeugte Programm auch auf jeder anderen Linux Maschine oder geht dann die Problematik lib's Kompatibilität los
?
Gruß Markus
-
MGolbs schrieb:
kämpfe noch mit den gcc Optionen unter KDevelop.
hab's gesehen... und was dazu gesagt.
Wenn ich nun mit -lm linke, was man nach umfangreicher Suche für math.h machen muss, stellt sich für mich die Frage: Funktioniert das erzeugte Programm auch auf jeder anderen Linux Maschine oder geht dann die Problematik lib's Kompatibilität los
?
Ne, tut sie nicht. Ich weiß auch nicht, wieso man jetzt gerade bei der math.h -lm dazulinken muss, obwohl mich das auch interessieren würde. Habe aber bisher noch nicht die Zeit gefunden, dass in Angriff zu nehmen...
MfG
GPC