powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
25 сообщений из 27, страница 1 из 2
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34787114
vas177
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DLL на C++, приложение на Delphi. Функция в DLL должна вернуть список данных в виде массива указанной структуры.

Допустим вот такая простая структура, зато в которой и строка и число есть:

C++:
Код: plaintext
1.
2.
3.
struct TPerson {
	char *szName;
	int iAge;
};

Delphi:
Код: plaintext
1.
2.
3.
TPerson = record
	szName: PChar;
	iAge: Integer;
end;

Требуется: Функция в DLL должна вернуть список всех найденных людей в виде массива указанной структуры.
Причём размер массива заранее не известен, в том числе может быть и нулевым.
Как это правильно сделать, чтобы работало из Delphi и не было разнообразных утечек памяти.
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34787131
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, тебе надо добиться, чтобы компиляторы использовали одинаковое выравнивание. Проверить это проще всего, сравнив sizeof (TPerson). В дельфе можно отменить выравнивание, сказав packed record, в C++ для этого кажется соответствующая прагма.

Во-вторых, тебе нужно, чтобы для выделения и освобождения использовался один и тот же менеджер памяти. Это можно сделать несколькими путями, например:

- подключить в DLL дельфовые функции GetMem/FreeMem
- использовать для выделения и освобождения функции Win API
- по завершении работы со структурой передать ее функции "освободить", также расположенной в DLL.

Последний путь - пожалуй, наиболее правильный.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
+- Начало выделенного куска --
| Первый элемент массива, указатель на первую строку 
| Второй элемент массива, указатель на вторую строку
.....
| Последний элемент массива, указатель на последнюю строку
| Первая строка
| Вторая строка
.....
| Последняя строка
+- Конец выделенного куска --
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34788476
vas177
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смысл третьего варианта понятен.

Хотелось бы ответ получить наглядным примером. Или подскажите, где его можно найти. Книги листал, везде только простые примеры приводят.
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34789427
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas177Допустим вот такая простая структура, зато в которой и строка и число есть:Это не простая структура. Указатель всегда указывает на какой-то участок памяти, а этот участок памяти кому-то принадлежит. Передавая указатели тебе всегда надо помнить кому эта память принадлежит. Лучше положить внутрь структуры массив char'ов.

А за примерами - ну вот возьми Far, и посмотри его плагинную систему. Там есть примеры писания аналогичных dll'ек и на Си, и на Дельфях.
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34789996
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЭто не простая структура.
Хм.

White OwlЛучше положить внутрь структуры массив char'ов.
И начать очередную серию идиотских проблем вида "в нашей системе имя может быть максимум 20 символов"?
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34790591
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer wrote:

> И начать очередную серию идиотских проблем вида "в нашей системе имя
> может быть максимум 20 символов"?
>
По-моему, лучше тогда будет, если эти структуры будут жить внутри
библиотеки, и создавасться/уничтожаться ей же. Т.е. мендежеры памяти
будут раздельные.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34790669
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVПо-моему, лучше тогда будет, если эти структуры будут жить внутри
библиотеки, и создавасться/уничтожаться ей же.
Я назвал этот вариант как предпочтительный.

ErVТ.е. мендежеры памяти будут раздельные.
Но в целом тут вопрос. Имхо, правильный ответ зависит от архитектуры решения в целом. Если это "маленький плагин к большой системе", то пусть он лучше будет замкнутым и самодостаточным. А если система в целом плагинная, лучше опубликовать общее API в том числе менеджера памяти.
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34790810
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer wrote:

> Но в целом тут вопрос. Имхо, правильный ответ зависит от архитектуры
> решения в целом. Если это "маленький плагин к большой системе", то
> пусть он лучше будет замкнутым и самодостаточным. А если система в
> целом плагинная, лучше опубликовать общее API в том числе менеджера
> памяти.
>
Логично, полностью согласен.
Я просто исходил из предположения, что система небольшая.(например,
дельфийские GUI/C++ движок для небольшого приложения)
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34791847
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
использовать для размещения передаваемых данных default process heap, тогда память можно будет освобождать где угодно.
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34792545
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer White OwlЭто не простая структура.
Хм.Есть такое правило для коммуникационных протоколов: все данные для сообщения должны хранится в самом сообщении. Нарушение этого правила приводит к необходимости организовывать общую память для отправителя и получателя, и организовывать систему управления этой общей памятью. В твоем первом сообщении в этом топике ты уже предлагал несколько решений как сделать эту самую разделяемую память.

