![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
не работает getmem
Евгений007 © (2010-11-03 13:14:00)Доброго времени!
Подскажите кто может:
не работает getmem
свел код к нескольким строкам
getmem()
if isBadWritePtr() выдает ошибку
с чем это может быть связано?
Настройки?
У меня дельфи 6
Евгений
Евгений07 (2010-11-05 12:46:00) [1]Доброго времени от талантливого дворника
Как всегда кино закончилось на самом интересном месте)
Нашел все ляпы
Серия 1 = исходная
В ДЛЛ было
0.задание переменной формы = структура
а. количество фрагментов
б. динамический массив фрагментов
1.запрос на количество фрагментов
2.выделение памяти GetMem для запрошенного количества фрагментов
3.запрос фрагментов
4. Ошибка
Серия 2 = выделение ошибки
1. создал проект, как мне казалось имитирующий ошибку:
а. форма
б. выдранный кусок из описания структур данных
2. процесс умучивания = получить исходную ошибку
Серия 3 = обсуждение полученного с не талантливыми дворниками
1. наиболее точно, как мне казалось, описал проблему в этой дискуссии
Грабли талантливого дворника
Конец Серии 3
подменил в задании переменной = структуру на Pointer
Получил =l1, l2: Pointer;
Ну нету у меня сейчас дома нормального интернету!
Естественно - тут ошибки нету!
Конец Серии 2
в процессе мутации программы с целью получить исходную ошибку упростил исходную структуру
Получил:
1. Конструктор создает переменную типа структура
2. талантливый дворниктоже GetMem переменную типа структура
3. талантливый дворникзатем FreeMem эту переменную
4. и наконец деструктор тоже пытается уничтожить эту переменную!
Результат = ошибка, но не та!
Конец Серии 1
После весьма значительного увеличения памяти, скрывшей адрес возникновения записи, ошибка исчезла
Судя по всему описание доступного мне интерфейса ДЛЛ и реального не соответствуют
Anatoly Podgoretsky (2010-11-03 16:52:00) [2]> Евгений07 (03.11.2010 16:15:30) [30]
Забудь про указатели, это не твое.
Anatoly Podgoretsky (2010-11-03 16:48:00) [3]> Евгений07 (03.11.2010 14:32:07) [7]
Зря ты реальное сообщение заменил троеточием.
Юрий Зотов (2010-11-03 16:35:00) [4]> Евгений07
GetMem не работать просто не может. Поэтому все попытки проверить ее абсолютно бессмысленны - если сама проверка правильная, то ее результат всегда будет положительным, а если результат все же получается отрицательным, то это свидетельствует лишь о неправильности самой проверки и ни о чем более.
Сергей М. (2010-11-03 16:35:00) [5]
> срочный вылет
Ну вот)
Как всегда кино закончилось на самом интересном месте)
Евгений07 (2010-11-03 16:15:00) [6]Спасибо за дискуссию, извините, срочный вылет
sniknik (2010-11-03 16:10:00) [7]> Так надо понимать ?)
надо понимать еще один талантливый дворник пропадает... незамутненное логикой сознание.
Сергей М. (2010-11-03 16:03:00) [8]
> у меня в компе возможна какая то бяка с распределением памяти
Т.е. это умозаключение ты сделал на основании того что в результате выполнении вызова GetMem() ты увидел на экране сообщение дословно следующего содержания "У тебя в компе какая то бяка с распределением памяти" ?)
Так надо понимать ?)
sniknik (2010-11-03 15:59:00) [9]> где ошибка? пальцем покажи после завершения программы выдает Access violation at adress 01A... in module XX write of adress 01D...
НЕТ, в ПОКАЗАННОМ КОДЕ. а не отсебятине какой то, сам приписал...
СОВЕРШЕННО НЕ ИНТЕРЕСНО ТО, ЧТО "ОСТАЛОСЬ ЗА КАДРОМ", не показано.
Евгений07 (2010-11-03 15:57:00) [10]
Ну и чему верить ?
Если я явно распределяю память через массивы, все работает правильно.
Есть довольно большой проект, с кучей больших массивов = нет проблем
Проблемы появляются с применением GetMem
Все указывает на то что у меня в компе возможна какая то бяка с распределением памяти.
Как это можно проверить?
sniknik (2010-11-03 15:56:00) [11]> 1, в ДЛЛ был примерно такой код
откуда вдруг dll взялась? нет в [0], и в коде никаких dll...
но теперь хоть понятно, разные менеджеры памяти, а ты судя по всему, в 17-й строке передаешь переменные/лезешь в области не принадлежащие программе/dll.
прочитай внимательно предупреждение которое когда создаешь dll в ней вначале стоит.
clickmaker (2010-11-03 15:55:00) [12]> l1 := nil;
> l2 := nil;
и вот это, интересно, зачем?
RWolf (2010-11-03 15:51:00) [13]выложи архив с исходниками проекта — скомпилируем, проверим.
Евгений07 (2010-11-03 15:44:00) [14]
может повлиять несоблюдение соглашений по обмену данными с основной программой.
Но почему на пустом проекте после завершения программы выдает такую же ошибкуAccess violation at adress 01A... in module XX write of adress 01D...
Сергей М. (2010-11-03 15:42:00) [15]
> Евгений07 (03.11.10 15:36) [18]
Сначала ты утверждаешь, что
> GetMem(l1, 519); //ошибка появляется здесь
Теперь ты разворачиваешь оглобли на 180 градусов и заявляешь что
> GetMem(l2, к * 519); //выполняется правильно
Ну и чему верить ?)
RWolf (2010-11-03 15:41:00) [16]
> Евгений07 (03.11.10 15:36) [18]
> сделал пост 11
я тоже сделал — нет ошибки.
RWolf (2010-11-03 15:37:00) [17]
> Евгений07 (03.11.10 15:18) [15]
> Я понимаю, что не должна быть ошибка!Могут ли повлиять настройки
> компилятора?
Может повлиять несоблюдение соглашений по обмену данными с основной программой.
Евгений07 (2010-11-03 15:36:00) [18]Трудность выползла так:
1, в ДЛЛ был примерно такой код
GetMem(l2, к * 519); //выполняется правильно
запрос_к_ядру_на_получение_ данных() //ошибка появляется здесь
// Access violation at adress 01A... in module XX write of adress 01D...
// в отладчике
2,сделай пустой проект, положи кнопку на форму, скопипасть показываемый код...= сделал пост 11
память выделяется, заполняется, копируется правильно
где ошибка? пальцем покажипосле завершения программы выдает Access violation at adress 01A... in module XX write of adress 01D...
sniknik (2010-11-03 15:30:00) [19]> Конфликт с устройствами
> (видеокарта)???
17-я строка?
Сергей М. (2010-11-03 15:21:00) [20]
> понимаю, что не должна быть ошибка
Ну так ее и нет !
С какого перепугу ты утверждаешь что она есть, да еще и до сих пор никому не известно какая ?)