Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Ошибка в передаче конкретной строки в библиотеку на C++ через структуру (Type)
|
|||
|---|---|---|---|
|
#18+
Уважаемые знатоки, возникла не понятная для меня проблема с передачей данных из программы пишущейся на VB6 в библиотечную функцию пишущуюся на C++ и компилированную MinGW (codeblocks). передача осуществляется посредством передачи адреса на структуру: С++: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. VB6: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Все работает отлично пока не начинается обращение к ostrovodrinstruct::order, переданной в библиотечную функцию, внутри самой библиотеки - когда библ.функция доходит до обращения к переменной то VB программа выдает ошибку: Инструкция по адресу "0x..." обратилась к памяти по адресу "0x...". Память не может быть "read" "OK" -- завершение приложения "Отмена" -- отладка приложения После нажатия "OK" среда VB6 в которой приоизводился запуск вылетает. Пробовал в структуру добавлять еще одно поле в конце без его использования - ошибку не выдает за то order пустое. Пробовал вызывать библиотеку из программы написанной на C++ - все работает отлично, но библиотека должна использоваться именно для программы на VB6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2009, 20:28 |
|
||
|
Ошибка в передаче конкретной строки в библиотеку на C++ через структуру (Type)
|
|||
|---|---|---|---|
|
#18+
nrmBeginner, проявляется ли ошибка, если поле double area сделать в структуре первым, а не шестым? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2009, 23:28 |
|
||
|
Ошибка в передаче конкретной строки в библиотеку на C++ через структуру (Type)
|
|||
|---|---|---|---|
|
#18+
Весьма странно, но сработало. А почему так, что это баг, правило языка? char * order сработала, а вот теперь появилась другая не менее смешная проблема: данные из этой структуры попутались в памяти с данными другой структуры: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Структуры передаются разными библиотечными функциями. В inhs(1 и 2).fio почемуто данные из строки принадлежащей odrin.order, а в inhs(1 и 2).relationship данные из odrin.street. Я проверял, до передачи структур в библиотечные функции все данные правильны, а после передачи, данные внутри функции испорчены, а в вызывающей программе по завершении библиотечной процедуры, в своих структурах данные правильные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2009, 21:18 |
|
||
|
Ошибка в передаче конкретной строки в библиотеку на C++ через структуру (Type)
|
|||
|---|---|---|---|
|
#18+
nrmBeginnerВесьма странно, но сработало. А почему так, что это баг, правило языка?Нет, не странно. Надо соблюдать соглашения по передаче параметров. Для параметров-структур существуют такие понятия как выравнивание членов структуры и выравнивание самой структуры. За первое в MSVC (про MinGW не знаю) отвечают прагма pack() и/или ключ компилятора /Zp n , за второе - описатель __declspec(align(#)). Подробности здесь . Для передачи/приёма структур в/из процедуры VB надо для членов структур использовать выравнивание 4 (вероятно, в MinGW по умолчанию стоит 8), выравнивание структуры явно не указывать (в этом случае будет выравниваться автоматически по максимальному выравниванию своих членов). Итого: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... Структуры передаются разными библиотечными функциями. В inhs(1 и 2).fio почемуто данные из строки принадлежащей odrin.order, а в inhs(1 и 2).relationship данные из odrin.street. Я проверял, до передачи структур в библиотечные функции все данные правильны, а после передачи, данные внутри функции испорчены, а в вызывающей программе по завершении библиотечной процедуры, в своих структурах данные правильные.Возможно, неправильно передаёте массив. Приведите описания данных и функций на обоих сторонах и код вызова хотя бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2009, 02:05 |
|
||
|
Ошибка в передаче конкретной строки в библиотеку на C++ через структуру (Type)
|
|||
|---|---|---|---|
|
#18+
БенедиктНадо соблюдать соглашения по передаче параметров Где про это можно почитать не подскажете? Только по русски по возможности,а то я по английски со словарем читаю. И если располагаете информацией о том где можно прочитать грамотную информацию о том что есть выравнивание и с чем его едят. Читал что для повышения быстродействия выравнивют данные к четным адресам когда пишут на ассемблере, но вижу этого не достаточно знать. БенедиктПриведите описания данных и функций на обоих сторонах и код вызова хотя бы. c++: Код: plaintext 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. vb: Код: plaintext 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. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2009, 20:52 |
|
||
|
Ошибка в передаче конкретной строки в библиотеку на C++ через структуру (Type)
|
|||
|---|---|---|---|
|
#18+
Наверно этого не достаточно, вот еще: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2009, 12:03 |
|
||
|
Ошибка в передаче конкретной строки в библиотеку на C++ через структуру (Type)
|
|||
|---|---|---|---|
|
#18+
nrmBeginnerГде про это можно почитать не подскажете?В документации по используемому компилятору.nrmBeginnerТолько по русски по возможности,а то я по английски со словарем читаю.Не знаю, где можно почитать по-русски. Возможно, в книгах по C++. Поиском находятся темы в форумах, но это неофициальная информация, подходить к ней надо критически. Могу посочувствовать - сам начинал со чтения со словарём. Потом без словаря. Потом стал английскую документацию стал читать быстрее чем русскую, т. к. она компактнее, не содержит ошибок перевода и сомнительных терминов.nrmBeginnerИ если располагаете информацией о том где можно прочитать грамотную информацию о том что есть выравнивание и с чем его едят.Я дал ссылку. Попробуйте для начала не обращать внимание на __declspec(align(#)) и понять 4 правила, описанные после слов "To summarize". По коду. 1) Непонятно, было ли применено выравнивание структур в коде на C++. 2) Описание структуры inhabitantsstruct в VB не соответствует описанию в C++. 3) Да, "этого не достаточно" было. С кодом addinhabitant() стало понятно, в чём дело. Первая ошибка идеологическая. Если Вы создаёте некий контейнер (в данном случае inhabitants[]), то храните в нём либо копии объектов, либо ссылки на объекты которые не могут быть уничтожены без ведома контейнера. У вас ни то, ни другое, и имеет место Вторая ошибка - техническая. Строки переменной длины VB в мире C/C++ называются BSTR. При передаче их во внешние функции VB преобразует BSTR во временный ABSTR. В принципе, можно интерпретировать BSTR и ABSTR как wchar_t* и char* соответственно, хотя реальная картина сложнее. Но после вызова внешней функции временный ABSTR уничтожается. Т. е. сохранённые в контейнере char* указывают уже в никуда, по большому счёту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2009, 18:10 |
|
||
|
|

start [/forum/topic.php?fid=60&gotonew=1&tid=2160593]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
33ms |
get topic data: |
12ms |
get first new msg: |
9ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 228ms |
| total: | 380ms |

| 0 / 0 |
