我遇到了一个问题,我必须编写一个接受两个参数的函数(两个都是指针,第一个指向数组的开头,第二个指向最后一个数组之后的内存位置)数组的元素)
必须从数组的第一个元素到中间的一个元素,然后从中间元素到最后的一个元素,调用函数,然后该函数应返回这两个较大的值
double max_element(double *p1, double *p2)
{
double from_first_to_middle = max_element(p1, (p1 + p2) / 2 + p1);
double from_middle_to_last = max_element((p1 + p2) / 2 + p1, p2);
if(from_first_to_middle > from_middle_to_last)
{
return from_first_to_middle;
}
else
{
return from_middle_to_last;
}
}
但是当我尝试运行此代码时,它给了我错误
error: invalid operands to binary + (have ‘double *’ and ‘double *’)
因此,我以为我应该取消引用这些指针,因为我无法使用它们指向的地址进行这些操作,但仍然无法正常工作。
有人可以帮忙吗?
谢谢!
答案 0 :(得分:3)
指针不是整数。仅为它们定义了一些算术运算,并且指针+指针加法和指针/整数除法不在其中(它们是什么意思?)。您可以将一个整数添加到一个指针以获取另一个指针,该指针与原始指针偏移指定数量的目标对象。相反,您可以从另一个指针中减去一个指针以获得一个整数,该整数表示两个指向的目标对象之间的数量。这两个操作都有限制,但这些限制不应干扰您需要执行的操作。
您可以将上述类型的指针算术运算与某些整数(仅)算术一起使用,以计算函数所需的中点指针。细节留作练习。
答案 1 :(得分:0)
也许这会有所帮助。
double max_element(double *p1, double *p2)
{
double from_first_to_middle = max_element(p1, (double *)((size_t)(p2 - p1) / 2) + p1);
double from_middle_to_last = max_element((double *)((size_t)(p2 - p1) / 2 + 1) + p1, p2);
if (from_first_to_middle > from_middle_to_last)
{
return from_first_to_middle;
}
else
{
return from_middle_to_last;
}
}
答案 2 :(得分:0)
我认为您的代码不会结束,因为您的返回有一些问题。
如果p1 + 1 == p2
,则递归继续递归。您应该添加一行
if ((p1+1) == p2)
return *p1;
开头。
double max_element(double* p1, double* p2){
if ((p2 - p1) <= 0)
exit(1);
if ((p1+1)==p2)
return *p1;
}
答案 3 :(得分:0)
如果不是使用p1
和p2
变量名,而是使用与变量名from_first_to_middle
和from_middle_to_last
匹配的指针,则情况可能会变得更加清楚:
double max_element(double *first, double *last)
{
if (last - first == 1)
{
return *first; // base case of our recursion
}
double *middle = first + (last - first) / 2;
double from_first_to_middle = max_element(first, middle);
double from_middle_to_last = max_element(middle, last);
if (from_first_to_middle > from_middle_to_last)
{
return from_first_to_middle;
}
return from_middle_to_last;
}
尽管(p1 + p2) / 2
与常规数字相同,但p1 + (p2 - p1) / 2
与(p1 + p2) / 2 + p1
相同,但由于缺少指针加法,该逻辑不适用于指针。即使那样,您的公式:@client.event
async def on_message(message):
if message.content.startswith('pclear'):
tmp = await client.send_message(message.channel, '**Purging
messages...**')
async for msg in client.logs_from(message.channel):
await client.delete_message(message)
对于常规数字也是错误的。