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

johndiyang 2006-12-26 10:51:29
遇到一个困惑:
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函数,而且文件间也有相互调用,所以很难难取舍。


期盼达人指点一二。

...全文
303 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
besthyq 2007-01-03
  • 打赏
  • 举报
回复
揭贴.记得给分.教训啊
johndiyang 2007-01-03
  • 打赏
  • 举报
回复
搞定了!
原因:引入旧的代码,造成重复宏定义!



吸取教训啊!
Helloooooo 2007-01-02
  • 打赏
  • 举报
回复
问问题也是要学问的。
你叽里咕噜了半天。。。。,你提炼个重点来问!
无知者无谓 2006-12-26
  • 打赏
  • 举报
回复
写你的哪个什么demo就够了,前面的都是没用的信息,浪费时间

我弄不清你还想要什么,在main函数里面你并没有写b的值,nm结束之后b的值明显是nm中修改的3了,你还要什么“传出”?

实在弄不清你的问题!
rtdb 2006-12-26
  • 打赏
  • 举报
回复
应该是字节对齐不同造成的。
就是说,你在编译nmMachine.cpp和agent.cpp时所用的编译参数不一样,
造成两段代码对同一个AGENT_INFO的理解不一样。
hyg2008 2006-12-26
  • 打赏
  • 举报
回复
mark
下班慢慢看

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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