当前位置: 技术问答>linux和unix
实在困惑:自己写的库函数中的参数传递问题(结构体参数,能进不能出)(高分是应为题目难)
来源: 互联网 发布时间:2016-01-01
本文导语: 遇到一个困惑: 1、写的demo中能实现预期功能 2、实际使用中传递参数失败 实际应用: 在nm.cpp中实现一个函数nm(struct *),参数为结构体指针,编译成.o文件 在main函数中调用该函数,结构体中的成员值可以传入nm 但是...
遇到一个困惑:
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=%sn",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] :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] :sAgentId=ddd,IP_Addr=,DiskTotal=1075485755 M,MemoryTotal=-1073765064 M
做测试写的相应demo如下:
agent.cpp-->agent
#include
#include
INFO g_rInfo;
int main()
{
g_rInfo.a=2;
nm(&g_rInfo);
printf("a=%d,b=%dn",g_rInfo.a,g_rInfo.b);
return 0;
}
nm.h
#include
typedef struct info
{
int a;
int b;
}INFO;
int nm(INFO *rAgent);
nm.cpp-->nm.o
#include
int nm(INFO *rAgent)
{
rAgent->b=3;
printf("a=%d,b=%dn",rAgent->a,rAgent->b);
return 0;
}
执行结果
a=2,b=3
a=2,b=3
困惑啊。。
1、有人说是内存泄露,但是编译、执行过程没有问题,我把nm中的数据处理过程,改为直接赋值,但是数据仍然没有传出来。
2、有人说是编译优化出了问题,我是不懂怎么弄
3、我把nm函数放入agent.h中能够实现预期目标,数据能够传入,也能传出。
但是多个文件调用nm函数,而且文件间也有相互调用,所以很难难取舍。
期盼达人指点一二。
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=%sn",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] :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] :sAgentId=ddd,IP_Addr=,DiskTotal=1075485755 M,MemoryTotal=-1073765064 M
做测试写的相应demo如下:
agent.cpp-->agent
#include
#include
INFO g_rInfo;
int main()
{
g_rInfo.a=2;
nm(&g_rInfo);
printf("a=%d,b=%dn",g_rInfo.a,g_rInfo.b);
return 0;
}
nm.h
#include
typedef struct info
{
int a;
int b;
}INFO;
int nm(INFO *rAgent);
nm.cpp-->nm.o
#include
int nm(INFO *rAgent)
{
rAgent->b=3;
printf("a=%d,b=%dn",rAgent->a,rAgent->b);
return 0;
}
执行结果
a=2,b=3
a=2,b=3
困惑啊。。
1、有人说是内存泄露,但是编译、执行过程没有问题,我把nm中的数据处理过程,改为直接赋值,但是数据仍然没有传出来。
2、有人说是编译优化出了问题,我是不懂怎么弄
3、我把nm函数放入agent.h中能够实现预期目标,数据能够传入,也能传出。
但是多个文件调用nm函数,而且文件间也有相互调用,所以很难难取舍。
期盼达人指点一二。
|
写你的哪个什么demo就够了,前面的都是没用的信息,浪费时间
我弄不清你还想要什么,在main函数里面你并没有写b的值,nm结束之后b的值明显是nm中修改的3了,你还要什么“传出”?
实在弄不清你的问题!
我弄不清你还想要什么,在main函数里面你并没有写b的值,nm结束之后b的值明显是nm中修改的3了,你还要什么“传出”?
实在弄不清你的问题!
|
问问题也是要学问的。
你叽里咕噜了半天。。。。,你提炼个重点来问!
你叽里咕噜了半天。。。。,你提炼个重点来问!
|
应该是字节对齐不同造成的。
就是说,你在编译nmMachine.cpp和agent.cpp时所用的编译参数不一样,
造成两段代码对同一个AGENT_INFO的理解不一样。
就是说,你在编译nmMachine.cpp和agent.cpp时所用的编译参数不一样,
造成两段代码对同一个AGENT_INFO的理解不一样。
|
mark
下班慢慢看
下班慢慢看
|
揭贴.记得给分.教训啊