C翻译成DELPHI, 我快晕了!各位!(200分)

  • 主题发起人 主题发起人 暗夜中独舞
  • 开始时间 开始时间

暗夜中独舞

Unregistered / Unconfirmed
GUEST, unregistred user!
我翻译过来老是出现数据对齐的错误。
主要是DownInfo.AppInfoS这个数据有错误估计,DownInfo.AppInfoS.appname是空的呀。请大家帮忙看看吧
C的代码如下:
typedef struct {
char ProgFile[255]

char ParaFile[255];
char DataFile[255];
char OtherFile[255];
char Type ;
char AppSum[3]; char *AppInfoS;
}DownInfo_M;

typedef struct
{
char app_name[20];
char app_edition[32];
char app_update[2];
char app_para_update[2];
char app_down_time[14];
char app_update_time[14];
char app_Enable[2];
char other[14];
}app_info_req;

DownInfo_M m_stDownfile

app_info_req m_stAppInfoReq;
char acRet[100];

memset(&m_stDownfile, 0, sizeof(DownInfo_M));
memset(&m_stAppInfoReq, 0, sizeof(app_info_req));
m_stDownfile.AppInfoS = &m_stAppInfoReq;
strcpy(m_stDownfile.OtherFile, "D://TMS//File")

m_stDownfile.AppSum[2] = 0x31;
strcpy(m_stAppInfoReq.app_name, "app")

m_stAppInfoReq.app_update[1] = 0x01;

我翻译的如下:
TAppInfoReq = record
AppName: array[0..19] of char

AppEdition: array[0..31] of char

AppUpdate: array[0..1] of char

AppParaUpdate: array[0..1] of char

AppDownTime: array[0..13] of char

AppUpdateTime: array[0..13] of char
AppEnable: array[0..1] of char

Other: array[0..13] of char
end;
TDownInfo = record
ProgFile: array[0..254] of char

ParaFile: array[0..254] of char

DataFile: array[0..254] of char

OtherFile: array[0..254] of char

DownType: char

AppSum: array[0..2] of char

AppInfoS: pchar

end;

ZeroMemory(@AppInfoReq, SizeOf(TAppInfoReq));
ZeroMemory(@DownInfo, SizeOf(TDownInfo));
strcopy(AppInfoReq.AppName, 'app');
AppInfoReq.AppUpdate[1] := chr($01);
AppInfoReq.AppParaUpdate[1] := chr($00);
DownInfo.AppInfoS := pchar(@AppInfoReq);
strcopy(DownInfo.OtherFile, '....');
DownInfo.AppSum[2] := chr($31);
 
注意数据对齐,TAppInfoReq = record 加过PACKED成,TAppInfoReq =packed record
 
加过PACKED 后有什么区别?
 
pascal/object pascal语法中,=record 是根据intel cpu运算,按偶数字节对齐优化的计算的,但是有的时候我们需要节约内存,而不是提高速度,比如你的这个需要和c完全兼容的话,使用packed record 将按实际大小分配内存,比如
type ARecordType=record
AChar:char;
end;

type BRecordType=packed Record
BBChar:char;
CCChar:char;
end;
以上两个实际上分配内存占用 相同的大小,都是2字节.
 
packed就相当于1字节对齐,我想,原来的C程序代码里也应该也有#pragma pack(1)这样的宏的,在进行网络传输等对数据块大小要求很严格的地方要用,普通应用无此需求。你还可以在项目设置里把该项目的字节对齐方式设为1字节来达到同样的效果(不推荐)。
 
多人接受答案了。
 
后退
顶部