通过全局变量进行函数间的交互?

idau7 2008-06-10 10:55:09
还真不知道杂说.
问题是这样的, 比如有个全局变量g, 函数SetA对g写值, 函数GetA需要对g读取.
比如:
gg.h

#ifndef __gg_h_
#define __gg_h_
#ifdef __cplusplus

extern "C" {
#endif // __cplusplus

long g_lDecInH;

void SetA(long val);
void GetA(long* pval);

#ifdef __cplusplus
}
#endif // __cplusplus

#endif /* __gg_h_ */




test.c. 略, 只是set赋值, get赋值的过程.


1.当函数SetA()和GetA()在统一个函数内被调用时(如main内调用SetA()后调用GetA()), 工作正常.

2.当SetA()和GetA()在不同的函数中被调用(比如main中再调用Fun1(), Fun2(), Fun1调用SetA(),Fun2调用GetA()), 则GetA的返回不是SetA的设置值.

问题.
如果SetA和GetA需要在不同函数中调用, 如何实现其正常运作?

同贴发至C++版
...全文
199 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
idau7 2008-07-10
  • 打赏
  • 举报
回复
问题已经确定了, 如果你跨越多个文件, 会出现类似的问题.
如, ->表示调用
SetA()->SetAA()->SetAAA()
正常
SetA()->SetAAA()
就有可能出现问题.
sukyin 2008-06-10
  • 打赏
  • 举报
回复
#include "h1.h"
#include <iostream>
void SetA(long val){
g_lDecInH = val;
}
long GetA(){ //不要写成GetA(long *p)最好用返回值。
return g_lDecInH;
}
void f1(){
long l = 123;
SetA(l);
printf("%d\n",g_lDecInH);
}

void f2(long* p){
*p = GetA();
printf("%d\n",*p);
}
int main()
{
long p = 0;
f1();
f2(&p);
printf("%d\n",p);
system("pause");
return 0;
}
这样是没问题的。
icansaymyabc 2008-06-10
  • 打赏
  • 举报
回复
除非你用多线程,否则不会出现你说的情况。


if(你用多线程){
long volatile g_lDecInH; // 代替 long g_lDecInH;
//搞定
}else{
检查你的程序流程,一定是 GetA 之前多次 SetA ,导致你不知道正确值
}


babyvox1999 2008-06-10
  • 打赏
  • 举报
回复
全局变量怎么会不一样,不管在哪里调,你多线程?
tian428 2008-06-10
  • 打赏
  • 举报
回复
应该没问题啊
  • 打赏
  • 举报
回复
晕,现在的人这样说话的[Quote=引用 3 楼 icansaymyabc 的回复:]
除非你用多线程,否则不会出现你说的情况。


if(你用多线程){
long volatile g_lDecInH; // 代替 long g_lDecInH;
//搞定
}else{
检查你的程序流程,一定是 GetA 之前多次 SetA ,导致你不知道正确值
}
[/Quote]
长安宁 2008-06-10
  • 打赏
  • 举报
回复
如果把g_lDecInH写到一个公用文件,比如: stdafx.h里面,应该,在多个类(窗体类 CWnd)里面调用 没有 问题;
ForestDB 2008-06-10
  • 打赏
  • 举报
回复
不好意思,忽略偶上次的回帖.
好像没问题啊,简单的试了下:

// gg.h
#ifndef __GG_H_
#define __GG_H_

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

long g_lDecInH;

void SetA(long val);
void GetA(long *pval);

#ifdef __cplusplus
}
#endif // __cplusplus

#endif // __GG_H_

// gg.c
#include "gg.h"

void SetA(long val)
{
g_lDecInH = val;
}

void GetA(long *pval)
{
*pval = g_lDecInH;
}

// main.c
#include <stdio.h>
#include "gg.h"

void foo1()
{
long tmp;

printf("Input a number: ");
scanf("%d", &tmp);
SetA(tmp);
}

void foo2()
{
long tmp;

GetA(&tmp);
printf("Your input: %ld\n", tmp);
}

int main(void)
{
foo1();
foo2();

return 0;
}

没有发现问题.
如果多线程,set/get里面加锁.
fuqd273 2008-06-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 idau7 的回复:]
谢谢楼上的诸位.是我问题没有描述清楚.

是我把问题简化了, 忽略的多线程的情况, 实际上是不同的wnd对象的调用.
确实有这样的问题. 全局变量访问不到. 感觉似乎父级调用层如果不同, 似乎无法访问到对应的正确的值.

晚点我整理清晰思路贴出来吧.
[/Quote]

不同的窗体……
如果是窗体的话,为什么要用全局变量?不用类来实现?
多个窗体实体,属于多进程么?楼下继续。

ForestDB 2008-06-10
  • 打赏
  • 举报
回复
首先想说的是,你这里列出的code,只有全局变量的声明,也许在别的地方有它的定义吧.
写code去了...
idau7 2008-06-10
  • 打赏
  • 举报
回复
谢谢楼上的诸位.是我问题没有描述清楚.

是我把问题简化了, 忽略的多线程的情况, 实际上是不同的wnd对象的调用.
确实有这样的问题. 全局变量访问不到. 感觉似乎父级调用层如果不同, 似乎无法访问到对应的正确的值.

晚点我整理清晰思路贴出来吧.

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