【问题标题】:How can I check the position of an element on an array?如何检查数组中元素的位置?
【发布时间】:2021-03-13 09:26:04
【问题描述】:

我有结构

struct timer_t; 

以及这些计时器结构的数组

timer_t timer[6];

我还有一个回调函数,它以数组元素为参数。

void timer_callback(timer_t *timer)
{
   //how can I check which position of the timer_t timer[6] is?
}

正如您在代码中看到的,我的问题是如何获取数组中的元素位置? 需要知道数组的哪个元素是 *timer。我可以在回调函数中获取计时器数组。 谢谢。

【问题讨论】:

  • 嗯,我认为您需要遍历 timer[] 以搜索所需的属性。
  • 数组在哪里定义?是局部变量还是全局变量?
  • 我可以得到回调里面的数组。
  • 您需要做的第一件事是给数组和参数赋予相同的符号名称,否则在timer_callback() timer 将引用并且数组将是无法访问(阴影)。
  • 你可以为timer[6]注册一个单独的回调吗?

标签: arrays c memory struct embedded


【解决方案1】:

你不能简单地“知道”位置,你可以传递数组并迭代它,或者传递元素所在的索引。取决于你在调用函数时知道元素在哪里与否,需要自行搜索。

编辑:如果函数内有数组:

// you will need a different array name as to not conflict
int i = 0;
while (i < 6 && *timer != timer_array[i]) i++;

if (i != 6) {
    // timer found
}

编辑:我建议在整个代码中使用 #define ARRAY_SIZE 6 而不是文字 6。或者更糟糕的是像sizeof(array)/sizeof(*array)这样的大小划分。

【讨论】:

  • 我可以在回调中获取数组。但是,我该如何比较这些元素呢?这在循环内是否正确? if(timer[i]==timer) 中断;或 if(&timer[i]==&timer) 中断;作为最后一个元素在数组中的位置。
  • 比较结构的内容。 if (timer[i].something != timer.somthing &amp;&amp; timer[i].somethingelse != timer.somethingelse ....)。或者比较元素的地址。 “正确性”取决于 您想要 具有的语义(元素相等是否意味着元素内容相同?还是意味着它是完全相同的元素?)。我只能猜测比较地址&amp;timer_array[i] == timer 是你想要的。无论如何,没有什么能让你免于理解它——我建议从一本好的 C 书开始。
  • 我建议sizeof(timer_array) / sizeof(*timer_array) 而不是文字6
【解决方案2】:

如果你确定回调参数指向数组的某个元素,那么你可以用简单的指针算法来索引:idx = timer_ptr - timer_array

但如果它不指向数组,那么这将导致未定义的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 2018-10-20
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多