![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
кмс |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 12.2.2009 Где: Казахстан Репутация: 1 Всего: 2 |
Здравствуйте.
Столкнулся с непонятным явлением ![]() Использую для работы с ком портом готовый компонент. Имеется такой код:
Выдает ошибку Access violation. Протрассировал в отладчике, после задания размера массива, массив как и положено имеет заданный размер. Но дальше интересное, доходит до чтения с ком порта, даже не пытается читать, сразу без задержки пролетает и тут сразу массив становится как бы не с нулевым размером или как правильно назвать не знаю. Ну вообщем как будто я ему не задавал размер через SetLength. Ну и сообсно при проверки массива вылетает ошибка. Если массив обьявляю как
то все норм. В чем может быть проблема? PS: Delphi XE |
||||
|
|||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 4 Всего: 146 |
в том что данных для чтения нет в ComPort1, и метод Read отдает пустой массив .... а обращаться к пустому месту нельзя!
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
кмс |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 12.2.2009 Где: Казахстан Репутация: 1 Всего: 2 |
Тут как раз наоборот, если данных для чтения нету, то и ошибки нету и Comport1.Read честно пытается прочитать данные. А вот если данные есть то тут и выскакивает ошибка. Вообщем динамический массив мне не особо нужен был, так как его размер всегда одинаков, решил использовать его только для того что бы он перед чтением из порта всегда нулями был забитый. Сделал его статистическим и просто в цикле заполняю его нулями. Просто интересно стало, в чем такая проблема. Но скорее всего компонент для работы с портом просто не может работать с динамическим массивом. Хотя почему не знаю. |
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
Вместо
надо
Иначе принятые байты записываются совсем не туда, куда нужно. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
кмс |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 12.2.2009 Где: Казахстан Репутация: 1 Всего: 2 |
northener, так работает
![]() А у меня все работало и как ComPort1.Read(ByteArray, 15); Ну кроме этого случая ![]() Спасибо, сейчас везде переделаю ![]() |
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
Со статическим массивом да. В случае статического массива функция Read(ByteArray, 15) получает первым параметром именно адрес первого байта самого массива. В случае же динамического массива функция Read(ByteArray, 15) получает первым параметром адрес переменной, которая хранит адрес первого байтп массива. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
кмс |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 12.2.2009 Где: Казахстан Репутация: 1 Всего: 2 |
Ясно, спасибо. Как оказалось мне и исправлять нечего, это было единственное место с Comport.Read остальное читалось как Comport.ReadStr
|
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Непрааально ты, Дядя Федор, бутерброд ешь ![]() Не стоит бы использовать ReadStr, особенно в D2009 Up. Потому что (скорее всего - не знаю, что за компонент используется) этот метод вернет данные в AnsiString, а в своем коде идет работа со string. Всего-навсего одно неявное преобразование, а получаем отличное искажение принятых данных. |
|||
|
||||
кмс |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 12.2.2009 Где: Казахстан Репутация: 1 Всего: 2 |
Я давно работу с портом писал, уже и забыл что там точно, но проблем не было, а данных там много гоняется туда-сюда.
Но думаю сейчас самое время пересмотреть что я там понаписал и если нужно исправить ![]() А делал работу со строками именно по тому что мне нужно строковые данные из порта, показалось что проще сразу строки читать чем байты а потом преобразовывать в строки ![]() |
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
ReadStr в любом случае не стоит использовать. Хоть в Д2009-Плюс, хоть в Д7-Минус. Имхо, неправильно работать с СОМ-портом в синхронном режиме, а процедуры такого типа как правило в этом режиме и работают. При том что и микросхема СОМ-порта (нынче зашитая в материнку) и его драйвер имеют все возможности для асинронного режима.
Нужны строковые данные - мспользуй в качесиве буфера строку. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |