C++ 函数在没有明显原因的情况下使参数无效

C++ 函数在没有明显原因的情况下使参数无效,c++,function,C++,Function,我正在为编程课写我的第一个“大”作业。程序应该遍历包含坐标的向量,并找到三角形的最大可能周长。我几乎做到了,当我遇到问题时,我已经在庆祝了。处理整个事件的函数会使包含点索引的整数无效。下面是有问题的函数: double Process (vector<vector<int>> &vec,int PointMaxi,int PointMaxj, int PointMaxk) { double MaxP; int i=0,j=0,k=0; Po

我正在为编程课写我的第一个“大”作业。程序应该遍历包含坐标的向量,并找到三角形的最大可能周长。我几乎做到了,当我遇到问题时,我已经在庆祝了。处理整个事件的函数会使包含点索引的整数无效。下面是有问题的函数:

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;
 }
double进程(vector&vec、int-PointMaxi、int-PointMaxj、int-PointMaxk)
{
双最大值;
int i=0,j=0,k=0;
PointMaxi=0;PointMaxj=1;PointMaxk=2;
MaxP=周长(0,1,2,vec);
int size=vec.size();

而(iC++是一种按值调用语言。这意味着,对函数参数的修改通常只在函数执行期间可见。这就是赋值的原因

PointMaxi=i;
PointMaxj=j;
PointMaxk=k;
函数返回后将丢失

C++还可以通过向参数列表中的数据类型追加
&
来使用引用调用

double Process (vector<vector<int>>& vec,
                int& PointMaxi,
                int& PointMaxj,
                int& PointMaxk)
双过程(向量和向量,
int&PointMaxi,
int&PointMaxj,
int&PointMaxk)
赋值的效果将在调用函数中可见


可选地,可以定义一个由<代码>双< />代码>三代码> int >代码>组成的SUCUT,并将其用作处理函数的返回类型。

< P>奥斯瓦尔德提到,C++中有两种传递参数的方法,即按值和引用方式。opy被传递给函数,因此您无法更改原始文件。通过引用传递的直觉是,原始文件被传递给函数而不进行复制,因此您可以更改原始文件。例如,运行以下代码并检查输出

#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;
}
#包括
使用名称空间std;
//i通过值传递,j通过使用“&”运算符的引用传递。
无效值和参考值(int i、int&j){
i=10;
j=20;
}
int main(){
int i=0,j=0;
值和参考值(i,j);

请格式化您的代码。将它们作为参考传递qwr写道:原型应该是:
double Process(vector&vec,int&PointMaxi,int&PointMaxj,int&PointMaxk)
不像您那样按值计算。您的整数向量向量可能只是整数向量吗?@trojansdestroy不,内部向量表示多边形,外部向量表示多边形列表。封装性差,但在讨论这些问题之前,让他先放松一下。