我有一个函数可以在一些数据数组中搜索极值。它采用指向数据的指针、一些参数和指向存储结果的结构数组的指针。该函数返回结果结构数组的长度。
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 个结构字段的引用感到困惑。我做错了什么吗?
最佳答案
您在尝试使用指针时过于聪明,因此您的代码甚至无法编译。
与其到处使用 *(data + i)
或 *(data+j)
,不如使用 data[i]
或 数据[j]
。它们是等价的,第二个在处理数组时通常更具可读性(假设调用者传递的 data
实际上是(的第一个元素的地址)一个 float 数组
)。
你问的问题是这段代码
struct result pointer = p + k;
pointer.amplitude = *(data + i);
pointer.position = i;
其中 p
是指向作为参数传递给函数的 struct result
的指针。在这种情况下,pointer
实际上需要是一个真正的指针。假设您希望它指向 p[k]
(而不是创建一个单独的 struct result
),您可能需要做
struct result *pointer = p + k; /* equivalently &p[k] */
pointer->amplitude = data[i];
pointer->position = i;
这将获取要编译的代码。请注意,您没有描述该功能实际应该实现的功能,因此我没有费心去检查代码是否确实做了任何明智的事情。
请注意,您实际上(误)在 C++ 中使用了 C 技术。现代 C++ 中有更好的替代方案,例如使用标准容器。
关于c++ - 指向函数中结构元素字段数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39329645/