我有一个函数可以搜索某些数据数组中的极值。它接受指向数据的指针,一些参数和指向存储结果的struct数组的指针。该函数返回结果struct数组的长度。
int FindPeaks(float *data, int WindowWidth, float threshold, struct result *p)
{
int RightBorder = 0;
int LeftBorder = 0;
bool flag = 1;
int i = 0;
int k = 0;
while(1)
{
flag = 1;
if (WindowWidth >= 200) cout << "Your window is larger than the signal! << endl";
if (i >= 200) break;
if ((i + WindowWidth) < 200) RightBorder = i + WindowWidth;
if ((i - WindowWidth) >= 0) LeftBorder = i - WindowWidth;
for(int j = LeftBorder; j <= RightBorder; j ++)
{
if (*(data + i) < *(data + j))
{
flag = 0;
break;
}
}
if (flag && *(data + i) >= threshold && i != 0 && i != 199)
{
struct result pointer = p + k;
pointer.amplitude = *(data + i);
pointer.position = i;
i = i + WindowWidth;
k++;
}
else
{
i ++;
}
}
return k;
}
我对第i个结构字段的引用感到困惑,将结果放在那里。我做错了吗?
答案 0 :(得分:1)
你试图使用指针太聪明,所以你的代码甚至都不会编译。
不要在任何地方使用*(data + i)
或*(data+j)
,而是使用data[i]
或data[j]
。它们是等价的,第二个在使用数组时通常更具可读性(假设调用者传递的data
实际上是({1}}数组的第一个元素的地址)。
您询问的问题是此代码
float
其中struct result pointer = p + k;
pointer.amplitude = *(data + i);
pointer.position = i;
是指向作为参数传递给函数的p
的指针。在这种情况下,struct result
实际上需要是一个真正的指针。假设您希望它指向pointer
(而不是创建单独的p[k]
),您可能需要这样做
struct result
这将获得编译代码。请注意,您尚未描述该函数实际应该实现的内容,因此我没有费心去检查代码是否确实做了任何合理的事情。
请注意,您实际上(错误地)在C ++中使用C技术。现代C ++中有更好的替代方案,例如使用标准容器。