【问题标题】:Pointer to array of structs element field in a function指向函数中结构元素字段数组的指针
【发布时间】:2016-09-05 11:29:38
【问题描述】:

我有一个在某些数据数组中搜索极值的函数。它接受指向数据的指针、一些参数和指向存储结果的结构数组的指针。该函数返回结果结构数组的长度。

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 个结构字段的引用感到困惑。我做错了吗?

【问题讨论】:

  • “我对将结果放入其中的第 i 个结构字段的引用感到困惑。” - 你的意思是什么那个?
  • struct result pointer = p + k;:,有一种感觉应该是:struct result* pointer = p + k;
  • 我无法编译这一行。将指针设置为第 i 个幅度的问题:pointer.amplitude = *(data + i);
  • “指向结构数组的指针” 嗯,这一切都非常类似于 C。您甚至使用了 struct 前缀。您使用什么资源来学习 C++?
  • @Dankevich:我们知道你“无法编译这一行”。但是重复模糊的问题陈述并没有帮助..

标签: c++ arrays function pointers struct


【解决方案1】:

您试图在使用指针方面过于聪明,因此您的代码甚至无法编译。

不要到处使用*(data + i)*(data+j),而是使用data[i]data[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++ 中有更好的替代方案,例如使用标准容器。

【讨论】:

  • 我不知道“太聪明”。
  • @StoryTeller - 我说的是“试图太开始”,而不是“太聪明”。意思完全不同。
  • struct result 听起来很像 C。
  • @Peter,我现在意识到讽刺显然不适合这种媒体。
  • 如果不写一篇文章(不适合这种格式),这真的很难完整解释,Dankevich。但是,在声明 struct result *pointer = p+k 中,struct 关键字在 C++ 中根本不需要(但在 C 中)。这是其他人评论您的代码是 C 而不是 C++ 的原因之一。此外,在现代 C++ 中,您很少(可能永远不会)需要在任何代码中使用指针或数组......如果您了解 C++ 标准容器,如 vector
猜你喜欢
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
相关资源
最近更新 更多