首页 > 解决方案 > 如何在 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;

并尝试检索数据,我什么也没得到。

标签: c++delphi

解决方案


在 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指定字符串中有多少个实际 AnsiChars。字符串长度在索引 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 或更高版本,你可以通过语句清理typedefs :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*;

推荐阅读