Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基本C和Fortran类型的确定长度_C_Compiler Construction_64 Bit_Fortran - Fatal编程技术网

基本C和Fortran类型的确定长度

基本C和Fortran类型的确定长度,c,compiler-construction,64-bit,fortran,C,Compiler Construction,64 Bit,Fortran,我目前正在将32/64位上所有主要操作系统的BLAS/LAPACK(Fortran库)的本机绑定修改为Java库: 但是,我开始遇到一些问题,与UNIX/Windows世界和Fortran/C之间的数据类型差异有关 表和数据类型是非常非承诺的,因为它们的大小不同 Fortran和C的主要操作系统上的基本数据类型实践中是否存在所有位大小的规范源(或者我们可以通过引用权威源创建一个? 或者,至少在C类型方面是Fortran类型 i、 e.用以下列填充表格(开头有几列): (我不确定这是否正确) 在每

我目前正在将32/64位上所有主要操作系统的BLAS/LAPACK(Fortran库)的本机绑定修改为Java库:

但是,我开始遇到一些问题,与UNIX/Windows世界和Fortran/C之间的数据类型差异有关

表和数据类型是非常非承诺的,因为它们的大小不同

Fortran和C的主要操作系统上的基本数据类型实践中是否存在所有位大小的规范源(或者我们可以通过引用权威源创建一个?

或者,至少在C类型方面是Fortran类型

i、 e.用以下列填充表格(开头有几列):

(我不确定这是否正确)


在每个JDK附带的
jni_md.h
中,可以根据C原语查找Java类型。

您的方法有几个问题

  • 不一定是操作系统定义了这些长度;编译器在某些情况下也可以这样做

  • 在某些情况下,用户还可以更改默认长度。例如,许多Fortran编译器都有一个“r8”选项,该选项导致real的默认大小为8字节(对于gfortran,“-fdefault-real-8”)

  • BLAS/LAPACK被认为适用于单精度和双精度IEEE,而不管给定系统上数据类型的默认大小。因此,Fortran接口应始终使用4字节实数和8字节双精度,无论您使用的是什么系统。我认为文档中没有指定整数类型,但我强烈怀疑错误代码总是4字节,因为在一段时间内,几乎所有使用IEEE类型的Fortran实现都使用32位整数作为默认值。我认为一些C包装在技术上可能允许您在构建时更改返回代码的大小(或者使用系统/编译器默认值);您可能希望为Java绑定提供类似的选项


  • 正如@cup在评论中指出的,有一个标准。这给了我们一定程度的安慰(至少对于GCC来说),CBLAS/LAPACKE C API(使用基本C类型)中提到的映射可以通过该编译器跨架构移植。如问题中所述,这实际上是关于位大小的问题,而不是关于语言保证的抽象概念。i、 e

    • REAL
      ->
      float
    • 双精度
      ->
      双精度
    • INTEGER
      ->
      int
    • LOGICAL
      ->
      int
    然后由C来定义原语类型的字节大小,由jni_md.h来定义Java原语类型


    在实践中,这意味着唯一的中断是64位Windows上的
    long
    为32位(64位Linux上为64位),而
    jint
    是根据
    long
    定义的。因此,可以安全地忽略Windows构建期间的数据类型。

    与C标准一样,Fortran标准不定义语言固有数据类型的大小(以位为单位)。但是Fortran标准几乎不承认比特的存在。祝你好运,但是我认为你缺少了方程中的一个重要元素,即所使用的编译器(版本)。通常情况下,编译器的混合语言编程中包含了类似的内容。例如,在Silverfrost中,它处于混合语言编程/数据类型/基本数据类型下。在旧的ps4(可能还有DVF、CVF和IVF)编译器上,它由程序员指导/使用混合语言编程。不能相信Windows整数是16位的,或者这是一个确保我们读取所有内容的技巧。哈哈,如果你使用的是更高版本的Fortran,他们有ISO_C_绑定,理论上应该是正确的大小。这非常依赖于供应商。例如,IVF+MSC可能与Windows上的gcc/gfortran非常不同。没有通用的ISO_C_绑定,所有这些都会告诉您,特定Fortran实现的种类编号对应于“伴生”C实现中选定的类型。不要错误地认为种类号是字节大小。有时依赖于实现,有时不依赖于实现。Fortran integer ISO_C_BINDING
    kind=C_INT
    将与C
    INT
    相同,但这不会告诉您这些类型有多少字节。如果您使用
    kind=C_INT32_T
    匹配C类型
    INT32_T
    ,您将在Fortran和C中都有一个32字节的整数。但是知道这一点并不能神奇地告诉您Fortran源代码中声明为
    integer
    real
    的变量的大小。如果需要此控件,则需要重写Fortran源代码或编写其声明使用特定类型的粘合接口例程,然后调用库代码。BLAS/LAPACK例程由CBLAS和LAPACKE在C中定义为float/double。这是官方的C API,它不赞成CLAPACK翻译。至于你的其他观点,这就是我在实践中明确要求大小的原因。我的观点是,你应该根据你正在使用的库的规范而不是它所在的系统来编写绑定。您也没有指定是与CBLAS/LAPACKE接口,还是与Fortran 77代码接口(通常使用显式字节计数),或者您是否也在尝试在某些机器上允许扩展精度。无论如何,C的浮点/双精度在几乎所有现代系统上都将是IEEE单精度/双精度,尽管整数大小确实会改变。(与上表不同,在Linux x86_64上,浮点值仍然是32位。)我不知道你要去哪里,也不知道为什么这些都是相关的。如果问题中的数字有误,请更新
    OS      ARCH    Language Type             Bits
    Linux   x86_64  C        int              32
    Linux   x86_64  C        long             64
    Linux   x86_64  C        float            32
    Linux   x86_64  C        double           64
    Linux   x86_64  Fortran  LOGICAL          32
    Linux   x86_64  Fortran  INTEGER          32
    Linux   x86_64  Fortran  REAL             32
    Linux   x86_64  Fortran  DOUBLE PRECISION 64
    Linux   x86_64  Java JNI jint             32
    Windows x86_64  Fortran  INTEGER          32
    Windows x86_64  Java JNI jint             64
    ...