我目前难以处理涉及函数的函数问题,该函数遍历2列数组的第一列以查找最小值,然后返回指向具有最小值的元素的指针。那部分不是太糟糕,但我的问题是:
cout<<"The minimum travel time is "<<*minimumTravelTime(travelTime)<<endl; //Prints minimum travel time
//FIX THIS PART
methodDeterminator = (*minimumTravelTime(travelTime))++;
cout<<"THE CASE IS "<<methodDeterminator<<endl;
//FIX THIS PART
switch(methodDeterminator)
{
case 0: transportMethod = "transporter";
break;
case 1: transportMethod = "stargate";
break;
case 2: transportMethod = "Alcubierre drive";
break;
case 3: transportMethod = "hyperdrive";
break;
case 4: transportMethod = "TARDIS";
break;
default: cout<<"Error. Could not find transport mode."<<endl;
}
cout<<"Travel by "<<transportMethod<<" will take "<<*minimumTravelTime(travelTime)<<" months."<<endl; //Prints travel method and time
找到最短时间的功能在这里
int *minimumTravelTime(int travelArray[][2])
{
int *pMinimum; //Pointer for minimum time
int currentMin, pastMin; //Holding places for finding minimum travel time
for(int r = 0; r < 5; r++) //5 rows
{
for(int c = 0; c < 2; c++) //2 columns
{
if(c == 0) //If first column
{
if(r == 0) //If first row
{
currentMin = travelArray[r][c]; //First row value stored as currentMin
}
else
{
pastMin = currentMin; //Set previously determined currentMin as pastMin
currentMin = travelArray[r][c]; //Get current value
if(currentMin > pastMin) //If current value is greater than pastMin
{
currentMin = pastMin; //Set currentMin to be pastMin
}
}
}
}
}
pMinimum = ¤tMin; //Points to memory location of currentMin
return pMinimum; //Return address of minimum value
}
标有“// FIX THIS PART”的部分是我遇到麻烦的地方。我希望它增加函数在解除引用之前返回的内存地址(所以我可以在数组的第二列中获取值,这将对应于switch语句中的情况)。我无法在函数的实现中删除函数名中的*,也不能删除内括号,否则会给出错误“Expression是一个不可修改的左值。”
感谢您的帮助。我一直在努力解决这个问题几个小时。我也找不到任何具体代码的示例代码(在解除引用之前递增指针,并且函数返回指针)。
答案 0 :(得分:0)
pMinimum = ¤tMin; //Points to memory location of currentMin
return pMinimum; //Return address of minimum value
currentMin
是一个局部变量,所以你要返回一个指向局部变量的指针。这是问题所在,因为函数返回后局部变量不存在,但您仍在尝试在调用站点上访问它。这不会产生预期的结果。
更好地更改函数的返回类型,然后按值返回currentMin
,
int minimumTravelTime(int travelArray[][2]) //changed the return type!
{
//your code
return currentMin;
}
并称之为,
int minTravelTime = minimumTravelTime(travelTime);
编辑:
如果要求您从函数返回指针,则可以执行以下操作:
return new int(currentMin); //allocate memory, initialize it, and return it!
请注意语法为new int(currentMin)
,而不是new int[currentMin]
。这两种语法有所不同!
在通话网站上:
int *minTravelTime = minimumTravelTime(travelTime);
//use minTravelTime
delete minTravelTime; //delete the memory once you're done!
答案 1 :(得分:0)
您提供的代码似乎存在多个问题。
for(int c = 0; c < 2; c++) //2 columns
{
if(c == 0) //If first column
这部分确保你的循环永远不会检查第二列,这是错误的。
递增返回指针值的逻辑将不起作用,因为返回的值不是数组内的指针,而是指向局部变量的指针(Nawaz已经指出的问题)。此外,您已经在函数minimumTravelTime中找到了第二列的最小值,因此无需进一步处理。
如果您仍希望在解除引用之前递增返回的指针,则必须执行预递增。但是,应该首先将返回的值收集到本地指针中,然后预先递增,否则您将收到“左值”错误。
答案 2 :(得分:0)
methodDeterminator = minimumTravelTime(travelTime)[1];
或等效
methodDeterminator = *(minimumTravelTime(travelTime) + 1);
但是,正如Nawaz所解释的那样,你不返回指向列的指针。你需要设置
pMinimum = travelArray[r];
您设置currentMin
并从minimumTravelTime
函数返回该值。比使用[1]
甚至应该清楚 - 该函数返回带有一个索引的数组,并添加第二个索引。
但是,这是C ++,你应该首先使用std::map
。 C ++提供了许多高杠杆概念以避免操纵指针,你应该使用它们来保持你的代码可维护并避免愚蠢的错误(如果你使用了适当的结构,你在代码中至少会遇到3个严重的问题。)
答案 3 :(得分:0)
我希望它增加内存 函数返回的地址 在解除引用之前。
minimumTravelTime()
返回的指针不是l值(就程序而言,它在内存中没有地址),这意味着你不能像你一样修改它的值如果指针被声明为变量。
可以做的是为返回的指针添加一个值并取消引用结果,如下所示:
methodDeterminator = *(minimumTravelTime(travelTime) + 1);
...或者,更好的是,使用数组表示法来完成同样的事情,比如:
methodDeterminator = minimumTravelTime(travelTime)[1];
您也可以这样做:
int *p = minimumTravelTime();
methodDeterminator = *(++p); // increment first, then dereference
...但除非你想在其他地方使用指针,否则没有充分的理由这样做。