0 / 0 / 0
Регистрация: 08.11.2013
Сообщений: 20
|
||||||||||||||||
1 | ||||||||||||||||
Делфийская DLL и основная программа C++, передача агрументов туда-сюда08.11.2013, 19:46. Показов 2290. Ответов 35
Метки нет (Все метки)
Здравствуйте!
Имеется DLL:
Заголовок:
Почему в C++ входной параметр воспринимается как ссылка, а выходной - как ссылка ссылки? При этом, если основная прога написана на Делфи, то всё ожидаемо: и входной, и выходной параметры воспринимаются как ссылки на числа. Извращался по всякому. И cdecl ставил, и var вместо out. Один фиг... Это так задумано, или я где-то накосячил? Полдня лопатил всемирную помойку, ничего не нашёл. Подскажите, плз., если кто сталкивался.
0
|
08.11.2013, 19:46 | |
Ответы с готовыми решениями:
35
Передача агрументов в функцию Топатун с 9 на 16 место - туда:сюда Перебор элементов туда сюда Движение мувиклипа туда-сюда |
0 / 0 / 0
Регистрация: 08.11.2013
Сообщений: 20
|
|
12.11.2013, 21:52 [ТС] | 21 |
Благодарю за анализ кода.
1. Память в данном случае может выделяться только в библиотечном модуле, т.к. длина массива ищется в нём же. Поэтому освободиться она не может, т.к. значения массива должны быть переданы в основную программу. Если только попробовать фокус через SetLength(bf,0) (или в варианте С++ запись нуля по смещению ^bf[0,0,0]-4). По идее, указатель ссылается на память, выделенную в DLL, так что можно попытаться. Правда, чисто из академического интереса, практической пользы от этого никакой нет - массив и килобайта не занимает, а создаётся при работе программы один раз, ну максимум раза 4, а то и не разу. Я заметил, что единственный раз подключённый прибор занимает всегда один и тот же виртуальный COM порт, так что каждый раз при работе программы вызывать эту подпрограмму нет смысла. 2.
0
|
13.11.2013, 00:03 | 22 |
Выделять надо в программе, и там же удалять...
В dll только делать вычисления, по полученным указателям из вне. Добавлено через 3 минуты А вы уверенны что не возвращается мусор ? Я нет... Добавлено через 2 часа 4 минуты Кроме всего сказанного стоит отметить что дин.массив в Delphi не эквивалентен дин.массиву в С++. В С++ массивы не содержат счетчика ссылок и "не удаляются сами" при выходе и области видимости, память с под них нужно освобождать руками с помощью delete[]
0
|
0 / 0 / 0
Регистрация: 08.11.2013
Сообщений: 20
|
|||||||||||
13.11.2013, 11:12 [ТС] | 23 | ||||||||||
Хорошо бы. Я писал, почему в моём случае это невозможно. Поэтому и без директивы out ничего не работает.
Для этого я и создал тестовый пример, можете убедиться. Ну, я ведь в С++ и не создаю динамический массив. Проверил освобождение памяти. Добавил в конце обработчика кнопки в Делфи
При этом, 1-й вариант DLL работает более корректно, нежели 2-й. Если размер массива достаточно большой, то 2-й вариант DLL позволяет обращаться к себе только один раз, повторное обращение даёт сбой. Причём, память освобождается после первого вызова. Ну, да это всё можно посмотреть, присвоив Num:=5000000; (только надо не забыть закомментарить заполнение строк RichEdit !) В С++ обнуление кол-ва элементов и счётчика массива к освобождению памяти не приводит.
0
|
13.11.2013, 13:27 | 24 |
Именно, если в память в DLL выделяется с помощью Delphi, то программа С++ не знает как ее освободить.
Так что тут нет гарантий, зато есть предположение что есть утечка.
Сообщение от MrGalaxy;
5328355 Добавлено через 58 минут Логично по тому как в С++ нет счетчика ссылок как я писал выше, обнуление приводит к обнулению указателя а не освобождению памяти, ( т.е. к утечке)
0
|
0 / 0 / 0
Регистрация: 08.11.2013
Сообщений: 20
|
|||||||||||
13.11.2013, 15:31 [ТС] | 25 | ||||||||||
Ох уж эти указатели! Может, и правда в них разбираться начну.
Читал я Ваши посты, только не сразу догадался как передать массив по указателю. Подумал: раз Вы настаиваете, значит и правда возможно. Вот, выношу на суд общественности: DLL
Вызов из Делфи
0
|
0 / 0 / 0
Регистрация: 08.11.2013
Сообщений: 20
|
|
13.11.2013, 16:07 [ТС] | 27 |
отличий от чего?
Отличие в отсутствии out, теперь указатель на массив является входным параметром. Да, и что-то из С++ теперь перестало вызываться. Что в out некорректного? С ним работает.
0
|
0 / 0 / 0
Регистрация: 08.11.2013
Сообщений: 20
|
|
13.11.2013, 19:14 [ТС] | 29 |
А! Это - условие, по другому не будет. В том и вся сложность.
Ну это ничего страшного. Критерий - работоспособность программы, а она работает. Корректней, чем без out. Вы не пробовали оттранслировать и запустить мои проекты? Можете убедиться.
0
|
13.11.2013, 19:31 | 30 |
Выделяйте память извне с запасом из расчета максимальной длины, или в два захода сначала вызов ф-ции для поиска длины, потом самих вычислений.
Добавлено через 4 минуты На утечку памяти проверяли ? Если есть утечка, то о какой работоспособности идет речь ? Если нет, то все ок.
0
|
0 / 0 / 0
Регистрация: 08.11.2013
Сообщений: 20
|
|
14.11.2013, 09:02 [ТС] | 31 |
Один из путей. Некрасивый. И всё из-за того, что кое-кто у нас в конторе не пишет на Делфи. Второй путь, который мне тоже не очень нравится - массив заполняется, выводится на экран, оператор считывает информацию, вручную вводит куда надо, и далее идёт уже процесс автоматизированных измерений (так я поначалу написал DLL-ку и так объяснил тем, кто с ней будет работать). Потом решил поиграться, освоить технологию использования дин. массивов. Но, видимо, придётся отказаться от этой затеи, не надо умничать на ровном месте.
Делфийская DLL и основная программа C++, передача агрументов туда-сюда Не по теме: Да простят меня поклонники С++, ничего не имею против этого языка, но когда я начал писать на паскале, мне он понравился сразу. Сейчас, столкнувшись впервые с С++, получил о нём пока неприятные впечатления. Avazart, Вам огромное спасибо за потраченное на меня время, за отсутствие снобизма в общении с дилетантом, я действительно кое-чему научился за эти дни.
0
|
14.11.2013, 15:41 | 32 |
Языки разные, но тут больше принципы с которыми нужно руководствоваться при написании DLL.
C++ тут вообще никаким боком, попробуйте загрузить с C# думаю будут те же проблемы. Добавлено через 6 минут А смысл писать на Delphi если нет специалистов которые его потом будут поддерживать. Кроме того вроде как можно еще попробовать COM- технологию, но лично мне такой вариант не нравится, на мой взгляд зная полную задачу вполне достаточно обойтись DLL. Добавлено через 12 минут Будет время возможно напишу пример ...
0
|
0 / 0 / 0
Регистрация: 08.11.2013
Сообщений: 20
|
|
14.11.2013, 17:11 [ТС] | 33 |
Я предложил свои услуги в написании всей программы полностью, мне ответили, что есть программисты, они напишут, а меня привлекли как специалиста, имеющего опыт стыковки приборов с ЭВМ по КОПу. Поэтому так и получилось: я не могу писать на С, т.к. совсем его не знаю (а результат нужен как всегда вчера ), а программисты не хотят писать на Делфи по неизвестным мне причинам.
Буду ждать с нетерпением.
0
|
14.11.2013, 17:37 | 34 | |||||
Пс) Так это не выгодно для Вас, как по мне, особенно если речь о оплачиваемой работе.
Есть такая идея: Создавать массив глобально внутри DLL и будет предполагаться что, что бы очистить память необходимо вызвать специальную ф-цию очистки, которая и будет обнулять массив внутри DLL, как бы это нормально для Си, выделение памяти внутри одной ф-ции а освобождение в другой. Но обычно это делается относительно дескриптором передаваемых в ф-цию. Добавлено через 5 минут Вот пример использования Сишной библиотеки
Обычно в таких случаях, для удобства приходится еще дополнительно писать обвертку на языке программы, что бы обвернуть, к примеру, код ф-ций в класс контролирующий выделение/удаление памяти сам.
0
|
0 / 0 / 0
Регистрация: 08.11.2013
Сообщений: 20
|
|
15.11.2013, 16:55 [ТС] | 35 |
Так, наверное, и сделаю, по крайней мере, от добавления этой функции в бибилиотеку хуже не будет. Хоть мусора и мало, но, по-хорошему, надо бы его подчищать. Благодарю, попробую изучить. Добавлено через 6 часов 49 минут Ура! Посмотрите, что оказывается есть: http://docwiki.embarcadero.com... namicArray На Хоботе подсказали.
0
|
15.11.2013, 18:04 | 36 |
Отбой, такая штука, как я думаю, есть только в Еmbarcadero т.е С++Builder, кроме того мне слабо верится что его можно использовать в DLL в качестве аналога.
0
|
15.11.2013, 18:04 | |
15.11.2013, 18:04 | |
Помогаю со студенческими работами здесь
36
как крутить двигатель туда и сюда микроконтроллером Как сделать прогресс бар туда-сюда в С++ Builder 6? 1С или Веб?Не могу выбрать! Кидает туда-сюда.Сомнения Разработайте приложение, в котором от одного до другого края формы должна туда-сюда проезжать машина Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |