【问题标题】:Searching elements in an array搜索数组中的元素
【发布时间】:2021-06-03 02:10:30
【问题描述】:

我想使用 uint16_t 类型的变量搜索 uint8_t 类型的数组 days[] 中的元素的索引,该元素的下一个元素为 0x2 和 0x3,并打印元素“0x2”的索引值。我已经分配了 'uint16_t search = 0x23' 但我不确定这是否可行

#include <stdio.h>

#include <stdint.h>

int main()
{

    uint8_t days[5] = {0x1,0x2,0x3,0x4,0x5};
    uint8_t *ptr = days;
    uint16_t search = 0x23;
    for(uint16_t i=0;i<5;i++){
        if (*(ptr+i) == search){
            printf("%d", i);
            break;
        }else{
            printf("not found at %d\n", i);
        }
    }

    return 0;
}

【问题讨论】:

  • 是否要将数组的两个连续 uint8 元素读取为 uint16?如果是,你必须小心不要触发UB。此外,正确性取决于字节序
  • 是的,我想将两个连续的 uint8_t 元素读取为 uint16_t。
  • OT: ptr 没用,只需替换为 *(days+i) 或者更好的是 days[i] 这是惯用的方式。
  • 请确定:您希望search = 0x34 的输出是什么?
  • 您确定要搜索0x23 而不是0x0203days 是否可以包含大于 0x9 的值?

标签: arrays c pointers stdint


【解决方案1】:

为了能够将 uint8 数组作为 uint16 成对搜索,需要在比较之前将数组的指针从 uint8 转换为 uint16。以下是代码的外观:

#include <stdio.h>
#include <stdint.h>

int main()
{
    uint8_t days[5] = {0x1,0x2,0x3,0x4,0x5};
    uint8_t *ptr =  days;
    uint16_t search = 0x0302;
    for(uint16_t i=0;i<4;i++){
        if (*((uint16_t *) (ptr+i) ) == search){
            printf("%d", i);
            break;
        }else{
            printf("not found at %d\n", i);
        }
    }
    return 0;
}

请注意,我将(uint16_t *)(ptr+i) 一起递增为uint8_t 的指针转换为以uint8_t 的步骤穿过数组

还请注意,我将循环降低到 4 次而不是 5 次,因为通过将数组的最后一个元素转换为 uint16_t,您将超出数组的边界。

最后,您要搜索的值应该是0x0302 而不是0x23。一是因为0x030x02是要存入uint8的值,二是由于CPU的endianness ,转换成@987654333时它们在内存中的顺序是相反的@

注意:使用强制转换时,您应该确定强制转换的解释方式,这意味着不要超出变量的边界,否则可能会导致分段错误,甚至会导致程序未定义行为的静默问题.

【讨论】:

  • 您可以添加一个注释,一般来说,由于严格的alising-rules,这样的演员可能会触发UB。但是,在这种情况下,uint8_t 很可能是 unsigned char 的别名,它可以与所有内容命名。
【解决方案2】:

也许你想要这个:

  uint8_t days[5] = { 0x1,0x2,0x3,0x4,0x5 };
  uint16_t search = 0x23;

  for (uint16_t i = 0; i < 4; i++) {             // 4 not 5 because of days[i + 1] below
    uint16_t value = (days[i] << 4) | days[i + 1];

    if (value == search)
    {
      printf("%d", i);
      break;
    }
    else
    {
      printf("not found at %d\n", i);
    }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-08
    • 2023-02-01
    • 2016-05-24
    • 2011-09-08
    • 2014-03-30
    • 2015-07-17
    • 2015-04-18
    • 2013-07-25
    相关资源
    最近更新 更多