我需要帮助才能使用JNA读取文本文件中的十进制数字。它看起来很有趣,但问题是真的。
我创建了一个简单的Java程序,它使用JNA调用一个简单的Fortran子程序。
主要课程:
package Appli;
public class Appli {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// call to subroutine lecture with LECT
LectInterface.LECT.lecture();
}
}
界面:
package Appli;
import com.sun.jna.Library;
import com.sun.jna.Native;
/**
* Interface.
*/
public interface LectInterface extends Library {
// dynamic library.
public final static LectInterface LECT = (LectInterface) Native.loadLibrary("libLect.so", LectInterface.class);
/**
* Fonction LECTURE.
*
*/
public double lecture();
}
Fortran子程序只读取文本文件中的数字:
SUBROUTINE LECTURE ()
DOUBLE PRECISION VALDOUBLE
INTEGER IFILE
PARAMETER(IFILE=1)
WRITE(*,*)'START LECTURE'
OPEN(UNIT=1,FILE='/home/Fortran/fort.txt')
READ(IFILE,*) VALDOUBLE
WRITE(*,*)VALDOUBLE
WRITE(*,*)'END LECTURE'
END SUBROUTINE
文本文件:
2.36
当我使用我的Java程序(使用NetBeans)调用此子例程时,它返回:
run :
START LECTURE
2.000000000000000
END LECTURE
我使用NetBeans 8,java 7,gfortran和JNA-4.1.0
我编译:
gfortran -fno-underscoring -fPIC -c -g -o LECTURE.o LECTURE.f
然后
gfortran -shared -o libLect.so LECTURE.o
我无法解释为什么READ函数只占用数字的前半部分(小数点前),例如:
2.200 => 2.000000000000000
0.12 => 0.000000000000000
12.023 => 12.000000000000000
100000.0182 => 100000.000000000000000
我使用编译器ifort(英特尔)和pgf90(PGI)进行了几次测试。
使用pgf90,结果仍为false,但使用ifort时,可以正确读取该值。
编译:{{1}}
创建动态库:ifort -c -fPIC LECTURE.f
结果:2.3
我还使用与ifort相同的选项使用gfortran编译源代码。值为false(2.0)。
是否有使用gfortran添加的编译选项?