|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.01.2008, 08:52 | #1 |
Баламучу слегка...
Участник клуба
Регистрация: 01.11.2006
Сообщений: 1,585
|
Массивы
В общем проблема такого характера... По клику на кнопке вызывается некоторая функция WinAPI, которая помимо всего прочего возвращает указатель на массив байт. Этот массив мне необходимо интерпретировать как массив структур заданного типа. Для этого я подготавливаю такой массив (динамический) и с помощью Move копирую туда возвращенные данные. Данные копируются и читаются далее абсолютно нормально. Проблема возникает при выходе из обработчика клика кнопки, вылетает Access violaton. Не могу понять, почему? Или может есть другой способ решить траблу?
Последний раз редактировалось Баламут; 12.01.2008 в 08:54. |
12.01.2008, 13:55 | #2 |
Регистрация: 12.12.2007
Сообщений: 7
|
Покажи процедуру обработки.
|
12.01.2008, 14:38 | #3 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Скорей всего неверно указан размер блока данных при перемещении в памяти Вы наверняка затераите другие данные и при выходе получаете такую проблему. Да конечно есть выход немного другой опеределить допустим Вашу структуру на нее указатель то пусть массив байт b: array[0..N] of BYTE; структура TStruct = packed record... PStruct = ^TStruct; так вот попробуйте типа такого PStruct := @b; а потом обращаться с PStruct^.поле
|
12.01.2008, 14:48 | #4 | |
Баламучу слегка...
Участник клуба
Регистрация: 01.11.2006
Сообщений: 1,585
|
Цитата:
|
|
12.01.2008, 14:49 | #5 |
Баламучу слегка...
Участник клуба
Регистрация: 01.11.2006
Сообщений: 1,585
|
|
12.01.2008, 15:23 | #6 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
если массив вида b: array of BYTE; то можно PStruct := b; ( без оператора @ ). Просто мне кажется в данном случае нет смысла копировать. Точней Вы не могли бы все дать ?! Move - процедура работает идеально. Вы гдет ошибаитесь, но без представления хотя куска где Move и ее переменных врятли кто Вам поможет.
|
12.01.2008, 16:16 | #7 |
Баламучу слегка...
Участник клуба
Регистрация: 01.11.2006
Сообщений: 1,585
|
Ну если хотите...
Код:
|
12.01.2008, 17:19 | #8 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Я освобождения не вижу )) freeMem(lpBuffer); Потом перед Move(lpBuffer^, PFailServices,BufSize); я бы посоветовал сравнить BufSize и BytesNeeded ( если конечно QueryServiceConfig2 чтот меняет, я незнаю что это даже ) И в какой из Move проблема ? А хотя меня очень заинтриговали две последнии строки... вот в них может и быть проблема при таком способе присваивания. Т.к. sc - массив и Вы его устанавливаете с помощью SetLength - а не через GetMem, а после используете Move. Мне кажется вся проблема в двух последних строках.
|
12.01.2008, 17:29 | #9 |
Баламучу слегка...
Участник клуба
Регистрация: 01.11.2006
Сообщений: 1,585
|
Вопрос с присваиванием и освобождением опустим, т.к. здесь лишь обрывки из реального кода. Все это есть. Но все-таки мне интересно, в чем разница между GetMem и SetLength в данном случае?
|
12.01.2008, 18:57 | #10 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Я точно сказать не могу. Но по наблюдениям после SetLength - delphi самостоятельно освобождает ресурсы, а вот после GetMem - совсем иная ситуация, т.е. приходится вызывать FreeMem. Так что возможна ситуация например ?! Откуда Length знает длинну данных выделенную с помощью SetLength - явно данная процедура выделяет кусок для хранения вспомогательных данных, а вот GetMem - ему сколько сказал выделить он и выделет, так что возможно именно из-за тех вспомогательных данных вся проблема.
Последний раз редактировалось BOBAH13; 12.01.2008 в 18:59. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Массивы в С\С++ | Zahar11 | Помощь студентам | 4 | 31.05.2008 00:35 |
массивы | ShenDy | Общие вопросы C/C++ | 4 | 17.04.2008 00:01 |
Массивы | Snord | Общие вопросы Delphi | 2 | 12.04.2008 13:45 |