C语言变量在子函数中使用(不用全局变量)(事件函数无法传参数)

求高手解决一个问题。我用GNU for ARM编译器编写手持器程序,C语言。在一个函数function1()中有一个变量a;函数中触发事件OnClick=function2;事件触发函数为 int function2(HWND Obj,PMsg Msg);

怎样才能使得变量a在function2函数中也能用,我不想用全局变量,而function2又不能有其他参数。

求大神帮忙解决

可以通过内嵌汇编来做,先把文件转成汇编文件,看一下编译器是怎么搞的。
gcc -S sss.c。

比如在X86上从function2来看,8(%ebp)是第一个参数, 12(%ebp)是第二个参数。大于12以上的就跑到function1的变量堆栈里面去了。之后根据function1里面的汇编代码找到a值(因为变量不一定是对齐放在堆栈里面的)。

也可以不用上面那样搞,突然想到还有一种更通用的方法,在进行function2调用前,使用内嵌汇编把a push进去,之后在function2中通过16(%ebp)就可以访问获得。

function1()
{
var a;
....
__asm__ __volatile__(

"pushl %1"
:"r"(a)

);
function2();

}

function2()
{
....
var a

__asm__ __volatile__(
"movl 16(%%ebp), %0"
: "=r"(a)

);
/*a已经获取到了*/

....

}追问

谢谢大神,虽然看不懂内嵌汇编,以后要学学汇编语言

追答

上面的代码,在funtion1调用完function2后,应该再pop一次,否则function1函数调用结束返回应该会引起段错误。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-23
= =办法有很多,如果一定坚持不能用全局变量不能利用参数一定要奇葩的解决办法的话,function1中修改function2的代码,使function2能访问到正确的变量也是可以的……追问

那怎样才能修改代码??function2是事件触发时指向的函数,参数是固定的,不能手动输入。又需要用到function1中的一个变量。以前的方法是用全局变量,现在不能用全局变量了(编码要求的)。

本回答被网友采纳
第2个回答  2013-08-23
这种情况基本上只能用全局变量
或者用环境变量(也可以认为是全局变量)
或者用RPC方式比如通过文件传递数据(也基本上可以认为是全局变量。。。)
或者看PMsg有没有相应的字段可以利用
或者看你想在OnClick中使用function1中的数据这件事情本身是不是有问题,有没有其他方式
第3个回答  2013-08-23
重载function1,function2里面调用重载的function1,a作为重载function1的返回值。
第4个回答  2013-08-23
在function2中调用function1,function1返回a!

为什么在C#中函数内的变量不叫全局变量呢?
在C语言当中,一个程序,无论复杂或简单,总体上都是一个“函数”;这个函数就称为“main函数”,也就是“主函数”。比如有个“做菜”程序,那么“做菜”这个过程就是“主函数”。在主函数中,根据情况,你可能还需要调用“买菜,切菜,炒菜”等子函数。main函数在程序中大多数是必须存在的,但是依然...

...定义一个变量,使其既可以在主函数中使用,也可以在子函数中使用...
回答:把变量定义在主函数之外,即把变量设置为全局的。一般我们都把变量的定义放在函数中,因此变量的范围就是在本函数中。可是如果定义在所有函数的外面,这样所有的函数中,都可以使用本变量。你可以试一下这个程序。定义一个全局变量a,在主函数中进行赋值,然后在子函数中进行输出,结果是5.#include<...

关于c语言 在c中调用函数时,只能把实参的值传递给形参,形参的值不能...
不对,在C语言中,传值有地址传值和参数传值,参数传值只能将实参传值给形参,所以A选项正确。C语言中的外部变量是可以在函数之间传递数据的。C语言中的自动变量是默认的变量,实际上是函数中的局部变量,所以D选项正确。全局变量一经定义都是需要分配内存单元,在程序运行过程中自始至终都会占用固定的...

c语言 子函数的问题
m=15,这个m是全局变量,在主函数中有效 m=3,这个m是局部变量,在函数func内有效 func(4,7)=5*7-3=32 主程序中第一个输出语句的输出是32,15,第二个输出语句的输出是4*7%15,即13

C语言中,子函数定义了一个全局变量,运行一次数值改变,子函数再次运行...
函数定义所谓“全局变量”的唯一方式就是把变量声明为static。static修饰的变量只会在函数第一次被调用时被初始化一次,并且超出函数作用域后不会被销毁。但其可见性仍然限于函数作用域内,而非全局。

c语言中如何用子函数调用结构体中的变量实现数据的输入与输出。_百度...
方法1:void型不传值传址调用与声明。main中声明void date_in(),void date_pout()。函数定义前一定在main()前先定义结构体变量(全局变量),然后定义输入或输出程序段。此时再main()调用即可。如下:struct student { char name[20];int old;char sex;}stu;void date_in();void main(){ date...

C语言中,这个main函数里定义的变量是全局变量还是局部变量?
放在main函数里定义的变量任然是局部变量,全局变量要放在所有函数(包括main)的外部,例如:include <stdio.h>int x,y,z;void year(int a,int b,int c);int main(){ int i,a,b,c; for(i=1;i<=1;i++) { scanf("%d,%d,%d",&a,&b,&c); printf("a=%d\\n",a); printf("b...

C语言中在函数外部声明的变量是什么变量
在函数外部声明的为全局变量.带static的是静态全局变量, 作用域为当前文件.不带static的是全局变量, 作用域为整个程序.所有全局变量的生命周期都是整个程序运行

请问在C语言中,这种情况下设为全局变量好还是局部变量好?
一般原则是尽量少定义全局变量,因为全局变量会占用更多的内存,而且存在时间长;当然定义也没有问题,能解决这样的问题……但是我提议你:定义在主函数中,然后用指针型的参数传到两个函数进行调用。

C语言变量的定义与使用
C语言的基本功能单元是函数。在函数内部定义的变量是局部变量,仅能在函数内部使用。函数可以组成程序的功能模块,而这些函数头文件中定义的静态变量(局部变量)可以被模块内的所有函数访问。若在模块内部声明变量并在头文件中导出,该变量类型则为全局变量,可在整个工程中被所有函数访问。3. 合理分配RAM...

相似回答