В коде Delphi arr_geo_t
- это массив записей анонимного типа, а не запись массивов, как вы объявили в своем коде C ++. Правильный перевод C ++ объявлений Delphi будет выглядеть примерно так:
#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
обозначает 5001 элемент, проиндексированный от индекса 0 до индекса 5000, включительно.
Также обратите внимание, что в массивах char[]
есть еще 1 char
, которые вы не учитываете. Это связано с тем, что в Delphi string[N]
представляет собой ShortString , строковый тип фиксированной длины на основе AnsiChar
, где N
является максимальным числом AnsiChar
s разрешено и имеет префикс 1 AnsiChar
, указывающий, сколько фактических AnsiChar
s в строке. Длина строки равна индексу 0, а символьные данные начинаются с индекса 1.
Если вы переводите код Delphi специально в C ++ Builder, вы можете использовать SmallString
* Шаблон 1026 * вместо 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*;