Hallo,
folgendes Problem:
,----[ test.c ]-
| #include
On Friday 27 June 2003 10:17, Bernhard Walle wrote:
Hallo,
folgendes Problem:
,----[ test.c ]-
| #include
| #include | | int main (int argc, char** argv) | { | printf("%f\n", round(0.5)); | | return 0; | } `----
[~] $ gcc -W -Wall -Wno-unused -lm -o test test.c test.c: In function `main': test.c:6: warning: implicit declaration of function `round' test.c:6: warning: double format, different type arg (arg 2)
Das Ergebnis ist auch unbrauchbar (2.890182). Warum? round() scheint mir die einzige Funktion zu sein, die "normal" rundet, also x.5 immer nach oben.
hallo, hab das mal getestet, komm auf folgendes Ergebnis: andi@andi:~/test> gcc -W -Wall -Wno-unused -lm -o test test.c test.c: In function `main': test.c:7: warning: implicit declaration of function `round' andi@andi:~/test> ./test 1.000000 andi@andi:~/test> Hab das auf die Schnelle gefunden: http://groups.google.com/groups?q=round+libc&hl=en&lr=&ie=UTF-8&selm=876658uxs9.fsf%40pot.cnuce.cnr.it&rnum=6 oder http://sources.redhat.com/ml/bug-glibc/2001-10/msg00019.html Verwende Suse 8.2, gcc-3.3-23, glibc-2.3.2-6 Vielleicht hilfts .. . ~ Andi!
* Am Fre, 27 Jun 2003 schrieb Bernhard Walle:
Hallo,
folgendes Problem:
,----[ test.c ]- | #include
| #include | | int main (int argc, char** argv) | { | printf("%f\n", round(0.5)); | | return 0; | } `---- [~] $ gcc -W -Wall -Wno-unused -lm -o test test.c test.c: In function `main': test.c:6: warning: implicit declaration of function `round' test.c:6: warning: double format, different type arg (arg 2)
Das Ergebnis ist auch unbrauchbar (2.890182). Warum? round() scheint mir die einzige Funktion zu sein, die "normal" rundet, also x.5 immer nach oben.
Keine Ahnung von round, aber ich nehme immer floor(x+0.5) zum Runden... Gruß Christoph -- Christoph Maurer - Tux#194235 - christoph-maurer@gmx.de
Am Fre, 2003-06-27 um 10.17 schrieb Bernhard Walle:
Hallo,
folgendes Problem:
,----[ test.c ]- | #include
| #include | | int main (int argc, char** argv) | { | printf("%f\n", round(0.5)); | | return 0; | } `---- [~] $ gcc -W -Wall -Wno-unused -lm -o test test.c test.c: In function `main': test.c:6: warning: implicit declaration of function `round' test.c:6: warning: double format, different type arg (arg 2)
man round .. CONFORMING TO C99. .. Beachte C99 !!! => gcc -Wall -std=c99 -o test test.c -lm D.h. in c89 (aka ANSI-C) gibt es round nicht, ceil oder floor hingegen sind C89-konform.
Das Ergebnis ist auch unbrauchbar (2.890182). Warum? Da Du nicht -std=c99 verwendest, ist round nicht deklariert => Implizit deklariert als "int round()" => Warnung "double format, ..."
=> Der Linker nimmt ein anderes round als das von dir beabsichtigte => Gesamtverhalten des Progs ist Murks. Ralf
On Fri, 27 Jun 2003 at 15:07 (+0200), Ralf Corsepius wrote:
Am Fre, 2003-06-27 um 10.17 schrieb Bernhard Walle:
folgendes Problem:
,----[ test.c ]- | #include
| #include | | int main (int argc, char** argv) | { | printf("%f\n", round(0.5)); | | return 0; | } `---- [~] $ gcc -W -Wall -Wno-unused -lm -o test test.c test.c: In function `main': test.c:6: warning: implicit declaration of function `round' test.c:6: warning: double format, different type arg (arg 2)
man round .. CONFORMING TO C99. ..
Beachte C99 !!!
=> gcc -Wall -std=c99 -o test test.c -lm
Funktioniert (allerdings nur mit gcc 3.x), aber wie soll man da drauf kommen ... Jedenfalls danke! Gruss, Bernhard -- _________ http://www.bwalle.de _________________________________________________ A feature is nothing more than a bug with seniority.
Hello, On Fri, 27 Jun 2003, Bernhard Walle wrote:
On Fri, 27 Jun 2003 at 15:07 (+0200), Ralf Corsepius wrote: [..]
man round [..] => gcc -Wall -std=c99 -o test test.c -lm
Funktioniert (allerdings nur mit gcc 3.x), aber wie soll man da drauf kommen ... Jedenfalls danke!
Bei gcc 2.95.x funktioniert's wenn man _GNU_SOURCE oder _ISOC9X_SOURCE
oder _ISOC99_SOURCE definiert und gegen die libm linkt. Siehe auch
Am Fre, 2003-06-27 um 19.35 schrieb Bernhard Walle:
On Fri, 27 Jun 2003 at 15:07 (+0200), Ralf Corsepius wrote:
Am Fre, 2003-06-27 um 10.17 schrieb Bernhard Walle:
folgendes Problem:
,----[ test.c ]- | #include
| #include | | int main (int argc, char** argv) | { | printf("%f\n", round(0.5)); | | return 0; | } `---- [~] $ gcc -W -Wall -Wno-unused -lm -o test test.c test.c: In function `main': test.c:6: warning: implicit declaration of function `round' test.c:6: warning: double format, different type arg (arg 2)
man round .. CONFORMING TO C99. ..
Beachte C99 !!!
=> gcc -Wall -std=c99 -o test test.c -lm
Funktioniert (allerdings nur mit gcc 3.x), aber wie soll man da drauf kommen ... Worauf beziehst Du diese Anmerkung?
* Auf das "CONFORMING TO C99"? Nun, "halbwegs erfahrene" C-Programmierer verwenden "ceil", (int)(val + 0.5) Tricks oder ähnliches und kommen gar nicht auf die Idee "round" zu verwenden, da diese Problematik zu den klassischen C-Grundkursübungen gehört (Ca. Lektion 5 in C-Anfängerkursen :-) ) Ich bin auch nur aufgrund deiner Frage neugierig geworden, da ich round bis dahin auch nicht kannte. Erste Quelle in solchen Frage ist daher immer die Man-Page, gefolgt von den den zugehörigen Headern. * Auf -std=...? Wird in "man gcc" beschrieben. * Auf c99 als Sprachstandard? gcc < 3.x kennt c99 als Sprachstandard nicht. gcc >= 3.x hingegen schon und unterstützt ihn mit zunehmender Version weitergehender. Die von David beschrieben Präprozessor-Tricks aktivieren lediglich die in neueren glibc2's enthaltenen c99-Support-Funktionen und ermöglichen den Zugriff auf c99-Funktionen in "gcc-Default-Sprachstandard" Programmen (Vgl. /usr/include/features.h) -std=c99 hingegen schaltet den gcc auf c99-Sprachstandard um und geht damit deutlich weiter. Ralf
On Mon, 30 Jun 2003 at 11:16 (+0200), Ralf Corsepius wrote:
Am Fre, 2003-06-27 um 19.35 schrieb Bernhard Walle:
On Fri, 27 Jun 2003 at 15:07 (+0200), Ralf Corsepius wrote:
Am Fre, 2003-06-27 um 10.17 schrieb Bernhard Walle:
folgendes Problem:
,----[ test.c ]- | #include
| #include | | int main (int argc, char** argv) | { | printf("%f\n", round(0.5)); | | return 0; | } `---- [~] $ gcc -W -Wall -Wno-unused -lm -o test test.c test.c: In function `main': test.c:6: warning: implicit declaration of function `round' test.c:6: warning: double format, different type arg (arg 2)
man round .. CONFORMING TO C99. ..
Beachte C99 !!!
=> gcc -Wall -std=c99 -o test test.c -lm
Funktioniert (allerdings nur mit gcc 3.x), aber wie soll man da drauf kommen ... Worauf beziehst Du diese Anmerkung?
* Auf das "CONFORMING TO C99"?
Nein, steht in der Manpage.
Nun, "halbwegs erfahrene" C-Programmierer verwenden "ceil", (int)(val + 0.5) Tricks oder ähnliches und kommen gar nicht auf die Idee "round" zu verwenden, da diese Problematik zu den klassischen C-Grundkursübungen gehört (Ca. Lektion 5 in C-Anfängerkursen :-) )
Naja, ich programmiere relativ viel in Java und da gibt's Math.round(). In dem konkreten Fall (pos. Zahlen) habe ich dann auch val + 0.5 zu einem Integer gecastet verwendet, ich finde round() aber einfach schoener zu lesen.
* Auf -std=...?
Wird in "man gcc" beschrieben.
* Auf c99 als Sprachstandard?
Dass man, um den aktuellen Sprachstandard zu verwenden, irgendwas angeben muss.
gcc < 3.x kennt c99 als Sprachstandard nicht. gcc >= 3.x hingegen schon und unterstützt ihn mit zunehmender Version weitergehender.
Ich bin halt der Meinung dass ein Compiler grundsatzlich den neuesten Sprachstandard Gruss, Bernhard -- _________ http://www.bwalle.de _________________________________________________ Bei der Eroberung des Weltraums sind zwei Probleme zu lösen: die Schwerkraft und der Papierkrieg. Mit der Schwerkraft wären wir fertig geworden. -- Wernher von Braun
On Mon, 30 Jun 2003 at 13:01 (+0200), Michael Matz wrote:
On Mon, 30 Jun 2003, Bernhard Walle wrote:
Ich bin halt der Meinung dass ein Compiler grundsatzlich den neuesten Sprachstandard
Und ich bin der Meinung, dass Frieden ne gute Sache ist ;-)
Ich wollte eigentlich keinen Unfrieden stiften, das war nur die Begruendung warum ich da nie drauf gekommen waere. Nichts fuer ungut! Gruss, Bernhard -- _________ http://www.bwalle.de _________________________________________________ Zivilcourage ist das, was von einem Menschen übrig bleibt, wenn der Vorgesetzte das Zimmer betritt. -- Wernher von Braun
participants (6)
-
Andreas Kofler
-
Bernhard Walle
-
Christoph Maurer
-
David Haller
-
Michael Matz
-
Ralf Corsepius