我有一个从串行线读取数据并对其进行处理的函数,简化了:

void serialData(int port){
  static uint8_t byte;
  static uint8_t store[];
  //read one byte from specified port
  //store this byte in the array
  //process the data
}


我需要在“乒乓”系统中从两条不同的串行线路读取数据,并对每一条线路以相同的方式处理数据。

while (true){
  serialData(port1);
  serialData(port2);
}


这不起作用,因为在每个后续调用中,来自端口1和端口2的数据都会混合到数组中。

我只想输入一次该函数的代码,然后以某种方式使用两个不同的名称引用该代码,以便变量不会干扰,除了复制/粘贴具有新名称的相同代码之外,还有更好的解决方案吗?

我尝试过#define,例如:

#define port1Data serialData
#define port2Data serialData


和指针:

void (*port1Data) (int) = &serialData;
void (*port2Data) (int) = &serialData;


但是对两个重命名函数的连续调用仍然会干扰。

最佳答案

通常的方法是从函数中删除静态数据

#include <stdio.h>
int function(int n) {
    static int foo = 0;
    foo += n;
    return foo;
}
int main(void) {
    function(10); // returns 10
    function(-4); // returns 6
    printf("%d, %d\n", function(1), function(-1)); // UB; functions call mess with each other
}


https://ideone.com/c1kW51

要删除静态数据,我会做类似的事情

#include <stdio.h>
struct fxdata {
    int foo;
};
int function(int n, struct fxdata *p) {
    p->foo += n;
    return p->foo;
}
int main(void) {
    struct fxdata f1 = {0};
    struct fxdata f2 = {0};
    function(10, &f1); // returns 10
    function(-4, &f2); // returns -4
    printf("%d, %d\n", function(1, &f1), function(-1, &f2));
}


https://ideone.com/aePprq

关于c - 两次调用函数而不会干扰C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57397536/

10-11 22:50
查看更多