
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
27.06.2019, 11:55
|
|||
|---|---|---|---|
|
|||
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
Добрый день! Нужно передать статический массив в функцию и сохранить ссылку на этот массив в динамическом массиве. Насколько корректен следующий код?: Код: pascal 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. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.06.2019, 14:52
|
|||
|---|---|---|---|
|
|||
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
Belotsky SergeНасколько корректен следующий код? Для 32-битного режима корректен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.06.2019, 14:59
|
|||
|---|---|---|---|
|
|||
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
Если Вы используете код внутри цельного приложения, то не нужно передавать массив как ссылку. Используйте var. Код: pascal 1. А если Вы собрались передавать ссылку куда нибудь вроде DLL, то нет, это не покатит. Долго объяснять, но точно не покатит. Итого, в любом случае, не надо так делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.06.2019, 15:36
|
|||
|---|---|---|---|
|
|||
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
black-manateeЕсли Вы используете код внутри цельного приложения, то не нужно передавать массив как ссылку. Используйте var. Код: pascal 1. А если Вы собрались передавать ссылку куда нибудь вроде DLL, то нет, это не покатит. Долго объяснять, но точно не покатит. Итого, в любом случае, не надо так делать. Пробовал я через var , компилятор не дает. Что-то вроде того, что я не могу dynamic array присвоить static array. Можете привести полный пример на моем исходнике? Мне не хочется дублировать статический массив в памяти из-за размера. авторА если Вы собрались передавать ссылку куда нибудь вроде DLL, то нет, это не покатит. Это почему? Pointer - он и в Африке. С учетом что и dll и приложение 32-х битные, а dll еще с дополнительном ограничением, должен быть скомпилирован в среде Delphi (чтобы не заморачиваться с некоторыми дельфовыми классами типа TList) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.06.2019, 16:48
|
|||
|---|---|---|---|
|
|||
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
Belotsky SergeПробовал я через var , компилятор не дает. Что-то вроде того, что я не могу dynamic array присвоить static array. Можете привести полный пример на моем исходнике? Мне не хочется дублировать статический массив в памяти из-за размера. Да я слегонца тупанул. Не сразу понял что Вы хотите. А вот нифига я не понял: зачем такие сложности ? У Вас есть константа, ну и используйте ее в коде. Зачем ее преобразовывать в динамический массив. В Вашем случае: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Это почему? Pointer - он и в Африке. С учетом что и dll и приложение 32-х битные, а dll еще с дополнительном ограничением, должен быть скомпилирован в среде Delphi (чтобы не заморачиваться с некоторыми дельфовыми классами типа TList) Pointer в Африке pointer. А структура на которую он указывает, в Африке может сильно отличаться от таковой в Европе. К примеру Ваш TRec не объявлен как packed. Значит между поля структуры могут быть сдвинуты. string, который Вы передаете как одно из полей структуры, это по сути достаточно сложная структура, одно из полей которой ссылается на блок памяти, где значение строки определено. Но string в delphi, не может считаться dll безопасным. Структура описания строки может отличаться в зависимости от версии Delphi, настроек компиляции и т.д. В общем массив структур, некоторые из полей которых - string нельзя передавать в dll по ссылке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.06.2019, 16:56
|
|||
|---|---|---|---|
|
|||
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
Belotsky SergeС учетом что и dll и приложение 32-х битные,Так. Тут еще и dll нарисовались. Озвучьте исходную задачу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.06.2019, 17:25
|
|||
|---|---|---|---|
|
|||
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
_Vasilisk_Belotsky SergeС учетом что и dll и приложение 32-х битные,Так. Тут еще и dll нарисовались. Озвучьте исходную задачу Я делаю что-то вроде Helper'а, чтобы проще было писать исходный код в самой dll. Сам Helper описывается в главном коде и оформляется в виде record с функциями. Helper работает по данным из константного массива. Т.е. сначала 'инициализируется' Helper для заданного константного массива, затем вызываются методы Helper для выполнения определенных задач (формирования большого и сложного TList). Все это выполняется в коде dll и возвращается ссылка на этот TList (pointer). Константный массив - в виде *.inc включается каждый в свою dll. Модулей dll - несколько и каждый предназначен для загрузки из своего файла данных в этот самый унифицированный TList, который и возвращается в главную программу. Дело в том, что все это работает. Но мне лень, для каждой новой dll городить похожий код, который хочется вынести куда-то в другое место. Так понятнее? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.06.2019, 17:42
|
|||
|---|---|---|---|
|
|||
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
Belotsky SergeВсе это выполняется в коде dll и возвращается ссылка на этот TList (pointer).Привет мегаграблям! Belotsky Serge Код: pascal 1. 2. 3. 4. строки тоже передаются в/из dll? Например, в составе TList? Belotsky SergeНо мне лень, для каждой новой dll городить похожий код, который хочется вынести куда-то в другое место.Почему бы код код не вынести в отдельный Unit и в каждом проекте подключать этот юнит? Belotsky SergeДело в том, что все это работает.Повезло. Или, наоборот, не повезло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 07:21
|
|||
|---|---|---|---|
|
|||
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
Тут понимаете какое дело. Взаимодействие dll и основного приложения таит в себе кучу опасностей. Даже если Вы все делаете канонично и стандартно. string передавать в DLL нельзя. Передавать строку как PChar можно, но на всякий случай нужно убедиться, что одна из dll не будет написана на старой версии PChar, где символы однобайтные. integer передавать вроде как можно, но в одной системе это может быть 4 байта, а в другой 8. Я для в рамках своей паранойи даже доходил до такого: Код: pascal 1. 2. 3. 4. 5. И поэтому, когда я увидел как лихо Вы передаете в DLL структуры со строками, у меня волосы дыбом встали. Если не хотите длинными осенними вечерами трахаться с очень сложно вычисляемыми глюками, то постоянно думайте о возможных несоответствиях в типах. Т.е. как в анекдоте: два презерватива, затем эпоксидка, затем скотч, и главное - никакого секса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 07:33
|
|||
|---|---|---|---|
|
|||
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
_Vasilisk_Belotsky SergeВсе это выполняется в коде dll и возвращается ссылка на этот TList (pointer).Привет мегаграблям! строки тоже передаются в/из dll? Например, в составе TList? Belotsky SergeНо мне лень, для каждой новой dll городить похожий код, который хочется вынести куда-то в другое место.Почему бы код код не вынести в отдельный Unit и в каждом проекте подключать этот юнит? Belotsky SergeДело в том, что все это работает.Повезло. Или, наоборот, не повезло Нет, строки в TList для главного проекта не передаются, там все канонически. Строки содержатся только в константном массиве. Пришел к выводу, что проще и надежнее оформить хелпер в виде отдельного модуля, который будет 'цеплять' каждая dll, которой это нужно. Ну а константный массив проще передавать по ссылке каждый раз в функцию хелпера (таких функций немного). Тут вы правы насчет отдельного юнита. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 08:08
|
|||
|---|---|---|---|
|
|||
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
Belotsky SergeПришел к выводу, что проще и надежнее оформить хелпер в виде отдельного модуля, который будет 'цеплять' каждая dll, которой это нужно. Ну а константный массив проще передавать по ссылке каждый раз в функцию хелпера (таких функций немного). Тут вы правы насчет отдельного юнита. PS: тут я ошибся, константный массив нельзя передать по ссылке :( Т.е. каждый раз будет "забиваться" стек функции значениями константного массива. Видимо придется использовать схему как в первом посте. Что же делать, кругом засада :( Модуль хелпера не может содержать константный массив. Но он ему нужен для работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 10:21
|
|||
|---|---|---|---|
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
Belotsky Serge, Нельзя присваивать динамические массивы как ДинамическийМассив := УказательНаСтатический, потому что динамический массив - это указатель на структуру (как и строки), а статический - просто область в памяти. Поэтому когда компилятор попытается что-то изменить в этом динамическом массиве - он будет писать в память где, по его мнению, находится служебная информация, а на самом деле - хрен знает что (другие переменные). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 10:23
|
|||
|---|---|---|---|
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
black-manateeТут понимаете какое дело. Взаимодействие dll и основного приложения таит в себе кучу опасностей. Даже если Вы все делаете канонично и стандартно. string передавать в DLL нельзя. Передавать строку как PChar можно, но на всякий случай нужно убедиться, что одна из dll не будет написана на старой версии PChar, где символы однобайтные. integer передавать вроде как можно, но в одной системе это может быть 4 байта, а в другой 8. Я для в рамках своей паранойи даже доходил до такого: Да вот это точно паранойя и эпоксидка с "никакого секса". Совместимость PChar достигается явным указанием PAnsi/WideChar, integer ни в какой системе не меняет размера, а тот тип, что меняет (Nativeint) по определению совпадает у либы и хост-приложения, т.к. разные разрядности система в принципе не даст подружить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 12:10
|
|||
|---|---|---|---|
|
|||
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
Василий 2Да вот это точно паранойя и эпоксидка с "никакого секса". Совместимость PChar достигается явным указанием PAnsi/WideChar Именно это я собственно и имел ввиду вообще то, что PChar использовать не стоит Василий 2integer ни в какой системе не меняет размера, а тот тип, что меняет (Nativeint) по определению совпадает у либы и хост-приложения, т.к. разные разрядности система в принципе не даст подружить Да, Embarcadero оставила integer 4-х байтным. Видимо для совместимости. Да только это решение нифига не было очевидным. И есть ненулевая вероятность, что это изменится. Кроме того, Вы можете к примеру в 32 битном приложении присваивать pointer-у integer, а потом перекомпилить под Win64. Очевидно у Вас будут проблемы. Я к тому, что лучше потратить полчаса, чтобы подумать над потенциальной совместимостью типов для разных платформ, версий и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 14:17
|
|||
|---|---|---|---|
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
black-manateeДа, Embarcadero оставила integer 4-х байтным. Видимо для совместимости. Да только это решение нифига не было очевидным. И есть ненулевая вероятность, что это изменится. Кроме того, Вы можете к примеру в 32 битном приложении присваивать pointer-у integer, а потом перекомпилить под Win64. Очевидно у Вас будут проблемы. Я к тому, что лучше потратить полчаса, чтобы подумать над потенциальной совместимостью типов для разных платформ, версий и т.д. Мало что может быть менее очевидным, чем внезапно сделать integer платформозависимым. Для этих целей есть специально так названные Native типы (даже укуренные сишники и то по большей части соблюдают разумный порядок - size_t, INT_PTR и т.д.). Вот со string/PChar так поступили, и до сих пор такие вопросы всплывают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 14:47
|
|||
|---|---|---|---|
|
|||
передача статического массива в функцию с сохранением ссылки на него как на динамический |
|||
|
#18+
Василий 2Мало что может быть менее очевидным, чем внезапно сделать integer платформозависимым. Изначально integer - это значение, целиком располагавшееся в регистре процессора. В первых версиях turbo паскаля - integer был 16 битным. В любом случае, если Вы учтете этот нюанс, хуже Вы точно не сделаете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=58&mobile=1&tid=2039321]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
149ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 193ms |
| total: | 406ms |

| 0 / 0 |