softwarer White OwlЛучше положить внутрь структуры массив char'ов.
И начать очередную серию идиотских проблем вида "в нашей системе имя может быть максимум 20 символов"?В случае такой структуры сообщения - да, эта проблема будет. Ее можно решить выделив заранее достаточно большой буфер, либо пересортировать структуру - элементы с фиксированым размером в начало, массивы с изменяем размером в конец и добавить в начало элементы - размер_такого_то_массива.
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34792720
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl wrote:

> В случае такой структуры сообщения - да, эта проблема будет. Ее можно
> решить выделив заранее достаточно большой буфер
Можно изменить сам тип сообщения на нечто вроде:
Код: plaintext
1.
2.
3.
4.
5.
struct TPerson {
        int size;
        int iAge;
        char szName[ 0 ];
};
Выделять под неё память чем-то вроде malloc/getMem, и писАть szname в
хвост. но только тогда придется по нему гулять адресной арифметикой,
что под дельфей будетт не совсем удобно. Или можно свалить все в один
большой буфер, в начале которого будут идти сами записи, а в конце -
строки, а вместо PChar будет смещение к нужной строке, в байтах, от
начала буфера. Можно даже просто банально сохранить все строки в конце
блока памяти, и использовать PChar вместо смещений. Тогда, возможно,
потребуется меньше выкрутасов для освобождения памяти для строк. Хотя,
если строки надо менять, то болты. (с другой стороны, pchar как бы для
этого не совсем подходит).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34792724
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV> В случае такой структуры сообщения - да, эта проблема будет. Ее можно
> решить выделив заранее достаточно большой буфер
Можно изменить сам тип сообщения на нечто вроде:Я ж именно про это и говорил? Сразу после процитированного куска :)
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34792741
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЕсть такое правило для коммуникационных протоколов: все данные для сообщения должны хранится в самом сообщении. Нарушение этого правила приводит к необходимости организовывать общую память для отправителя и получателя, и организовывать систему управления этой общей памятью. В твоем первом сообщении в этом топике ты уже предлагал несколько решений как сделать эту самую разделяемую память.
Извини, но тебя куда-то понесло. Попробую ответить тебе в твоей терминологии: "самим сообщением" в данном случае является указатель на массив структур. И именно адресованный массив хранится в общей памяти итп. Модификация предложенного тобой типа в данном случае никак не влияет на необходимость организации общей памяти и применения названных мной (или других) методов.

Надеюсь, ты не пытаешься намекнуть на желательность передачи массива структур по значению. Это, конечно, решит задачу освобождения памяти, но это единственное достоинство такого решения....

White Owlлибо пересортировать структуру - элементы с фиксированым размером в начало, массивы с изменяем размером в конец и добавить в начало элементы - размер_такого_то_массива.
И мы придем к нарисованному мной куску памяти.
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34792748
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVно только тогда придется по нему гулять адресной арифметикой,
что под дельфей будетт не совсем удобно.
Под дельфей это не менее удобно, чем под си, но смысла в этом в данном случае нет. Точнее, он может быть в том случае, если алгоритм формирования массива окажется неудобен для формирования структуры наподобие нарисованного мной куска памяти.

ErVа вместо PChar будет смещение к нужной строке, в байтах,
И получим лишний геморрой на пустом месте. Буфер нам все равно потребуется освобождать, а раз так, эта конструкция по сравнению с моей имеет единственное "достоинство" - усложненный доступ к строкам.

ErVМожно даже просто банально сохранить все строки в конце блока памяти, и использовать PChar вместо смещений.
Странным путем пришли к моей конструкции :) Очень странным путем :))

ErVТогда, возможно, потребуется меньше выкрутасов для освобождения памяти для строк.
Тогда потребуется ноль выкрутасов.
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34792750
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl wrote:

