我正在为编程课程编写第一个“大”作业。程序应该通过包含坐标的矢量并找到三角形的最大可能周长。我几乎完成了它,当我遇到问题时我已经庆祝了。处理整个事物的函数使包含点索引的整数无效。这是有问题的功能:
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(我知道很棒的命名)都变为零,我无法输出最大周长点。 我已经盯着它看了几个小时,谷歌搜索更多,我仍然无法弄清楚问题。有人请帮帮忙。
答案 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;
}
您需要更改输出参数(PointMaxi
,PointMaxj
,PointMaxk
)以通过引用传递,以便修改原件。