2013-12-14 183 views
0

我正在爲編程類寫第一個'大'作業。程序應該通過一個包含座標的矢量並找到三角形的最大可能邊界。我已經差不多完成了,並且在遇到問題時已經開始慶祝了。處理整個事情的函數會使包含點索引的整數無效。這裏是有問題的功能:函數無效的參數無效

double Process (vector<vector<int>> &vec,int PointMaxi,int PointMaxj, int PointMaxk) 
{ 
    double MaxP; 
    int i=0,j=0,k=0; 
    PointMaxi=0;PointMaxj=1;PointMaxk=2; 
    MaxP=Perimeter(0,1,2,vec); 
    int size=vec.size(); 
    while(i<size) 
    { 
     while (j<size) 
     { 
      while (k<size) 
      { 
       if(((i!=j)&&(j!=k))&&Perimeter(i,j,k,vec)>=MaxP) 
       { 
        MaxP=Perimeter(i,j,k,vec); 
        PointMaxi=i; 
        PointMaxj=j; 
        PointMaxk=k; 
       } 
       k++; 
      } 
      k=0; 
      j++; 
     } 
     j=0; 
     i++; 
    } 
    return MaxP; 
} 

所以,當函數退出PointMaxi,PointMaxj和PointMaxk(偉大的命名,我知道)全部變成零,我可以最大周長的不輸出點。 我一直在盯着它幾個小時,搜索甚至更多,我仍然無法找出問題。有人請幫忙。

+3

請格式化您的代碼。 – asm

+2

通過它們作爲參考 – qwr

+1

作爲qwr寫道:原型應該是:'雙過程(向量>&vec,int&PointMaxi,int&PointMaxj,int&PointMaxk)''不像你所做的那樣。 – SHR

回答

2

C++是一種按價值調用的語言。這意味着,對函數參數的修改通常僅在函數執行期間可見。這就是爲什麼你的assignements

PointMaxi=i; 
PointMaxj=j; 
PointMaxk=k; 

一旦函數返回,將丟失。

C++也可以通過將&附加到參數列表中的數據類型來使用call-by-reference。在這種情況下,函數簽名將爲

double Process (vector<vector<int>>& vec, 
       int& PointMaxi, 
       int& PointMaxj, 
       int& PointMaxk) 

並且您的分配的效果將在調用函數中可見。

或者,您可以定義由double和三個int組成的stuct,並將其用作處理函數的返回類型。

0

正如Oswald提到的那樣,有兩種方法可以通過值和引用在C++中傳遞參數。直覺是,當一個參數通過引用傳遞時,它是複製並且副本被傳遞給該函數,所以你不能改變原來的。通過引用傳遞的直覺是,原件傳遞給函數而不復制,以便您可以更改原件。例如,運行以下代碼並檢查輸出。

#include <iostream> 

using namespace std; 

// i is passed by value, j is passed by reference using the '&' operator. 
void value_and_reference(int i, int &j) { 
    i = 10; 
    j = 20; 
} 

int main() { 

    int i = 0, j = 0; 
    value_and_reference(i, j); 
    cout << "i : " << i << endl; // Prints 0 
    cout << "j : " << j << endl; // Prints 20 
    return 0; 
} 

你需要改變你的輸出參數(PointMaxiPointMaxjPointMaxk)通過引用傳遞所以原稿得到修改。