> Я ж именно про это и говорил?
Пардон. Прочел первую фразу, развил идею, в результате получилось то же
самое :).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34792938
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerИзвини, но тебя куда-то понесло. Попробую ответить тебе в твоей терминологии: "самим сообщением" в данном случае является указатель на массив структур. И именно адресованный массив хранится в общей памяти итп.эээээ..... да конечно.
НО! Здесь есть один подводный камешек: когда люди работают с указателем на структуру они обычно помнят о том что это указатель и с памятью надо быть аккуратными. А вот когда дело касается строк - есть тенденция забывать про это... Особенно если строки кидаются между разными языковыми системами. Ну и во вторых, одно дело работать со многими отдельными кусками памяти (один кусок на массив и по кусочку на каждую строку в каждом элементе массива) либо с одним единственным куском.
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34792947
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlА вот когда дело касается строк - есть тенденция забывать про это...
И при этом писать на сях? В этом случае можно уже не заботиться о передаче информации между модулями :)

White OwlНу и во вторых, одно дело работать со многими отдельными кусками памяти (один кусок на массив и по кусочку на каждую строку в каждом элементе массива) либо с одним единственным куском.
И какое отношение эти разные дела имеют к обсуждаемому вопросу?
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34793867
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЕсть такое правило для коммуникационных протоколов: все данные для сообщения должны хранится в самом сообщении. Нарушение этого правила приводит к необходимости организовывать общую память для отправителя и получателя, и организовывать систему управления этой общей памятью.отправитель и получатель находятся в одном процессе, в рамках которого системой уже предоставляется общая память и система управления ею.
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34795618
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer White OwlА вот когда дело касается строк - есть тенденция забывать про это... И при этом писать на сях? В этом случае можно уже не заботиться о передаче информации между модулями :)Не на сях, а на дельфях и сях, смотри начальный вопрос топика.

softwarer White OwlНу и во вторых, одно дело работать со многими отдельными кусками памяти (один кусок на массив и по кусочку на каждую строку в каждом элементе массива) либо с одним единственным куском.И какое отношение эти разные дела имеют к обсуждаемому вопросу?Те же самые - с одним куском работать проще.
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34795649
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНе на сях, а на дельфях и сях
Ты так говоришь, словно для "супа с грибами и картошкой" поганки отфильтровывать необязательно.

White OwlТе же самые - с одним куском работать проще.
И кто мешает работать с одним куском, не влезая в описанный тобой геморрой?
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34795690
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer White OwlТе же самые - с одним куском работать проще.
И кто мешает работать с одним куском, не влезая в описанный тобой геморрой?А какой геморрой я описывал? Ладно, судя по тому что я начинаю терять нить флейма - флейм пора прекращать :)
Подытожу - лично для меня, при писании в нескольких средах, намного удобнее будет вставлять строки в структуру целиком а не класть в структуру указатель на внешнюю строку. Проще работать потому что.
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34795714
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlА какой геморрой я описывал?
Структуру хранения, не обеспечивающую произвольный доступ к элементам.

White OwlПодытожу - лично для меня, при писании в нескольких средах, намного удобнее будет вставлять строки в структуру целиком а не класть в структуру указатель на внешнюю строку. Проще работать потому что.
Следует ли понимать так, что при работе в одной среде структура таки будет нормальной?
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34795726
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer White OwlА какой геморрой я описывал?
Структуру хранения, не обеспечивающую произвольный доступ к элементам.Такую фигню я никак не мог описывать! Либо кто-то плохо читает... либо кто-то плохо пишет :)
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34795739
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlТакую фигню я никак не мог описывать! Либо кто-то плохо читает... либо кто-то плохо пишет :)
Однако, описал: http://www.sql.ru/forum/actualthread.aspx?tid=471697#4652211 , последняя строка.

Представь себе, что тебе надо уложить, например, 10 строк. Ты "пересортировал структуру" - то есть сделал сначала 10 int-ов с "размерами каждого массива", затем сами символы. Каким образом ты выполнишь операцию "вернуть шестую строку" не делая цикла по предыдущим индексам?
...
Рейтинг: 0 / 0
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
    #34795785
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerПредставь себе, что тебе надо уложить, например, 10 строк. Ты "пересортировал структуру" - то есть сделал сначала 10 int-ов с "размерами каждого массива", затем сами символы. Каким образом ты выполнишь операцию "вернуть шестую строку" не делая цикла по предыдущим индексам?Я не могу представить себе зачем бы понадобилось передвать десяти-элементный массив, а потом обращаться к шестому элементу. В нормальной ситуации ты как раз будешь проходить по всему массиву элемент за элементом.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]