2013-11-20 91 views
0

我有一個分配訪問值,需要以下內容:爲行和列C++ - 在動態數組

-Take命令行輸入並動態地創建填充有隨機數

- 創建2-d陣列一個名爲find_greatest_product的函數來查找數組中四個相鄰 數字的最大乘積。四個相鄰的數字可以是陣列中游戲「俄羅斯方塊」中發現的形狀 的任何配置。您的功能需要返回最大產品,使用結構開始 位置,形狀和四個數字的方向。

是的,這是純粹用於練習二維數組的完全無用的程序。

我已經創建了我的數組,所以我開始使用最簡單的形狀:盒子。但是,當我嘗試訪問包含隨機數的數組時,產品和因素似乎都是0.任何暗示爲什麼我無法訪問隨機數陣列中的整數來查找產品?相關的代碼位如下。你可以假設這裏沒有複製的所有函數都能正常工作

struct shape { 
    int highest; 
    int factors[4]; 
    int startRow; 
    int startColumn; 
} tShape, sShape, iShape, boxShape; 


int main(int argc, char* argv[]) { 

    if(argc == 5) { 
      for(int i = 1; i < argc; i++) { 
      rows = getArg(argc, argv, i, compare1); 
      } 
      for(int i = 1; i < argc; i++) { 
      columns = getArg(argc, argv, i, compare2); 
      } 
    } 

    int ** array = new int*[rows]; 

    int i, j; 
    for (i = 0; i < rows; i++) { 
      array[i] = new int[columns]; 
    } 

    create_array(array, rows, columns); 

    for (int i = 0; i < rows; i++) { 
      for (int j = 0; j < columns; j++) { 
        cout << array[i][j]; 
        cout << " "; 
      } 
    cout << endl; 
    } 

    boxProduct(array, rows, columns, boxShape); 

    cout << boxShape.highest << endl; 

    for (int i = 0; i < 4; i++) { 
      cout << boxShape.factors[i]; 
      cout << " "; 
    } 
    cout << endl; 

    return 0; 
} 

void boxProduct(int *array[], int rows, int columns, shape boxShape) { 

    int highest = 0; 
    int product = 0; 

    for (int i = 0; i < rows - 1; i++) { 
      for (int j = 0; j < columns - 1; j++) { 
        product = (array[i][j]*array[i][j+1]*array[i+1][j]*array[i+1][j+1]); 
        if (product > highest) { 
          boxShape.highest = product; 
          boxShape.factors[0] = array[i][j]; 
          boxShape.factors[1] = array[i][j+1]; 
          boxShape.factors[2] = array[i+1][j]; 
          boxShape.factors[3] = array[i+1][j+1]; 
        } 
      } 
    } 
} 

這裏是與基質的樣本輸出端10行×5列:

27 86 4 41 44 
17 6 5 40 32 
42 58 14 95 53 
8 28 95 27 91 
63 22 27 49 2 
38 37 39 37 76 
9 17 14 13 10 
10 30 16 67 22 
49 10 33 63 5 
86 71 86 34 50 
0 <- product 
0 0 0 0 <- the four factors 
+4

您正在修改boxProduct函數中'shape boxShape'的副本,因此看不到更改 – doctorlove

回答

1

C和C++函數是呼叫由值默認不呼叫通過引用。也就是說,編譯器將參數的副本提供給函數,如果函數修改了它的參數,它將修改一個副本。

考慮這個例子:

void foo(int x) 
{ 
    x++; // increments foo's own local copy of 'x' 
} 

int main() 
{ 
    i = 42; 
    cout << i << endl; // prints 42 
    foo(i); 
    cout << i << endl; // ALSO prints 42! 

    return 0; 
} 

這將打印42兩次,因爲foo修改副本。

如果稍微修改代碼,則告訴C++編譯器通過引用傳遞參數。 (注意:這是一個C++只是特徵;它不C.工作)現在,任何修改函數內部的參數將修改值呼叫者認爲也:

void foo(int& x) // The & means "pass this parameter by reference" 
{ 
    x++; 
} 

int main() 
{ 
    i = 42; 
    cout << i << endl; // prints 42 
    foo(i); 
    cout << i << endl; // prints 43 

    return 0; 
} 

的另一種方法來修改調用者持有的值是傳遞一個指向該值的指針,而不是值本身。這仍然是,但在這種情況下,您傳遞函數的值是一個指針。例如:

void foo(int* x) // x is now a pointer to integer 
{ 
    (*x)++; // The (*x) dereferences the pointer. What happens if you leave off the parens? 
} 

int main() 
{ 
    i = 42; 
    cout << i << endl; // prints 42 
    foo(&i);   // the & there takes the address of 'i' and passes that to foo() 
    cout << i << endl; // prints 43 

    return 0; 
} 

因爲C不支持的call-by-參考參數,它需要這最後的方案。一些C++代碼也以這種方式使用指針。現代C++風格傾向於儘可能避免裸指針,但你仍會不時看到指針。

Punchline:你會想將這些知識應用到你的shape boxShape結構上面。您要麼通過引用傳遞shape boxShape,要麼傳遞一個指向shape boxShape的指針。這兩種方法都是有效的方法,儘管C++傾向於通過引用。