Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 1

Указатель на массив, элементами которого являются указатели на структуру (перевод с Delphi) )

19.03.2016, 17:49. Показов 3010. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код на Pascal. Это dll которая реализует функцию SomeName. SomeName вызывается сторонней программой, к которой подключена эта dll.
Этот код отлично работает.

Delphi
1
2
3
4
5
6
7
8
9
  PInfo = ^TInfo;                       // указатель на структуру TInfo
  TInfo = packed record                 // сама структура TInfo
    Size       : Word;
    SomeData   : Int64;
  end;
 
  PInfoArray=^TInfoArray;               // указатель на массив TInfoArray
  
  TInfoArray=array[0..$FFFF] of PInfo;  // Массив, каждым элементом которого является указатель на структуру TInfo
Эти типы данных нужны для того что бы использовать их в функции

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
function SomeName(Count: DWORD; ListOfData: PInfoArray): Integer; stdcall; export;
var
  PData:PInfo;
  i:Integer;
begin
   for i:=0 to Count-1 do
    begin
      PData:=ListOfData^[i];
      LogWrite('Size='+IntToStr(PData^.Size)
      +' SomeData='+IntToStr(PData^.SomeData),0);
    end;
  Result:=0;
end;
Т.е. при вызове функции из вне, в нее передается указатель на массив, элементами которого являются указатели на структуру типа TInfo. Так же передается количество элементов массива (Count).
В теле функции организуем цикл по всем элементам массива, в переменную PData (указатель на структуру типа TInfo) помещаем очередной указатель из массива и далее, через разыменование указателя, добираемся до данных.

Нужно переписать код dll на С++ (использую Builder 6).
Со структурой TInfo все понятно:
C++
1
2
3
4
5
struct TInfo
{
    unsigned short int  Size;
    __int64             SomeData;
}
С массивом указателей начинаются трудности. Пробую так
C++
1
TInfo *TInfoArray[10];      //известно что элементов у массива не более 10
Но похоже что тут я не прав и фактически у меня получается указатель на массив, а не массив указателей
Пробовал разные другие варианты, но там все еще печальнее. Например, заводим структуру PInfo, элементом которой является указатель на TInfo. Затем завожу массив типа TInfo и пытаюсь работать с указателем на него.
Ну и дальше все идет кувырком, после разыменования я получаю полную чушь вместо ожидаемых данных.

Как правильно реализовать это на С++?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.03.2016, 17:49
Ответы с готовыми решениями:

Массив: создать одномерный массив, элементами которого являются двумерные массивы, элементами которых являются записи
создать одномерный массив, элементами которого являются двумерные массивы, элементами которых являются записи с полями целочисленного,...

Массив, элементами которого являются массивы
на загрузку страницы пишу private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page...

Дан массив A(N) (N - четное). Сформировать массив B(M), элементами которого являются средние арифметические
Помогите решить задачу,пожл! Дан массив A(N) (N - четное). Сформировать массив B(M), элементами которого являются средние арифметические...

1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33192 / 21488 / 8233
Регистрация: 22.10.2011
Сообщений: 36,870
Записей в блоге: 12
19.03.2016, 18:31
Сам Билдер переводит этот Дельфийский код так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct TInfo;
typedef TInfo *PInfo;
 
#pragma pack(push,1)
struct DECLSPEC_DRECORD TInfo
{
    
public:
    System::Word Size;
    __int64 SomeData;
};
#pragma pack(pop)
 
 
typedef System::StaticArray<PInfo, 65536> TInfoArray;
 
typedef TInfoArray *PInfoArray;
(по крайней мере XE2)

Создай простой pas-модуль:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
unit one;
 
interface
 
uses windows;
 
type
  PInfo = ^TInfo;
 
  TInfo = packed record
    Size: Word;
    SomeData: Int64;
  end;
 
  PInfoArray = ^TInfoArray;
 
  TInfoArray = array [0 .. $FFFF] of PInfo;
 
function SomeName(Count: DWORD; ListOfData: PInfoArray): Integer; stdcall;
 
implementation
 
function SomeName(Count: DWORD; ListOfData: PInfoArray): Integer; stdcall;
begin
end;
 
end.
, подключи его к своему проекту и откомпилируй. Билдер создаст hpp-файл со всеми аналогичными определениями типов, но на С++
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.03.2016, 18:31
Помогаю со студенческими работами здесь

Сформировать массив IM( 50 ) ,элементами которого являются числа 1,3,5,…,49,50,48,46 ,…,2
Сформировать массив IM( 50 ) , элементами которого являются числа 1 , 3 , 5 , … , 49 , 50 , 48...

Массив: Создать новый массив, элементами которого являются все отрицательные элементы массива C
1)Дан массив C(n). Создать новый массив, элементами которого являются все отрицательные массива C.

Дан массив A(N) (N – четное). Сформировать массив В(М), элементами которого являются средние арифметические соседних
Дан массив A(N) (N – четное). Сформировать массив В(М), элементами которого являются средние арифметические соседних пар рядом стоящих в...

Сформировать массив А, элементами которого являются элементы R (I) =2 и массив B
5. Дан массив R из N элементов. Сформировать массив А , элементами которого являются элементы R(I)=2 и массив B, в котором B(I)=R(I), если...

Дан массив A(n). Создать новый массив , элементами которого являются произведения A(i) на максимальный элемент массива A
Дан массив A(n). Создать новый массив , элементами которого являются произведения A(i) на максимальный элемент массива A


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru