Avatar billede yates Nybegynder
05. juli 2006 - 08:35 Der er 3 kommentarer

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.
Avatar billede yates Nybegynder
05. juli 2006 - 08:37 #1
Tillægsoplysning:

Nogle foretrækker at sætte __declspec(dllexport) før identifieren, som fx:

__declspec(dllexport) double  dmcdouble (double X)
{
    return(X ); //giver resultat 1.1 hvis X=1.1
}

Dette giver ingen forskel i mit tilfælde.

Y.
Avatar billede yates Nybegynder
05. juli 2006 - 08:41 #2
Tillæsoplysning igen

return (double) (2.2) eller
return (double) (M_PI) give heller ikke rigtig resultat.
Y.
Avatar billede bertelbrander Novice
16. juli 2006 - 13:37 #3
Digital Mars her en række nyhedsgrupper:
http://www.digitalmars.com/NewsGroup.html
Måske skulle du prøve der.

De er ikke altid lige hurtige til at svare, men der kommer normalt svar på et eller andet tidspunkt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester