math.h en pow()...

Status
Niet open voor verdere reacties.

MJONKERS1

Nieuwe gebruiker
Lid geworden
6 dec 2007
Berichten
4
wat doe ik fout?

PHP:
double CalculateHeight(double dGroundPressure, double dGroundTemp)
{
  double height = 0;
  double dPressure = GetBarometricPressure();
  
  const double dTempGradient = -0.0065;
  const double dGasConstanteLucht = 287.10;
  const double dGravity = 9.80665;
  
  height = (pow((dPressure/dGroundPressure),-((dTempGradient*dGasConstanteLucht)/dGravity))-1)*(dGroundTemp/dTempGradient);
  
  return height;
}
de compiler geeft een undefined reference to pow.

Als ik alleen vaste getallen invoer doet hij het goed...

PHP:
pow(2,3);

maar stop ik dezelfde getallen in een variabele (double) dan werkt het niet meer...

PHP:
double a=2;
double b=3;
pow(a,b);

Weet iemand wat ik verkeerd doe?
 
een hele stomme suggestie.. maar krijg je ook een error (post volledige msg dan aub) als je
Code:
#include <cmath>
gebruikt ipv math.h ?

--Johan
 
Dit krijg ik als probeer te compileren in mijn console van eclipse, mijn ontwikkelomgeving.
Ik include math.h. Wat houd cmath dan precies in?


make -k all
.compiling main.c
arm-elf-gcc -I./ -c -fno-common -O0 -g main.c
..linking
arm-elf-ld -v -Map main.map -Tdemo_at91sam7_h256_blink_flash.cmd -o main.out crt.o main.o timerisr.o timersetup.o isrsupport.o lowlevelinit.o blinker.o libgcc.a
main.o: In function `CalculateHeight':
/cygdrive/c/GCCFD/projects/sam7h256/hoogte.h:35: undefined reference to `pow'
main.o: In function `Get_Speed':
/cygdrive/c/GCCFD/projects/sam7h256/speed.h:36: undefined reference to `sqrt'
GNU ld version 2.16.1
make: *** [main.out] Error 1
make: Target `all' not remade because of errors.
 
cmath is de c++ versie van math.h
Van alle 'oude' STL-headers is in 98/99 een nieuwere versie uitgekomen, die bestaat uit de naam van de 'oude' voorafgegaan door een 'c' en zonder de extensie '.h', soms is er een uitzondering op deze naamgeving: stdio.h -> iostream

Met Eclipse als C++-omgeving heb ik nog geen ervaring (verandert in januari), maar de error ziet er een linker-error uit, namelijk dat de 'pow/sqrt' nergens gevonden zijn, dus hoogst waarschijnlijk is er een probleem met de link naar math.h
Als Eclipse standaard de STL meelinkt, kan het dus zijn dat het gebruik van cmath dit voorkomt.

Ik ken Eclipse wel van Java/Flex.
Kijk eens of het volgende ook voor C++ geldt:
Rechtsklikken op je project, kiezen voor 'Build Path' (als dat er niet is, kies voor 'Properties' en dan 'Build Path')
Daar is waarschijnlijk een tabblad 'libraries', daar zou een folder 'lib' moeten instaan (in die folder zitten redelijk wat files met extensie '.a' en sommige '.o'-files, die meestal beginnen met 'lib...'

Hopelijk kan je hier iets mee,
--Johan
 
bedant voor de hulp, maar ik kan build path niet vinden.
Maar volgens mij vind hij math.h wel. Als ik gewoon pow(2,3) doe dan geeft hij geen errors. maar zodra ik een variabele ga gebruiken zoals:

PHP:
double a=3;
pow(2,a);

dan wil die nie meer...:confused:
 
Schijnbaar komt de library niet overeen met de header file.

pow(1, 2); Hier gaat de compiler vanuit dat de parameters integers zijn.
pow(a, b); Als a en b doubles zijn gebruikt de compiler su een andere functie.

probeer eens:

pow(1.0f, 2.0f);

Als dit ook een error veroorzaakt, dan zit de floating point variant dus niet in de library en wel in de header...

Als a en b ongebroken getallen blijven, kun je ze casten naar integers. Maar dat wil je waarschijnlijk niet:

pow((int) a, (int) b);
 
Dit krijg ik als probeer te compileren in mijn console van eclipse, mijn ontwikkelomgeving.
Ik include math.h. Wat houd cmath dan precies in?


make -k all
.compiling main.c
arm-elf-gcc -I./ -c -fno-common -O0 -g main.c
..linking
arm-elf-ld -v -Map main.map -Tdemo_at91sam7_h256_blink_flash.cmd -o main.out crt.o main.o timerisr.o timersetup.o isrsupport.o lowlevelinit.o blinker.o libgcc.a
main.o: In function `CalculateHeight':
/cygdrive/c/GCCFD/projects/sam7h256/hoogte.h:35: undefined reference to `pow'
main.o: In function `Get_Speed':
/cygdrive/c/GCCFD/projects/sam7h256/speed.h:36: undefined reference to `sqrt'
GNU ld version 2.16.1
make: *** [main.out] Error 1
make: Target `all' not remade because of errors.

Kijk eens of je in die header files ( in het blauw aangegeven ) wel een #include <math.h> hebt gedaan..
want de compiler geeft een specifieke error message van die 2 files.
 
Kan je ergens in eclipse linker-flags invoeren? Als dat zo is probeer dan eens om de flag "-lm" mee te geven aan de linker.

Dat loste bij mij (gcc op linux) de door jou genoemde foutmelding op.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan