函数无理由地使参数无效

时间:2013-12-14 21:21:17

标签: c++ function

我正在为编程课程编写第一个“大”作业。程序应该通过包含坐标的矢量并找到三角形的最大可能周长。我几乎完成了它,当我遇到问题时我已经庆祝了。处理整个事物的函数使包含点索引的整数无效。这是有问题的功能:

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(我知道很棒的命名)都变为零,我无法输出最大周长点。 我已经盯着它看了几个小时,谷歌搜索更多,我仍然无法弄清楚问题。有人请帮帮忙。

2 个答案:

答案 0 :(得分:2)

C ++是一种按值调用的语言。这意味着,对函数参数的修改通常仅在函数执行期间可见。这就是你的同意

的原因
PointMaxi=i;
PointMaxj=j;
PointMaxk=k;
一旦函数返回,

就会丢失。

C ++还可以通过将&附加到参数列表中的数据类型来使用call-by-reference。在这种情况下,函数签名将是

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

,您的作业效果将在调用函数中显示。

或者,您可以定义一个由double和三个int组成的结构,并将其用作处理函数的返回类型。

答案 1 :(得分: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)以通过引用传递,以便修改原件。