gpt4 book ai didi

c - 正确地将多维 C 数组传递给 fortran,以便 size 函数(在 fortran 中)在每个维度中获得正确的大小?

转载 作者:太空宇宙 更新时间:2023-11-04 02:44:16 25 4
gpt4 key购买 nike

我有一个像这样的 fortran 子例程,它需要一个 3d 数组并打印每个维度的大小:

subroutine printarray(arr)
real*8 :: arr(:,:,:)

print*, "Dimensions of arr -> ", size(arr(:,1,1)), size(arr(1,:,1)), size(arr(1,1,:))

end subroutine printarray

现在我想将 3d 数组从 C 程序传递到此子例程。

我尝试了很多方法,但都没有用。

尝试 1:

#include <stdio.h>
#include <stdlib.h>

void printarray_(double *);

int main(int argc, char *argv[])
{
double *ap;

ap = (double *) malloc(sizeof(double) * 10 * 10 * 2);
printarray_(ap);

if(ap != NULL)
free(ap);
return 0;
}

输出是:1 1 1

这里的一个问题是我没有在我的 C 代码本身中明确指定每个维度的大小,所以我不能指望 Fortran 能够解决这个问题。所以我尝试了不同的方法:

尝试 2:

#include <stdio.h>
#include <stdlib.h>

void printarray_(double ***);

int main(int argc, char *argv[])
{
int i;
int j;
double ***a;
a = (double ***) malloc(sizeof(double **) * 200);
for(i = 0;i < 10;i++)
{
a[i] = (double **) malloc(sizeof(double *) * 10);
for(j = 0;j < 10;j++)
{
a[i][j] = (double *) malloc(sizeof(double) * 2);
}
}

printarray_(a);

for(i = 0; i < 10;i++)
{
for(j = 0;j < 10;j++)
{
if(a[i][j] != NULL)
free(a[i][j]);
}
if(a[i] != NULL)
free(a[i]);
}
if(a != NULL)
free(a);
return 0;
}

这里,输出是:289 289 1

将多维数组从 C 程序传递到 Fortran 子例程的正确方法是什么,以便 Fortran 中的 size 函数获取每个维度的正确大小?

最佳答案

你不能在 C 中这样做,因为 C 中的数组在函数调用期间会退化为指针。

有几种方法可以做到这一点: Function parameter as array with declared size

但最好和最常见的做法仍然是将维度作为单独的输入传递,同时传递起始元素的地址,让子程序自行计算其余部分。

您的第二次尝试很危险,因为维度不连续,但您的函数可能期望/假设它是连续的。

关于c - 正确地将多维 C 数组传递给 fortran,以便 size 函数(在 fortran 中)在每个维度中获得正确的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28979127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com