PRB: Incorrect Results Returned, C Float FunctionsLast reviewed: July 19, 1995Article ID: Q79381 |
The information in this article applies to:
SYMPTOMSWhen using the Microsoft FORTRAN Compiler version 4.1, 5.0, or 5.1, if FORTRAN code attempts to access a C float function, incorrect results may be returned from the C function.
CAUSEFORTRAN expects a DOUBLE PRECISION number to be returned from both REAL and DOUBLE PRECISION functions. C functions of type float return only 4 bytes, and the FORTRAN run-time incorrectly interprets the value stored in the floating accumulator (__fac) as an 8-byte number.
RESOLUTIONThis problem can be avoided by declaring the C function as type double, or by declaring the C function with the _fortran attribute.
MORE INFORMATION
Sample Code #1The following code reproduces the problem:
FORTRAN Code
interface to real function cthing[c](dog) real dog[value] end real dog real cthing,r dog=2 r=cthing(dog) write(*,*) r end C Code
#include <stdio.h>float cthing(float dog) { float cat; printf("%f \n",dog); cat=3.0; printf("%f \n",cat); return cat;}
Output: Incorrect Results Generated Here2.000000 3.000000 0.000000E+00 Sample Code #2The following solution declares the C function with the _fortran attribute, and generates the expected output:
FORTRAN Code
real dog,r real cthing dog=2.0 r=cthing(dog) write(*,*) r end C Code
#include <stdio.h>float _fortran cthing(float *dog) { float cat; printf("%f \n",*dog); cat=3.0; printf("%f \n",cat); return cat;}
Output2.000000 3.000000 3.000000 |
Additional reference words: 5.00 5.10 mixed language
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |