从函数中编辑C数组

从函数中编辑C数组,c,arrays,function,C,Arrays,Function,我正在尝试这样做: int a[5]; foo(){ a[1]=7; } void main(){ foo(); //At this point, I want the value in a[1] to be equal to 7 } 是否有某种方法可以在C中实现此功能,而无需将a传递给函数foo,这在我的应用程序(微控制器上的中断处理程序)中是不可能的。如果在中断控制例程中修改了全局数组a,则应将其定义为: volatile int a[5]; volatile告诉

我正在尝试这样做:

int a[5];
foo(){
    a[1]=7;
}
void main(){
    foo();
    //At this point, I want the value in a[1] to be equal to 7
}

是否有某种方法可以在C中实现此功能,而无需将
a
传递给函数
foo
,这在我的应用程序(微控制器上的中断处理程序)中是不可能的。

如果在中断控制例程中修改了全局数组
a
,则应将其定义为:

volatile int a[5];
volatile
告诉编译器,数组元素可以在程序执行时异步更改,例如,因为它们可以由中断服务例程修改,或者因为内存位置是一个硬件寄存器,其值可以在某些外部事件时更改。对这些变量的访问必须始终生成按照代码中指定的方式读取或写入变量的代码,这与常规变量不同,对于常规变量,如果自上次写入后未对其进行修改,编译器通常可以对其值做出有效假设

此外,不建议对全局变量使用这样短而无意义的名称

还要注意,您的
foo
main
原型不正确。应将其定义为:

void foo(void) {
    a[1] = 7;
}
int main(void) {
    foo();
    // At this point, I want the value in a[1] to be equal to 7
    // ...more code
}

你现在做的有什么问题吗?全局变量是游戏的名称。Code all ready做你想做的事情-什么是未解决的问题?但是如果你是从ISR@kdopen这是正确的。OP:建议不要谈论ISR,而是将其添加到帖子中。如果ISR是
foo()
,为清楚起见,建议
ISR\u foo()
,并显示其他代码如何访问
a[]
“弃用”->“弃用”(插入
s的人)你告诉他,chqrlie。顶尖程序员正在进行。
volatile
不保证原子访问。如果没有进一步的措施,这仍然可能产生无效的结果。更糟糕的是:这些可能只是偶尔发生一次,这取决于内部时间安排。使用
stdatomic
或确保读写正确。@Olaf:恐怕关于
stdatomic.h
的整章都是C标准中最模糊的部分,远比关于
restrict
或有效类型的讨论更深奥。。。在这一点上,我怀疑OP的技能水平是否能与
volatile
之外的任何东西兼容。希望微控制器能够以原子方式访问
int
,否则将其作为
char
数组应该可以解决问题。我们说的是微控制器上的ISR,而不是在多核上运行的多线程,内存访问顺序不正确。@chqrlie:所以,仅仅因为OP不能理解原子,他就应该使用一种潜在的错误方法,这可能导致非常微妙和非常难以调试的错误,即使对于有经验的开发人员也是如此?显然,另一种方法是在任何访问周围锁定中断(或处理程序的中断)。我们不知道目标有多少个核,但如果只有一个核,它应该可以工作(如果内在函数意味着内存障碍)。否则他就输了。