【问题标题】:How to call a function when bytes of an array changes?当数组的字节发生变化时如何调用函数?
【发布时间】:2015-06-22 09:23:35
【问题描述】:

如果有一个非常大的数组,Arr [255]。我正在编写一个函数,只要这个数组中的任何一个或多个字节被其他函数更新,它就应该执行一项任务。你能帮我用最好的方法吗?

对于 Arr 的前 3 个字节的任何更改,我可以调用函数 Task(),如下所示。

int main (void)
{
   while (1)
   {
       CheckArrayUpdated ();
   }
}

void CheckArrayUpdated (void)
{
    static char ArrPre [3];

    if (
       (ArrPre [0] != Arr [0]) ||
       (ArrPre [1] != Arr [1]) ||
       (ArrPre [2] != Arr [2]) 
       )
    {
        Task ();

        ArrPre [0] = Arr [0];
        ArrPre [1] = Arr [1];
        ArrPre [2] = Arr [2];
    }
    else;
}

我怎样才能对整个数组执行此操作,而不消耗大量处理时间并增加代码的长度和大小?

【问题讨论】:

  • 能否修改Task() 以返回已更改索引的列表?
  • 您好 Jongware,我不知道数组的哪个索引正在更改。

标签: c arrays


【解决方案1】:

不要直接访问数组,而是使用getter/setter:

static char arr[255];

char read_arr(int index) {
    return arr[index];
}

void write_arr(int index, char value) {
    if (arr[index] != value) {
        Task();
        arr[index] = value;
    }
}

一旦将新的(不同的)值写入数组,就会检测到更改,并且可以立即执行Task()。您不必再定期检查整个数组。

【讨论】:

  • 嗨,dlask,我不知道这个数组是在哪里写入的。我所拥有的只是一个字节经常更改的数组
  • 你的实际环境是什么?从中断处理程序修改数组内容的微控制器程序?多线程应用程序?究竟是什么?
  • 是的,一个微控制器项目,其中数组内容在中断发生后被修改并写入单独的.c文件。由于我不太了解该特定文件的编码,因此我不想打扰修改数组的那部分代码。
  • 那么您必须使用原始方法和数组的副本。只是变更检测可以这样简化:memcmp(ArrPre, Arr, sizeof(Arr))。当两个数组相同时,此函数返回零,如果存在差异,则返回非零。
  • 是的,'memcmp'。那真的很有帮助。 Lemme 检查我的编译器是否支持该功能。非常感谢 dlask :-)
猜你喜欢
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2019-10-25
  • 2019-12-09
  • 2014-03-15
  • 1970-01-01
相关资源
最近更新 更多