2017-08-07 394 views
0

我正在研究解決經濟學模型的程序。首先,我聲明瞭一個命名空間如下:C++通過引用函數傳遞數組,但內容保持不變

namespace myNameSpace 
{ 
    const int d1{10}; 
    const int d2{5}; 
    const int d3{7}; 
    double array[d1][d2][d3]={}; 
} 

然後,我有修改array功能:

void doSomething(double (&array)[myNameSpace::d1][myNameSpace::d2][myNameSpace::d3]) 
{ 
    int i,j,k; 
    for (i=0, j=0, k=0; i<myNameSpace::d1,j<myNameSpace::d2,k<myNameSpace::d3; i++,j++,k++) 
     array[i][j][k]=i+j+k+1.0; 
} 

在主函數中我打電話doSomething爲:

int main() 
{ 
    doSomething(myNameSpace::array); 
    for (int i=0;j<myNameSpace::d1;j++) 
     std::cout << myNameSpace::array[i][1][1] << std::endl; 
} 

的輸出我得到的控制檯是:

0 
0 
0 

你能提供這方面的指導嗎?我試過通過array而沒有地址 - 運營商&,但後來doSomething,array損失第一維。任何幫助將不勝感激!

+3

'爲( int i = 0; j ikleschenkov

+2

您需要提出警告。 [你的編譯器應該告訴你你的代碼沒有做你認爲它是](http://coliru.stacked-crooked.com/a/cde7b40f4cda6b72) – NathanOliver

+0

'for(int i = 0; j PaulMcKenzie

回答

0

我試圖編譯你的代碼,我在此行得到了一個錯誤:

for (int i=0;j<myNameSpace::d1;j++) 

變量j是未申報。正如你可以注意到,你聲明的變量ifor循環中,而不是j。你想循環使用i還是j? ...也許它是i,因爲在循環體內,你使用它作爲第一維索引?

那麼,也許你的意思是這個代碼?

for (int i = 0; i < myNameSpace::d1; i++) 
    std::cout << myNameSpace::array[i][1][1] << std::endl; 

另外,你確定doSomething裏面的循環是否代表你的意思?

也許你想循環使用三個嵌套循環爲每個數組維度? 例如爲:

void doSomething(double (&array)[myNameSpace::d1][myNameSpace::d2][myNameSpace::d3]) 
{ 
    for (int i = 0; i < myNameSpace::d1; i++) { 
     for (int j = 0; j < myNameSpace::d2; j++) { 
      for (int k = 0; k < myNameSpace::d3; k++) { 
       array[i][j][k] = i + j + k + 1.0; 
      } 
     } 
    } 
} 

注意,在C++原始陣列通過引用傳遞,所以&array語法是不必要的。此外,編譯器還會忽略數組參數的原始數組維數(myNameSpace::d1等)。儘管如此,這些可能對文檔有好處。

+0

'array ,d2>,d1>'是更好的 – Swift

0

如果陣列與尺寸宣佈它的方式縮短(和可讀性)寫:

void doSomething(declspec(myNameSpace::array) &array) 

或更好的申報類型別名到處使用它:

using myArrayType = double[myNameSpace::d1][myNameSpace::d2][myNameSpace::d3]; 

更不用說那d1,d2和d3應該是const。 Toset陣列中的所有元素的循環應該是這樣的:寫在單一的以逗號分隔

void doSomething(myArrayType &array) 
{ 
    int i,j,k; 
    for (i = 0; i < myNameSpace::d1; i++) 
    for (j = 0; j < myNameSpace::d2; j++) 
     for (k = 0; k < myNameSpace::d3; k++) 
     array[i][j][k]=i+j+k+1.0; 
} 

一切都在一個迭代發生。有一些變態的方法可以將它寫入單個for()中,但我不建議使用該代碼。 for()循環非常靈活。幾乎是它看起來像

for(expressionFirst; expressionCheck; expressionEach) 
    statement to execute 

expressionFirst可以是任何陳述或一個聲明,它也只能執行一次循環開始之前。 expressionCheck在每次迭代開始時執行,它必須是上下文可轉換爲bool的任何表達式(即,如果在此情況下甚至可應用explicit T::operator bool() const;),如果它返回false,則循環停止。 表達式每個是在每次迭代結束時評估的任何表達式。

等效爲()

{ 
    expressionFirst 
    while (expressionCheck) 
    { 
    statement to execute 
    expressionEach; 
    } 
} 

所有表達式都是可選的,所以你可以使用for(;;) - 一個 「永遠」 的循環。

您使用的逗號運算符允許對幾個表達式進行排序,只有最後一個返回結果。因此它被稱爲序列運算符。這就是你的循環錯誤的原因。

而你在主函數中有一個輸入錯誤,導致你只打印數組的第一個元素,沒有增加i

0

開始時,您的循環有問題 初始化i並在j上運行。一旦我改變了它,我收到了一些值。

2

首先,你for循環

for (i=0, j=0, k=0; i<myNameSpace::d1,j<myNameSpace::d2,k<myNameSpace::d3; i++,j++,k++) 

不會做你認爲它,你會一直(希望)注意到,如果你有警告(警告編譯:關係比較結果未使用)。

它有2個相關的主要問題:

  1. 由於i<myNameSpace::d1,j<myNameSpace::d2,k<myNameSpace::d3只返回最後一個比較的價值,由於comma operator被使用。所以,你有效地迭代,直到k<myNameSpace::d3
  2. 您編寫的for循環 - 僅僅是一個循環。它不會遍歷所有可能的i,jk值的組合,正如您可能想要的那樣。

    它將i,j,k初始化爲0;檢查比較表達式(如(1)所解釋的僅檢查值k);而在循環的代碼後,運行 - 增量i所有jk 1。所以 - 你只設置0/0/01/1/12/2/2...,你的陣列,直到k/k/k指數。而且,因爲你的中間數組有一個界限,小於k - 你可以通過跳出界限來調用未定義的行爲。

而且,最後,你只打印出i/1/1索引你的陣列,並因爲在索引範圍0/1/1只有一個值 - 這就是設置d1/1/11/1/1 - 這是exactly什麼印有非零值。

要遍歷整個數組,如,可能是你的意圖 - 你應該使用嵌套循環,所以他們將允許所有的循環變量的改變彼此獨立地:

for (i=0; i<myNameSpace::d1; i++) 
    { 
    for (j=0; j<myNameSpace::d2; j++) 
     { 
     for (k=0; k<myNameSpace::d3; k++) 
      { 
      array[i][j][k]=i+j+k+1.0; 
      } 
     } 
    } 
+0

非常感謝您的支持!超清晰! –