2015-04-02 119 views
0

我需要編寫一個程序,該程序首先按順序計算矩陣中的值,然後使用openCL並行計算值。將未知大小的多維數組傳遞給函數

這是因爲我已經做了在常規的C(使用MPI)我想要簡單的功能initializeMatrix和printMatrix和喜歡同樣的事情

在C我用來做這個很簡單:

// Matrix initialization 
void initMatrix(size_t M, size_t N, double (*matrix)[M][N][2]) 
{ 
    int i, j; 
    for (j = 0; j < N; ++j) 
    { 
     for (i = 0; i < M; ++i) 
     { 
      (*matrix)[i][j][0] = (double)((i * (M - i - 1)) * (j * (N - j - 1))); 
      (*matrix)[i][j][1] = (*matrix)[i][j][0]; 
     } 
    } 
    printf("Matrix has been initialized\n"); 
} 

我看到這個讓我的錯誤在C++中,因爲編譯器想知道,在編譯時數組(在M和N尺寸的大小作爲參數傳遞給程序,所以我不知道在編譯時)。

如何在C++中執行此操作?

我正在考慮使用載體,但我不知道這是否是一個好主意,因爲我將不得不使用OpenCL的庫

回答

2

您可以通過模板通過引用傳遞/常引用數組:

#include <iostream> 
#include <cstddef> // for std::size_t 

template <typename T, int M, int N, int P> 
void f(T (&arr)[M][N][P]) // accepts 3-D arrays of arbitrary types 
{ 
    std::cout << "Size: " << M << " x " << N << " x " << P; 
} 

int main() 
{ 
    const std::size_t M = 2; 
    const std::size_t N = 3; 
    double arr[M][N][4]; 
    f(arr); 
} 
+0

對我來說,它看起來像'double mat [M] [N] [2]'其中M和N是const size_t,但它給我錯誤 – dominicbri7 2015-04-02 17:27:11

+0

@ dominicbri7'M'和'N'必須編譯 - 時間常量(不是通過'const'傳遞的函數的參數)。它應該工作,看到更新的編輯。 – vsoftco 2015-04-02 17:29:11

+0

就是這樣,正如我在我的問題中提到的M和N尺寸必須作爲參數傳遞給程序,我必須處理每個尺寸給出的任何尺寸(從3到10000) – dominicbri7 2015-04-02 17:35:57