c++ - 如何在 C++ 中制作与 Delphi 中类似的结构
问题描述
我的程序通过WM_COPYDATA
包含一个指向结构的指针来接收消息,该结构在 Delphi 中看起来像这样:
type
arr_geo_t = array[0..5000] of packed record
nr : string[15];
x,y,h : double;
k : string[10];
end;
parr_geo_t = ^arr_geo_t;
问题是,如何在 C++ 中制作类似的?
当我定义这样的东西时:
typedef struct
{
char nr[5000][15];
double x[5000];
double y[5000];
double h[5000];
char k[5000][10];
} arr_geo_t, *parr_geo_t;
并尝试检索数据,我什么也没得到。
解决方案
在 Delphi 代码中,arr_geo_t
是匿名类型的记录数组,而不是数组记录,就像您在 C++ 代码中声明的那样。Delphi 声明的正确 C++ 翻译看起来更像这样:
#include <pshpack1.h> // #pragma pack(push, 1), etc
typedef struct
{
char nr[16];
double x,y,h;
char k[11];
} arr_geo_t[5001];
#include <poppack.h> // #pragma pack(pop), etc
typedef arr_geo_t *parr_geo_t;
请注意,Delphi 数组范围是包含在内的,因此0..5000
表示从索引 0 到索引 5000(含)索引的 5001 个元素。
另请注意,char[]
数组中还有 1 个char
您没有考虑在内。这是因为在 Delphi 中, astring[N]
是一个ShortString,一个AnsiChar
基于 - 的固定长度字符串类型,其中s 是允许N
的最大数量AnsiChar
,并且以 1 为前缀,AnsiChar
指定字符串中有多少个实际 AnsiChar
s。字符串长度在索引 0 处,字符数据从索引 1 开始。
如果您专门将 Delphi 代码转换为 C++Builder,则可以使用SmallString
模板而不是char[]
数组:
#include <System.hpp>
#include <pshpack1.h> // #pragma pack(push, 1), etc
typedef struct
{
System::SmallString<15> nr;
double x,y,h;
System::SmallString<10> k;
} arr_geo_t[5001];
#include <poppack.h> // #pragma pack(pop), etc
typedef arr_geo_t *parr_geo_t;
如果你翻译成 C++11 或更高版本,你可以通过语句清理typedef
s :using
#include <array>
//#include <System.hpp>
#include <pshpack1.h> // #pragma pack(push, 1), etc
struct arr_geo_data_t
{
std::array<char, 16> nr; // or: System::SmallString<15> nr;
double x,y,h;
std::array<char, 11> k; // or: System::SmallString<10> k;
};
#include <poppack.h> // #pragma pack(pop), etc
using arr_geo_t = std::array<arr_geo_data_t, 5001>;
using parr_geo_t = arr_geo_t*;
推荐阅读
- javascript - 在以逗号分隔的字符串中的每四个字符后添加连字符
- python - Keras 进度条显示什么?
- javascript - 邮递员:TypeError:User.findOne 不是函数
- vba - 如果另一个单元格具有特定值,则想要禁用单元格编辑
- solidity - 在构造函数中设置默认值
- javascript - 使用分页时如何在 Webix 数据表中重新加载当前页面?
- java - 给定服务器端可用的字节数组和内容类型,如何使休息服务顺利下载?
- c# - 在 Visual Studio 中添加类时将默认类类型设置为 C# 类
- delphi - 错误消息 = 找不到 -lbz2 的库
- javascript - 使用jquery根据日期选择选项