首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果数据相同,则只向数组添加一次

如果数据相同,则只向数组添加一次
EN

Stack Overflow用户
提问于 2022-05-05 11:01:40
回答 1查看 63关注 0票数 1

我有预定义的地址(address1、address2和address3),我想:

如果每个地址变量等于我的数据的前6个变量,那么我想将从扫描( (scanned_data_buff)到我的(列表)

  • )的数据添加到我的(列表)
  • 中,我只想做一次(如果它是我已经添加到列表中的相同地址),我想忽略它并转移到下一个不同的地址。

我已经在下面做了一个代码原型,它完成了第一部分,但是第二部分,我想不出任何想法。

代码语言:javascript
复制
uint8_t *list[10U];
uint8_t scanned_data_buff[30U]={var0,....,var29};/*example: scanned_data[30U]={0x00,0x80,0xE1,0x26,0x9E,0xD9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}*/
uint8_t address1[6U]={var0,....,var5};/*example: AddressAconeer[6U]={0x00,0x80,0xE1,0x26,0x9E,0xD9}*/
uint8_t address2[6U]={var0,....,var5};/*example: AddressKbeacon[6U]={0xDD,0x34,0x02,0x07,0x54,0xE0}*/
uint8_t address3[6U]={var0,....,var5};
uint8_t counter;
for (counter=0;counter<sizeof(list);counter++)
{
    if (((address1[0U]==scanned_data_buff[0U])&&....&&(address1[6U]==scanned_data_buff[6U]))||/* if(AddressAconeer[0U]==scanned_data[0U]...*/
        ((address2[0U]==scanned_data_buff[0U])&&....&&(address2[6U]==scanned_data_buff[6U]))||
        ((address3[0U]==scanned_data_buff[0U])&&....&&(address3[6U]==scanned_data_buff[6U])))
        {
            list[counter]=scanned_data_buff;/*stock scanned_data into list[0U] and then repeat */
        }
}
EN

回答 1

Stack Overflow用户

发布于 2022-05-13 09:32:02

因此,您有一个大小为10的列表数组,它包含指向uint8_t数组的指针。

您有三个长度为6的uint8_t数组,address1、address2、address3。您有长度为30的输入uint8_t数组scanned_data_buff。

如果输入数组的前6个元素与任何地址数组匹配,则需要将指向输入数组的指针添加到列表中。

我就是这么理解问题的。

问题是,在整个列表数组中都有一个for循环。如果输入缓冲区与任何地址有任何匹配,那么您将在列表数组中写入10次相同的内容。我真的不知道你到底想在那里做什么。

我把输入数组的地址放在列表中的想法是:

代码语言:javascript
复制
uint8_t checkaddress = (1U<<1U) | (1U << 2U) (1U << 3U); //0b00001110 check what addresses could still be a match, bit 1 means address1 is not a fail, bit 2 means address2 is not a fail etc
uint8_t counter = 0x00;
while(counter<6 && checkaddress > 0x00){ //while counter going up and not all checks failed
   if(checkaddress & (1U<<1U)){ //if address 1 could still be a match
       if(address1[counter] !== scanned_data_buff[counter]) checkaddress & ~(1U<<1U); //if no match to the element, address1 is no longer possible, so we won't ever check for match with address 1 anymore
   }
   if(checkaddress & (1U<<2U)){ //if address 2 could still be a match
       if(address2[counter] !== scanned_data_buff[counter]) checkaddress & ~(1U<<2U); //if no match to the element, address2 is no longer possible, so we won't ever check for match with address 2 anymore
   }
if(checkaddress & (1U<<3U)){ //if address 3 could still be a match
       if(address3[counter] !== scanned_data_buff[counter]) checkaddress & ~(1U<<3U); //if no match to the element, address3 is no longer possible, so we won't ever check for match with address 3 anymore
   }
 counter++;
}

所以,如果校验地址有位1集,那么就有一个匹配的address1,如果设置了第2位,它就匹配了address2,如果设置了第3位,那么匹配到了address3。如果有不匹配的地方,我们不再和那个地址比较,节省了一些处理时间。简单地说,它更快。如果第一个元素与address不匹配,则不必进一步检查该地址。

如果校验地址为0,则表示没有匹配。如果校验地址不是0,则有匹配。所以现在你可以用scanned_data_buff做任何你想做的事。所以在那之后我们马上就可以做,例如,

代码语言:javascript
复制
//if address match was found, put a pointer to array ( = pointer to the 1st element) into the list[0]
if(checkaddress > 0x00){ //I just like hex, it's explicit :3
   list[0] = &scanned_data_buff[0];
}

作为附带说明:

输入(扫描)数组的作用域可能会出现问题,如果它位于堆栈上,则可以在您不知道的情况下覆盖它。您需要通过malloc或作为全局变量进入堆中,这样内存就不会被覆盖。

另外,在algo方面,我会考虑将address1、address2和address3转换为2D数组。它将进一步简化代码,不需要为每个代码执行单独的代码行。

而且,我显然没有测试过我的任何代码。我就在这里写的,还没试过编译。我的想法是展示我指的是哪种算法。您可以始终使用3个变量而不是校验地址,每个地址一个变量(如uint8_t address1match = 1;如果失败则将其转换为0),如果您不愿意操作单个位的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72126102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档