爲什麼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程序中的實現方式;否則,你將不得不出現與適當的指針arithmitic,但原則將與例子相同)。我對這段代碼做了很膚淺的測試,並被警告指針操作很棘手,容易出錯!祝你好運。
現在,這是次要的,但我覺得應該提出這一點。我不明白你爲什麼要傳遞數組維度作爲指針;也許這是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;
}
}
}
}
編程新手?新增Fortran和C以及指針和malloc和free?這是很多要問的。 – duffymo
很可能是http://stackoverflow.com/questions/27582715/passing-a-two-dimentional-array-from-fortran-to-c –
的重複如果你是新手編程學習走路,然後纔可以慢跑。學習如何在選擇的語言中傳遞參數/參數,然後學習如何在C和Fortran之間傳遞實體,然後才能將CUDA添加到混合中。從長遠來看,這將爲您節省很多痛苦。 –