-
Доброго времени! Подскажите кто может: не работает getmem свел код к нескольким строкам
getmem() if isBadWritePtr() выдает ошибку
с чем это может быть связано? Настройки? У меня дельфи 6
Евгений
-
Приведите код
-
> if isBadWritePtr() выдает ошибку
разумеется, секретную
-
Код:
procedure TForm11.Gt(); var i, kol: integer; l1, l2: Pointer; // l1, l2: fx; begin GetMem(l1, 519); //ошибка появляется здесь Memo1.Lines.Add(Format(' 101 p %p', [l1])); //печатает if IsBadReadPtr(l1, 519) then //уже есть ошибка Memo1.Lines.Add(Format(' 110 p %p', [l1])); //=это не печатает end;
Это вырезка на поиск ошибки
В DLL после записи из основного модуля в мою переменную выдавала ошибку Access violation at adress 01A... in module XX write of adress 01D...
-
-
> GetMem(l1, 519); //ошибка появляется > здесь > Memo1.Lines.Add(Format(' 101 p %p', [l1])); //печатает
Если "печатает", значит нет никакой "ошибки".
-
> if IsBadReadPtr(l1, 519) then //уже есть > ошибка > Memo1.Lines.Add(Format(' 110 p %p', [l1])); //=это > не печатает
если не печатает, значит он не Bad, то есть Good. В чем тогда ошибка-то?
-
Код:
procedure TForm11.Gt(); var i, kol: integer; l1, l2: Pointer; // l1, l2: fx; begin GetMem(l1, 519); //ошибка появляется здесь Memo1.Lines.Add(Format(' 101 p %p', [l1])); //печатает ZeroMemory(l1, 519); //выполняется GetMem(l2, 519); //ошибка появляется здесь FillMemory(l2, 519, 1); //выполняется Memo1.Lines.Add(Format(' 102 p %p', [l2])); //печатает CopyMemory (l2, l1, 519); //выполняется FillMemory(l1, 519, 2); //выполняется l2 := l1; // стр1 FreeMem(l1, 519); l1 := nil; FreeMem(l2, 519); //выводит invalid point operator если есть стр1 l2 := nil;
end;
IsBadReadPtr применил для локализации
Без стр1 после завершения программы выдает все то же Access violation at adress 01A... in module XX write of adress 01D...
<Цитата>
-
> l2 := l1; // стр1
что это?
-
> l2 := l1; // стр1
зачем это?
-
> Евгений07 (03.11.10 14:32) [7]
GetMem(l1, 519); // <-здесь нет никакой ошибки, если Memo1.Lines.Add(Format(' 101 p %p', [l1])); //<- если "это" у тебя "печатает"
-
l2 := l1; // стр1
сорри, это уже мандраж Код:
procedure TForm11.Gt(); var i, kol: integer; l1, l2: Pointer; // l1, l2: fx; begin GetMem(l1, 519); //ошибка появляется здесь Memo1.Lines.Add(Format(' 101 p %p', [l1])); //печатает ZeroMemory(l1, 519); //выполняется правильно GetMem(l2, 519); //ошибка появляется здесь FillMemory(l2, 519, 1); //выполняется правильно Memo1.Lines.Add(Format(' 102 p %p', [l2])); //печатает CopyMemory (l2, l1, 519); //выполняется правильно FillMemory(l1, 519, 2); //выполняется правильно FreeMem(l1, 519); l1 := nil; FreeMem(l2, 519); l2 := nil; end;
после завершения программы выдает Access violation at adress 01A... in module XX write of adress 01D...
-
у меня не выдаёт.
-
> Евгений07 (03.11.10 14:57) [11]
Ты чего какой трудный ?
> GetMem(l1, 519); //ошибка появляется > здесь
Да нет здесь никакой ошибки, сколько еще раз надо повторить ?) Если бы она была, ты не увидел результатов работы ни одной из последующих строчек своего кода.
-
похоже сейчас будет путевка в жизнь еще одному дворнику...
Евгений07 ты вообще код на который "грешишь" сам проверял? вне своей глючной программы. ну так проверь, сделай пустой проект, положи кнопку на форму, скопипасть показываемый код... где ошибка? пальцем покажи.
-
Я понимаю, что не должна быть ошибка!
Могут ли повлиять настройки компилятора?
Конфликт с устройствами (видеокарта)???
Основная программа (чужая) так и работает = ядро и ДЛЛки
То что оттранслировано у меня дает ошибки
-
> понимаю, что не должна быть ошибка
Ну так ее и нет ! С какого перепугу ты утверждаешь что она есть, да еще и до сих пор никому не известно какая ?)
-
> Конфликт с устройствами > (видеокарта)??? 17-я строка?
-
Трудность выползла так: 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...
-
> Евгений07 (03.11.10 15:18) [15] > Я понимаю, что не должна быть ошибка!Могут ли повлиять настройки > компилятора?
Может повлиять несоблюдение соглашений по обмену данными с основной программой.
-
> Евгений07 (03.11.10 15:36) [18] > сделал пост 11
я тоже сделал — нет ошибки.
-
> Евгений07 (03.11.10 15:36) [18]
Сначала ты утверждаешь, что
> GetMem(l1, 519); //ошибка появляется здесь
Теперь ты разворачиваешь оглобли на 180 градусов и заявляешь что
> GetMem(l2, к * 519); //выполняется правильно
Ну и чему верить ?)
-
может повлиять несоблюдение соглашений по обмену данными с основной программой. Но почему на пустом проекте после завершения программы выдает такую же ошибку Access violation at adress 01A... in module XX write of adress 01D...
-
выложи архив с исходниками проекта — скомпилируем, проверим.
-
> l1 := nil; > l2 := nil;
и вот это, интересно, зачем?
-
> 1, в ДЛЛ был примерно такой код откуда вдруг dll взялась? нет в [0], и в коде никаких dll...
но теперь хоть понятно, разные менеджеры памяти, а ты судя по всему, в 17-й строке передаешь переменные/лезешь в области не принадлежащие программе/dll. прочитай внимательно предупреждение которое когда создаешь dll в ней вначале стоит.
-
Ну и чему верить ? Если я явно распределяю память через массивы, все работает правильно. Есть довольно большой проект, с кучей больших массивов = нет проблем Проблемы появляются с применением GetMem Все указывает на то что у меня в компе возможна какая то бяка с распределением памяти. Как это можно проверить?
-
> где ошибка? пальцем покажи после завершения программы выдает Access violation at adress 01A... in module XX write of adress 01D... НЕТ, в ПОКАЗАННОМ КОДЕ. а не отсебятине какой то, сам приписал...
СОВЕРШЕННО НЕ ИНТЕРЕСНО ТО, ЧТО "ОСТАЛОСЬ ЗА КАДРОМ", не показано.
-
> у меня в компе возможна какая то бяка с распределением памяти
Т.е. это умозаключение ты сделал на основании того что в результате выполнении вызова GetMem() ты увидел на экране сообщение дословно следующего содержания "У тебя в компе какая то бяка с распределением памяти" ?)
Так надо понимать ?)
-
> Так надо понимать ?) надо понимать еще один талантливый дворник пропадает... незамутненное логикой сознание.
-
Спасибо за дискуссию, извините, срочный вылет
-
> срочный вылет
Ну вот) Как всегда кино закончилось на самом интересном месте)
-
> Евгений07
GetMem не работать просто не может. Поэтому все попытки проверить ее абсолютно бессмысленны - если сама проверка правильная, то ее результат всегда будет положительным, а если результат все же получается отрицательным, то это свидетельствует лишь о неправильности самой проверки и ни о чем более.
-
> Евгений07 (03.11.2010 14:32:07) [7]
Зря ты реальное сообщение заменил троеточием.
-
> Евгений07 (03.11.2010 16:15:30) [30]
Забудь про указатели, это не твое.
-
Доброго времени от талантливого дворникаКак всегда кино закончилось на самом интересном месте) Нашел все ляпы Серия 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После весьма значительного увеличения памяти, скрывшей адрес возникновения записи, ошибка исчезла Судя по всему описание доступного мне интерфейса ДЛЛ и реального не соответствуют
|