实在困惑:自己写的库函数中的参数传递问题(结构体参数,能进不能出)

johndiyang 2006-12-26 10:48:30

遇到一个困惑:
1、写的demo中能实现预期功能
2、实际使用中传递参数失败
实际应用:
在nm.cpp中实现一个函数nm(struct *),参数为结构体指针,编译成.o文件
在main函数中调用该函数,结构体中的成员值可以传入nm
但是却传不出来。

这是什么原因造成的啊 ?

我自己写一个类似的demo是可以实现 参数传入传出的,完全达到了目的:构造函数库
相关程序如下:

文件nmMachine.cpp--->nmMachine.o

int nmGetMachineConfig(AGENT_INFO *prAgentInfo)
{
printf("[nmGetMachineConfig]...start.\n");
printf("[nmGetMachineConfig]sAgentId=%s\n",prAgentInfo->sAgentId);
prAgentInfo->nDisk=234;
prAgentInfo->nMemory=234;
strcpy(prAgentInfo->sIpAddr,"121.122.00");
printf("[nmGetMachineConfig]...df /home :sAgentId=%s,IPADDR=%s,DISK=%ld,Memory=%ld.\n",prAgentInfo->sAgentId,prAgentInfo->sIpAddr,prAgentInfo->nDisk,prAgentInfo->nMemory);
return 0;
}


文件agent.cpp-->agent

AGENT_INFO g_rAgentInfo;
strcpy(g_rAgentInfo.sAgentId,"ddd");
nmGetMachineConfig(&g_rAgentInfo);
printf("[Debug] <agent>:sAgentId=%s,IP_Addr=%s,DiskTotal=%ld M,MemoryTotal=%ld M\",g_rAgentInfo.sAgentId,g_rAgentInfo.sIpAddr,g_rAgentInfo.nDisk,g_rAgentInfo.nMemory);




编译makefile

CCFLAGS = -W -Wall -Wpointer-arith -Wno-deprecated -pipe -Wno-uninitialized \
-fno-implicit-templates \
-DACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION -D_POSIX_THREADS \
-D_POSIX_THREAD_SAFE_FUNCTIONS -D_REENTRANT -DACE_HAS_AIO_CALLS \
-DACE_HAS_EXCEPTIONS -D_OS_LINUX -D_TCPLIB_NO_HEAD
CCFLAGS +=-I$(ACE_ROOT) -I$(ACE_ROOT)/ace -I$(XERCESCROOT)/include -I$(HOME)/app/commlib -I$(INDIR) -I.
LDFLAGS = -L/usr/lib -L$(ACE_ROOT)/ace -lACE -ldl -lpthread -lrt -L$(OBJDIR)


agent:$(OBJDIR)/agent.o $(OBJDIR)/nmMachine.o
$(CC) $(CCFLAGS) $(LDFLAGS) $(OBJDIR)/agent.o $(OBJDIR)/nmMachine.o -o agent

$(OBJDIR)/agent.o:agent.cpp
$(CC) $(CCFLAGS) -g -c agent.cpp -o $(OBJDIR)/agent.o


执行结果:

[nmGetMachineConfig]...start.
[nmGetMachineConfig]sAgentId=ddd
[nmGetMachineConfig]...df /home :sAgentId=ddd,IPADDR=121.122.00,DISK=234,Memory=234
[Debug] <agent>:sAgentId=ddd,IP_Addr=,DiskTotal=1075485755 M,MemoryTotal=-1073765064 M


做测试写的相应demo如下:
agent.cpp-->agent

#include <stdio.h>
#include <nm.h>

INFO g_rInfo;

int main()
{
g_rInfo.a=2;
nm(&g_rInfo);
printf("a=%d,b=%d\n",g_rInfo.a,g_rInfo.b);
return 0;
}


nm.h

#include <stdio.h>

typedef struct info
{
int a;
int b;
}INFO;

int nm(INFO *rAgent);

nm.cpp-->nm.o


#include <nm.h>

int nm(INFO *rAgent)
{
rAgent->b=3;
printf("a=%d,b=%d\n",rAgent->a,rAgent->b);

return 0;

}

执行结果

a=2,b=3
a=2,b=3



困惑啊。。

1、有人说是内存泄露,但是编译、执行过程没有问题,我把nm中的数据处理过程,改为直接赋值,但是数据仍然没有传出来。
2、有人说是编译优化出了问题,我是不懂怎么弄
3、我把nm函数放入agent.h中能够实现预期目标,数据能够传入,也能传出。
但是多个文件调用nm函数,而且文件间也有相互调用,所以很难难取舍。


期盼达人指点一二。


...全文
322 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2007-01-03
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/5265/5265279.xml?temp=.5922968

关于 GDB 调试,
不妨看看吧 ~~
ReverseEngineering 2007-01-03
  • 打赏
  • 举报
回复
学习。
johndiyang 2007-01-03
  • 打赏
  • 举报
回复
反复使用各种方法跟踪调试程序,gdb指令熟悉了很多,只是还没有入门。
自己学习真难啊。
johndiyang 2007-01-03
  • 打赏
  • 举报
回复
搞定了!
原因:引入旧的代码,造成重复宏定义!



吸取教训啊!

实在是低级的错误
花了很多时间,主要是调试手段不够,经验不足。
努力学习,要熟练gdb
ZOU_SEAFARER 2006-12-27
  • 打赏
  • 举报
回复
应该不能出什么问题呀!!都是传地址的操作!!
jixingzhong 2006-12-27
  • 打赏
  • 举报
回复
AGENT_INFO 的定义能够看看么?

赋值操作的数据类型不匹配可能会造成这样的结果 ~~
jixingzhong 2006-12-27
  • 打赏
  • 举报
回复
调用关系自己都混乱了,
我们还怎么看呢 ?

那个后面的所谓 demo 显然是可以的 ....
zhousqy 2006-12-27
  • 打赏
  • 举报
回复
AGENT_INFO怎么定义的
johndiyang 2006-12-26
  • 打赏
  • 举报
回复
.............
编译,运行都不会报错,
只是数据不能正确传递
king_water 2006-12-26
  • 打赏
  • 举报
回复
prAgentInfo->sIpAddr 不是一个指针吧,否则 strcpy 会泄漏的
johndiyang 2006-12-26
  • 打赏
  • 举报
回复
怎么跟踪?
我看了GDB的 一些指令,可是不知道怎么根据那些东西判断错误所在,能详细介绍下吗?
zhgc1983 2006-12-26
  • 打赏
  • 举报
回复
用GDK跟踪调试,代码看上去没问题,编译应该不会出什么问题
  • 打赏
  • 举报
回复
demo我看也正确啊

69,373

社区成员

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

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