WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 02.01.2002, 19:50   #1
artemisia
Elite
 
Registriert seit: 07.02.2001
Beiträge: 1.441


Standard 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
artemisia ist offline   Mit Zitat antworten
Alt 02.01.2002, 21:07   #2
Sonic
Master
 
Registriert seit: 28.03.2000
Alter: 45
Beiträge: 691


Sonic eine Nachricht über ICQ schicken
Standard

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««««««|
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Sonic ist offline   Mit Zitat antworten
Alt 02.01.2002, 22:03   #3
artemisia
Elite
 
Registriert seit: 07.02.2001
Beiträge: 1.441


Standard

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
artemisia ist offline   Mit Zitat antworten
Alt 03.01.2002, 12:45   #4
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Die zweite for-Schleife enthält einen typischen Anfängerfehler, sonic hat recht, daß das Array unterdimensioniert ist.
kikakater ist offline   Mit Zitat antworten
Alt 03.01.2002, 13:13   #5
Belgarath
Master
 
Registriert seit: 16.11.2000
Beiträge: 530


Standard

@ 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
Belgarath ist offline   Mit Zitat antworten
Alt 03.01.2002, 13:24   #6
artemisia
Elite
 
Registriert seit: 07.02.2001
Beiträge: 1.441


Standard


@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
artemisia ist offline   Mit Zitat antworten
Alt 03.01.2002, 13:31   #7
artemisia
Elite
 
Registriert seit: 07.02.2001
Beiträge: 1.441


Standard

@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
artemisia ist offline   Mit Zitat antworten
Alt 03.01.2002, 14:04   #8
Belgarath
Master
 
Registriert seit: 16.11.2000
Beiträge: 530


Standard

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));
erster Durchlauf:
Code:
  iwerte[0] = pow(1+1,2);
also konkret:
Code:
  iwerte[0] = 4;
in weiterer Folge:
Code:
  iwerte[1] = 9;
  iwerte[2] = 16;
usw.

Code:
  for (i=0; i<100; printf("%d\t%d\n", (i++)+1, iwerte[i]));
erster Durchlauf:
Code:
  printf("%d\t%d\n", (0)+1, iwerte[1]));
Ausgabe:
Code:
  1      9
  2      16
usw.

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++] ) );
Aber einfach ausprobieren, wenn Du mir nicht glauben solltest ...

lg
Belgarath
Belgarath ist offline   Mit Zitat antworten
Alt 03.01.2002, 14:23   #9
andi_77
Jr. Member
 
Registriert seit: 18.05.2000
Beiträge: 69


Standard 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
andi_77 ist offline   Mit Zitat antworten
Alt 03.01.2002, 14:51   #10
artemisia
Elite
 
Registriert seit: 07.02.2001
Beiträge: 1.441


Standard

*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
artemisia ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:18 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag