特别奇怪的问题,写出来通知一下,防止再出现类似错误,究竟是何原因,还请高手指点

gfh21cn 上海华电源信息技术有限公司 开发部经理  2004-04-30 12:49:46
环境:CB6专业版+Win2000
一个EXE和一个DLL

DLL是用于计算选型(返回多个记录),为了防止内存在分配、使用和释放的错误(DLL里面分配,EXE里面使用和释放,这样容易产生错误),我定义了一个函数指针
并作为参数传进DLL中,只要一产生记录就调用该函数返回给EXE
[定义]
typedef void Fun_AddResult_MotorBelt(SOutput &Data);
struct SOutput
{
char MotModeID[30];//电机型号
char BeltType[6];//皮带类型
int BeltCount;
int Pole;
double MPow;//电机功率
double MSped;//电机转速
.....//这里有很多个DOUBLE型
double BeltVelocity;//皮带运动速度
bool CenterSpaceMatchResult;//中心距匹配结果 false不成功 true成功
};

[使用]
void AddMotorBeltResult(SOutput &pData)
{
gBeltSelectionResultData.Add(pData);//这里面先分配内存然后用memcpy拷贝,所以不会涉及上面(分配、使用和释放)的问题
}

DLL_MotorBeltSelction(gInput_MotorBeltSelection,*FanSelection,AddMotorBeltResult);//这里传进去

然而,我在调试中发现double类型前的值都传对了,后面的double值都传错了(出现负多少次方,总之是错误的)

怎么想也想不明白,后来把这个结构的定义重新排了一下(把double型放到前面)
struct SOutput_MotorBeltSelection
{
double MPow;//电机功率
double MSped;//电机转速
.....//这里有很多个DOUBLE型
double BeltVelocity;//皮带运动速度
char MotModeID[30];//电机型号
char BeltType[6];//皮带类型
int BeltCount;
int Pole;
bool CenterSpaceMatchResult;//中心距匹配结果 false不成功 true成功
};
哎,还就对了,值全部传对了。
问题虽然解决了,但是还是想不通是何道理。
...全文
28 10 点赞 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
chifengwatch 2004-05-02
up
  • 打赏
  • 举报
回复
jemyzhang 2004-05-01
data alinment?
  • 打赏
  • 举报
回复
GeoPhoenix 2004-05-01
这是否是内存对齐方式的原因造成的,你选字节对齐模式试一下
  • 打赏
  • 举报
回复
robbyzi 2004-05-01
真的如楼主所说的那样吗?

我还真的没有遇过哦。

呵呵
  • 打赏
  • 举报
回复
windindance 2004-04-30
-_-|没事起这么长的名字干什么。:)
  • 打赏
  • 举报
回复
gfh21cn 2004-04-30
呵呵,结构名称写错了SOutput_MotorBeltSelection->SOutput
  • 打赏
  • 举报
回复
TomSonChina 2004-04-30
帮你顶
  • 打赏
  • 举报
回复
jiangchun_xn 2004-04-30

我不会读阿
  • 打赏
  • 举报
回复
kwokwinglau 2004-04-30
借分。
  • 打赏
  • 举报
回复
gfh21cn 2004-04-30
呵呵,一看就清楚是什么
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ Builder
加入

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
帖子事件
创建了帖子
2004-04-30 12:49
社区公告
暂无公告