【问题标题】:C/Fortran 2D arrays (basic)C/Fortran 二维数组(基本)
【发布时间】:2013-12-01 19:36:02
【问题描述】:

我有几个关于二维数组的基本问题,例如:

double bn[NNODES][NBASIS]

1-C 中的声明如何?在 Fortran 中呢?

2-第一个 [] 是行号,第二个是列号,C 和 Fortran 都是?

3- 使用 bn 时,例如bn[i][j],“i”索引用于行,“j”用于列?在 C 和 Fortran 中都可以吗?

4- 仅针对一个(例如 i=15)和整行的写入/打印功能(针对 C 和 Fortran)如何?

谢谢

【问题讨论】:

  • 这看起来像是开始编程课程的问题。这里不是解决你的编程类问题的地方。

标签: c arrays fortran


【解决方案1】:

其中一些示例是用于掩盖一个问题的方阵。 C 和 Fortran 对多维数组使用不同的内存布局。 C 是行优先的,而 Fortran 是列优先的。见http://en.wikipedia.org/wiki/Row-major_order。在语言之间工作时,在声明中处理这个问题会很方便,例如,在 C 中:

double array [20][10];

在 Fortran 中,使用 iso_c_binding 内部模块:

real (C_DOUBLE), dimension (10,20) :: array

【讨论】:

    【解决方案2】:

    1-C 中的声明如何?在 Fortran 中呢?

    在 C 中,您可以这样声明一个静态数组:int arr[row][col];

    2-第一个 [] 是行号,第二个是列号,C 和 Fortran 都是?

    将二维数组的第一个或第二个下标视为行或列下标并不重要。重要的是你要保持在界限内。 arr[0][0]arr[row - 1][col - 1]

    3- 使用 bn 时,例如bn[i][j],“i”索引用于行,“j”用于列?在 C 和 Fortran 中都可以吗?

    见答案 2。

    4- 仅针对一个(例如 i=15)和整行的写入/打印功能(针对 C 和 Fortran)如何?

    使用for 循环访问数组中的单个行或列。例如,要访问第 0 行中的所有元素:

    for(int c = 0; c < col; ++)
        printf("%d\n", arr[0][c]); 
    

    【讨论】:

    • @VladimirF 当然,如果您编写的东西需要与其他人的二维数组实现兼容,这很重要,但问题是 [row] 和 [column] 下标是否一成不变与否。
    • 不是别人的,MATMUL 是在 Fortran 标准中定义的。
    【解决方案3】:

    1-C 中的声明如何?在 FORTRAN 中?

    在 C 中

    double bn[10][10];  
    

    在 FORTRAN 中

    double precision bn(10, 10)  
    

    2-第一个 [] 用于行号,第二个用于列号,用于 C 和 Fortran?

    是的。

    3- 使用 bn 时,例如bn[i][j],“i”索引用于行,“j”用于列?在 C 和 Fortran 中?

    是的。

    4- 仅针对一个(例如 i=15)和整行的写入/打印功能(针对 C 和 Fortran)如何?

    在 FORTRAN 中

    do, i=1:10
        do, j=1:10
            write (*,*) bn(i,j)
        enddo
    enddo 
    

    在 C 中

    for(i = 0; i < 10, i++)
        for(i = 0; i < 10, i++)  
              printf("%f", bn[i][j]);
    

    【讨论】:

    • double precision bn(10)(10) - 不多,试试double precision bn(10,10)。并且打印行 i write(*,*) bn(i,:) 就足够了,不需要跨列循环。
    • @HighPerformanceMark;那是一个错字。是的,对于固定行,您可以这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多