为什么FORTRAN程序中的函数名不一样?我会在两个程序中使用相同的名称,但也许这与 FORTRAN 相关。我将使用您为此答案编写的 C 函数名称,是的,我同意这对于初学者来说是一项艰巨的任务。这不是一个完整的解决方案,但应该引导您朝着正确的方向前进(希望如此)。首先... C 中的数组具有在编译时确定的固定维度。所以你的函数声明不会编译。如果您的意图是取消引用数组维度参数中的维度指针,这将不起作用,因为它不是可执行代码;这些是仅用于编译的参数声明。
其次,您似乎希望将具有不同维度的数组从一个调用传递到另一个调用,或者您事先不知道数组中有多少元素。假设这一点,您只需要传递数组的地址(假设您的尺寸总是正确的)。你的函数原型可以是:
void cuda_(int *idim, int *jdim, int *kdim, float *U, float* V, float* W);
您的函数可以实现如下(以便向您展示指针算法):
void cuda_(int *idim, int *jdim, int *kdim, float* U, float* V, float* W)
{
int i, j, k;
// Assuming you want to process each individual array
// items one after the other; this to show pointer arithmetic
for (i=0; i<*idim; i++) {
for (j=0; j<*jdim; j++) {
for (k=0; k<*kdim; k++) {
// Do whatever with the i,j,kth element;
// We assign unique values so you can check
// that this example accesses the right array elements
*(U + i * sizeof(float) + j * sizeof(float) + k) = i + j + k;
*(V + i * sizeof(float) + j * sizeof(float) + k) = 2*i + 2*j + 2*k;
*(W + i * sizeof(float) + j * sizeof(float) + k) = 3*i + 3*j + 3*k;
}
}
}
return;
}
当然,您需要彻底测试这个示例,以确保这是您真正想要做的,并且我确实正确地映射了 3D 数组(我将它映射到一维数组上,假设它是这样的在您的 FORTRAN 程序中实现;否则,您将不得不提出正确的指针算法,但原理与示例中的相同)。我对这段代码进行了非常肤浅的测试,并被警告指针操作很棘手且容易出错!祝你好运。
现在,这是次要的,但我觉得应该说明这一点。我不明白为什么要将数组维度作为指针传递;也许这是 FORTRAN 的要求(也就是说,您可能无法通过值/副本传递参数)。如果您可以通过复制(而不是通过引用)传递参数,那么我建议进行以下更改:
// Prototype:
void cuda_(int idim, int jdim, int kdim, float* U, float* V, float* W);
// Implementation:
void cuda_(int idim, int jdim, int kdim, float* U, float* V, float* W)
{
int i, j, k;
for (i=0; i<idim; i++) {
for (j=0; j<jdim; j++) {
for (k=0; k<kdim; k++) {
*(U + i * sizeof(float) + j * sizeof(float) + k) = i + j + k;
*(V + i * sizeof(float) + j * sizeof(float) + k) = 2*i + 2*j + 2*k;
*(W + i * sizeof(float) + j * sizeof(float) + k) = 3*i + 3*j + 3*k;
}
}
}
}