![]() |
![]() |
|
![]() |
![]() |
|
Programmierung Rat & Tat für Programmierer |
![]() |
|
Themen-Optionen | Ansicht |
![]() |
#1 |
Elite
![]() Registriert seit: 07.02.2001
Beiträge: 1.441
|
![]() 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 |
![]() |
![]() |
![]() |
#2 |
Master
![]() |
![]() 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
____________________________________
__________________ |»»»»»SONIC««««««| ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |
![]() |
![]() |
![]() |
#3 |
Elite
![]() Registriert seit: 07.02.2001
Beiträge: 1.441
|
![]() 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 |
![]() |
![]() |
![]() |
#4 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() Die zweite for-Schleife enthält einen typischen Anfängerfehler, sonic hat recht, daß das Array unterdimensioniert ist.
|
![]() |
![]() |
![]() |
#5 |
Master
![]() Registriert seit: 16.11.2000
Beiträge: 530
|
![]() @ 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 |
![]() |
![]() |
![]() |
#6 |
Elite
![]() Registriert seit: 07.02.2001
Beiträge: 1.441
|
![]() @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 |
![]() |
![]() |
![]() |
#7 |
Elite
![]() Registriert seit: 07.02.2001
Beiträge: 1.441
|
![]() @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 |
![]() |
![]() |
![]() |
#8 |
Master
![]() Registriert seit: 16.11.2000
Beiträge: 530
|
![]() 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; iwerte[2] = 16; 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 2 16 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) ); for ( i = 0; i < 100; printf( "%d\t%d\n", i + 1, iwerte[i++] ) ); lg Belgarath |
![]() |
![]() |
![]() |
#9 |
Jr. Member
![]() Registriert seit: 18.05.2000
Beiträge: 69
|
![]() 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 |
![]() |
![]() |
![]() |
#10 |
Elite
![]() Registriert seit: 07.02.2001
Beiträge: 1.441
|
![]() *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 |
![]() |
![]() |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|