2014-04-09 41 views
0

我在C++中使用三維數組指針遇到了一些困難。我一直的一個Q[3][N][N]數組,我想傳遞給函數在[0][i][j]位置打印的值(和也爲[1][i][j][2][i][j]).我怎樣才能做到這一點呢?是更方便地使用Q[i][j][0]等?如何通過C++中的指針來處理3D數組

爲2D,當我給下面這段代碼只是正常& Q [0] [0]到* VAR:

template <typename T> 
void print2d(T *var, int I, int J){ 
cout << endl; 
for (int j = 0; j < J; j++){ 
    for (int i = 0; i < I; i++){ 
     cout << setprecision(3) << setw(12) << *(var + (N*i + j)); 
    } 
    cout << endl; 
} 
cout << endl; 
} 

我用同樣的方法來編寫3D類似的功能,不寫出正確的值: 任何人都可以讓我知道指向正確地址的正確方法Q[i][j][1]。在輸入參數中,我給出了Q [0] [0] [0]的地址。如果我想寫出特定的k值,我應該使用不同的地址(如Q [i] [j] [1])嗎?

template <typename T> 
void print3d(T *var, int I, int J, int K){ 
    cout << endl; 
     for (int j = 0; j < J; j++){ 
      for (int i = 0; i < I; i++){ 
       cout << setprecision(3) << setw(12) << *(var + I*J*i + I*j + K); 
      } 
      cout << endl; 
     } 
    cout << endl; 
} 
+1

究竟是什麼「困難」?我們無法幫助解決沒有信息的問題。 – Avery

+0

我想寫一個關於i(或k)的Q [i] [j] [k]。 – Pranav

+0

'N'編譯時間是否已修復? – WhozCraig

回答

0

示例示例中,N必須是常量。 但是考慮使用矢量。

#include <stdio.h> 
#include <iostream> 
using namespace std; 
const int N = 5; 

void func2(int* tab, int A, int B, int C) 
{ 
    printf("%d\n", tab[N*N*A + N*B + C]); 
} 

void func(int tab[3][N][N]) 
{ 
    for (int i = 0; i < 3; ++i) 
    for (int j = 0; j < N; ++j, printf("\n")) 
    for (int k = 0; k < N; ++k) 
    { 
     printf("%d ", tab[i][j][k]); 
    } 
} 
int main() 
{ 
    int tab[3][N][N]; 
    int p = 0; 
    for (int i = 0; i < 3; ++i) 
    for (int j = 0; j < N; ++j) 
    for (int k = 0; k < N; ++k) 
    { 
     tab[i][j][k] = p++; 
    } 
    func(tab); 
    printf("\n"); 
    func2((int*)tab, 1, 1, 3); 
} 
+0

可以func在不同的文件?我想你正在傳遞一個完整的數組,對嗎?我怎樣才能用指針實現這一點? – Pranav

+0

我更新了一個例子。 func2並不是那麼美麗,它比假設是連續的內存塊。 (在動態分配數組的指針中,它不是真的) – AdamF

+0

在這個例子中,你可以使用模板參數來表示'func'的數組維度,而不是'N',這樣你就可以支持不同大小的數組。 –

0

我同意亞當的回答,但不能評論,需要更多的點。 1)數組不是指針。多維數組不能通過指針傳遞,需要除了一個維以外都有一個常量。這是幫助理解的答案。

Cannot cast array to pointer

How do I pass a reference to a two-dimensional array to a function?

http://www.cplusplus.com/forum/articles/17108/

你可能想嘗試從STL向量來代替。

2)模板只有在使用它的實例時才被編譯,這就是爲什麼它的聲明和用法通常放在一個文件中的原因。 Template Compilation

+0

我同意向量可能比數組方便使用,但是我的程序需要大量的計算(類似的matlab程序需要大約6小時)。我讀到矢量的便利性是以我想要避免的性能價格爲代價的。請讓我知道,如果我錯了。 – Pranav

+0

矢量矢量不使用連續存儲,因此它可能不適合作爲多維數組的替代品。然而,無論如何,使用1-D數組的語法並不是那麼戲劇化,而是通過計算偏移來找到你想要的元素。 –