![]() |
c - mathlib
sers @all
ich möchte unter linux in c die mathlib nutzen und schrieb folgendes kleines prog, daß unter visual c++ funzt: -----------------cut-------------------- #include <stdio.h> #include <math.h> int main(int argc, char **argv) { int iwerte[100]; int i; iwerte[0]=0; for(i=0; i<100; iwerte[i]= pow(++i,2)); for(i=0; i<100; printf("%d\t%d\n", i, iwerte[++i])); return 0; } ----------------------cut---------------- beim versuch mit dem gcc, daß ganze zu compilieren erhalte ich folgende fehlermeldung: /tmp/ccVaXske.o: In function `main': /tmp/ccVaXske.o(.text+0x4f): undefined reference to `pow' collect2: ld returned 1 exit status öhm ... wie kann das? für hilfe im voraus ein thx. greetz artemisia |
HI!
Also ich habs grad mit gcc unter windos (mit cygwin) probiert und es hat problemlos funktioniert! Außer das dein Array um eins zu klein ist. ;) Meine Version von gcc ist 2.95.3-5 Schau mal ob bei die math.h installiert ist. (find /usr/include/ |grep math.h | less) Es müsste eigentlich funktionieren... lg |
sers sonic
na, des array is ned zu klein. es enthält die quadratzahlen von 1 - 100. unter win hab ich ja auch kein prob damit ... des prob entsteht beim compilieren unter linux. *smile ... sicher ist math.h installiert greetz artemisia btw: ls /usr/include/* | egrep "math.h" zeigt mir auch meine header |
Die zweite for-Schleife enthält einen typischen Anfängerfehler, sonic hat recht, daß das Array unterdimensioniert ist.
|
@ Sonic und kikakater:
array ist nicht zu klein definiert, lediglich das printf - statement ist buggy: for(i=0; i<100; printf("%d\t%d\n", i, iwerte[i++])); wäre korrekt! Alles klar? Zum kompilieren (hab schon längere Zeit nix mehr unter Linux gemacht *g*): die Library-Angabe beim Aufruf hast nicht vergessen (irgendwas a la '-lmath.so' oder so ähnlich ...) - der Meldung nach kann nämlich der Linker die Referenz nicht auflösen, was typischerweise auf eine nicht angegebene Bibliothek hinweist ... lg Belgarath |
@sonic und kikakater die "unterdimensionierung" hab ich noch einmal überprüft ... das feld war schon richtig dimensioniert, nur der index war um eins zu hoch gesetzt. hab zwei änderungen in den forschleifen vorgenommen: for(i=0; i<100; iwerte[i++]= pow(i+1,2)); for (i=0; i<100; printf("%d\t%d\n", (i++)+1, iwerte[i])); aber das erklärt trotzdem nicht, warum es unter win funzt und unter linux nicht. greetz artemisias |
@belgarath
wow ... merci du hast mir auf die sprünge geholfen ... die genaue linker anweisung ist: -lm damit funzt es :-)) apropos forschleife: hier sollten nur die werte von 1 bis 100 und die entsprechenden quadratzahlen berechnet, gespeichert und ausgegeben werden. das ganze war eh nur ein testprog. greetz artemisias |
ohne es jetzt prüfen zu können (arbeite in der fa. auf ibm-mainframe): ich glaube, Dein 2. Ansatz ist jetzt 'richtig falsch' *g*
Warum? Code:
for(i=0; i<100; iwerte[i++]= pow(i+1,2)); Code:
iwerte[0] = pow(1+1,2); Code:
iwerte[0] = 4; Code:
iwerte[1] = 9; Code:
for (i=0; i<100; printf("%d\t%d\n", (i++)+1, iwerte[i])); Code:
printf("%d\t%d\n", (0)+1, iwerte[1])); Code:
1 9 Bei i=99 (also letzter Schleifendurchlauf) würde das Prog versuchen, auf iwerte[100] zu zu greifen, was entweder einen Zufallswert oder (hängt von Compiler und Einstellung ab) einen Absturz (segmentation fault) zu Folge haben müßte. korrekt wäre IMHO (wie prinzipiell auch schon in meinem letzten Posting angegeben) : Code:
for ( i = 0; i < 100; iwerte[i] = pow( ++i, 2) ); lg Belgarath |
mathe-library dazulinken !!
Hi,
abgesehen von moeglicherweise falschen indizes (dem augenschein nach, hab nicht drueber nachgedacht): die fehlermeldung kommt, weil man beim gcc die math-library explizit dazulinken muss: gcc bla.c -o bla -lm ^^^^ ...undefined reference to `pow' sollte dann weg sein. l.g. andi |
*smile, belgarath ....
nett gesagt: richtig falsch ;-) was is nu falsch falsch? also zu meinen schleifen: sie funzen. warum? darum: erster durchlauf: iwerte[0] = pow(0+1,2); also konkret: iwerte[0] = 1; in weiterer folge: iwerte[1] = 4; iwerte[2] = 9; ich glaube, das kommt daher, weil der ausdruck von rechts nach links verarbeitet wird, meinst du nicht auch, daß das bei zuweisungen gewöhnlich der fall ist? greetz artemisias @andi merci ... hab es schon gefunden ... siehe posting oben |
Alle Zeitangaben in WEZ +2. Es ist jetzt 12:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag