gpt4 book ai didi

C 中调用函数两次而不干扰

转载 作者:行者123 更新时间:2023-11-30 18:44:39 24 4
gpt4 key购买 nike

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

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);
}

这不起作用,因为来自 port1 和 port2 的数据在每次连续调用时都会混合在数组中。

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

我尝试过#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 中调用函数两次而不干扰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57397536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com