Anomali i Digital Mars Compileren?
Hej,jeg skriver ofte DLLs i C og har den sidste uges tid prøvet om jeg kan få det til at funke med Digital Mars compileren (-mn -WD, inkl. kernel32.lib).
Det viser jeg jeg får et ejendommeligt problem med doubles.
Følgende funktion (som jeg kalder med argumentet 1.1) viser problemet:
double __declspec(dllexport) dmcdouble (double X)
{
return(X + 2.2 ); //giver resultat 1.1 hvis X=1.1
}
Reusltatet burde selvfølgelig blive 3.3, men forbliver 1.1.
Derfor prøver jeg følgende:
double __declspec(dllexport) dmcdouble (double X)
{
return(2.2 ); //giver resultat -2.26298960487887E-247 når X=1.1
}
Nu synes jeg det bliver sært. Tjekker calling conventions igennem osv men det er rigtigt. Prøver om jeg kan lave en funktion som returnerer en integer og gør lidt ved den (addition, subtraktion, længde af en streng etc) og det fungerer glimrende.
Altså: problemet er kun et float problem, men ikke et integer problem og det har ikke at gøre med calling convention.
Prøver at include math.h og bruger
double __declspec(dllexport) dmcdouble (double X)
{
return (M_PI) ; //fejl igen som ovenfor}
}
M_PI vurde jo give 3.14159osv men resultatet er som return(2.2).
Prøver følgende:
return(X)
return(X*X)
og begge dele giver det forventede resultat (hhv 1.1 og 1.21). Dvs problemet er bestemt ikke relateret til returneringen af en double i sig selv, og argumentet fanges korrekt.
Prøver at pille rundt med float vs double, men finder heller ingen løsning.
Summa summarum: jeg kan ikke få compileren til at fatte "håndskrevet" 2.2 !?!?
Det fungerer som det skal hvis jeg bruger MinGW. Nogen der kan komme med ideer til hvorledes jeg konmmer videre med DMC?
Y.