Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.01.23;
Скачать: [xml.tar.bz2];

Вниз

не работает getmem   Найти похожие ветки 

 
Евгений007   (2010-11-03 13:14) [0]

Доброго времени!
Подскажите кто может:
не работает getmem
свел код к нескольким строкам

getmem()
if isBadWritePtr() выдает ошибку

с чем это может быть связано?
Настройки?
У меня дельфи 6

Евгений


 
CrytoGen   (2010-11-03 13:25) [1]

Приведите код


 
clickmaker ©   (2010-11-03 13:29) [2]

> if isBadWritePtr() выдает ошибку

разумеется, секретную


 
Евгений007   (2010-11-03 14:12) [3]

Код:

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...


 
12 ©   (2010-11-03 14:18) [4]

http://msdn.microsoft.com/en-us/library/aa366716%28VS.85%29.aspx
функция является устаревшей и не должны использовать
и потом
If the application is run under a debugger ...

а в IDE разве не под debugger оно run?


 
Сергей М. ©   (2010-11-03 14:25) [5]


>    GetMem(l1, 519);                        //ошибка появляется
> здесь
>    Memo1.Lines.Add(Format(" 101  p %p", [l1]));  //печатает


Если "печатает", значит нет никакой "ошибки".


 
clickmaker ©   (2010-11-03 14:28) [6]

> if IsBadReadPtr(l1, 519) then                   //уже есть
> ошибка
>         Memo1.Lines.Add(Format(" 110  p %p", [l1])); //=это
> не печатает

если не печатает, значит он не Bad, то есть Good. В чем тогда ошибка-то?


 
Евгений07   (2010-11-03 14:32) [7]

Код:

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...

<Цитата>


 
12 ©   (2010-11-03 14:35) [8]


> l2 := l1;             //  стр1

что это?


 
clickmaker ©   (2010-11-03 14:36) [9]

> l2 := l1;             //  стр1

зачем это?


 
Сергей М. ©   (2010-11-03 14:52) [10]


> Евгений07   (03.11.10 14:32) [7]


GetMem(l1, 519);                        // <-здесь нет никакой ошибки, если
Memo1.Lines.Add(Format(" 101  p %p", [l1]));  //<- если "это" у тебя "печатает"


 
Евгений07   (2010-11-03 14:57) [11]

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...


 
RWolf ©   (2010-11-03 15:03) [12]

у меня не выдаёт.


 
Сергей М. ©   (2010-11-03 15:08) [13]


> Евгений07   (03.11.10 14:57) [11]


Ты чего какой трудный ?


> GetMem(l1, 519);                        //ошибка появляется
> здесь


Да нет здесь никакой ошибки, сколько еще раз надо повторить ?)
Если бы она была, ты не увидел результатов работы ни одной из последующих строчек своего кода.


 
sniknik ©   (2010-11-03 15:17) [14]

похоже сейчас будет путевка в жизнь еще одному дворнику...

Евгений07
ты вообще код на который "грешишь" сам проверял? вне своей глючной программы. ну так проверь, сделай пустой проект, положи кнопку на форму, скопипасть показываемый код... где ошибка? пальцем покажи.


 
Евгений07   (2010-11-03 15:18) [15]

Я понимаю, что не должна быть ошибка!

Могут ли повлиять настройки компилятора?

Конфликт с устройствами
(видеокарта)???

Основная программа (чужая) так и работает
= ядро и ДЛЛки

То что оттранслировано у меня дает ошибки


 
Сергей М. ©   (2010-11-03 15:21) [16]


> понимаю, что не должна быть ошибка


Ну так ее и нет !
С какого перепугу ты утверждаешь что она есть, да еще и до сих пор никому не известно какая ?)


 
sniknik ©   (2010-11-03 15:30) [17]

> Конфликт с устройствами
> (видеокарта)???
17-я строка?


 
Евгений07   (2010-11-03 15:36) [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...


 
RWolf ©   (2010-11-03 15:37) [19]


> Евгений07   (03.11.10 15:18) [15]
> Я понимаю, что не должна быть ошибка!Могут ли повлиять настройки
> компилятора?

Может повлиять несоблюдение соглашений по обмену данными с основной программой.


 
RWolf ©   (2010-11-03 15:41) [20]


> Евгений07   (03.11.10 15:36) [18]
> сделал пост 11

я тоже сделал — нет ошибки.


 
Сергей М. ©   (2010-11-03 15:42) [21]


> Евгений07   (03.11.10 15:36) [18]


Сначала ты утверждаешь, что


> GetMem(l1, 519);                        //ошибка появляется здесь


Теперь ты разворачиваешь оглобли на 180 градусов и заявляешь что


> GetMem(l2,  к * 519);                       //выполняется  правильно


Ну и чему верить ?)


 
Евгений07   (2010-11-03 15:44) [22]

может повлиять несоблюдение соглашений по обмену данными с основной программой.
Но почему на пустом проекте после завершения программы выдает такую же ошибку Access violation at adress 01A... in module XX write of adress 01D...


 
RWolf ©   (2010-11-03 15:51) [23]

выложи архив с исходниками проекта — скомпилируем, проверим.


 
clickmaker ©   (2010-11-03 15:55) [24]

> l1 := nil;
>   l2 := nil;  

и вот это, интересно, зачем?


 
sniknik ©   (2010-11-03 15:56) [25]

> 1, в ДЛЛ был примерно такой код
откуда вдруг dll взялась? нет в [0], и в коде никаких dll...

но теперь хоть понятно, разные менеджеры памяти, а ты судя по всему, в 17-й строке передаешь переменные/лезешь в области  не принадлежащие программе/dll.
прочитай внимательно предупреждение которое когда создаешь dll в ней вначале стоит.


 
Евгений07   (2010-11-03 15:57) [26]

Ну и чему верить ?
Если я явно распределяю память через массивы, все работает правильно.
Есть довольно большой проект, с кучей больших массивов = нет проблем
Проблемы появляются с применением GetMem

Все указывает на то что у меня в компе возможна какая то бяка с распределением памяти.

Как это можно проверить?


 
sniknik ©   (2010-11-03 15:59) [27]

> где ошибка? пальцем покажи после завершения программы выдает Access violation at adress 01A... in module XX write of adress 01D...
НЕТ, в ПОКАЗАННОМ КОДЕ. а не отсебятине какой то, сам приписал...

СОВЕРШЕННО НЕ ИНТЕРЕСНО ТО, ЧТО "ОСТАЛОСЬ ЗА КАДРОМ", не показано.


 
Сергей М. ©   (2010-11-03 16:03) [28]


> у меня в компе возможна какая то бяка с распределением памяти


Т.е. это умозаключение ты сделал на основании того что в результате  выполнении вызова GetMem() ты увидел на экране сообщение дословно следующего содержания "У тебя в компе какая то бяка с распределением памяти" ?)

Так надо понимать ?)


 
sniknik ©   (2010-11-03 16:10) [29]

> Так надо понимать ?)
надо понимать еще один талантливый дворник пропадает... незамутненное логикой сознание.


 
Евгений07   (2010-11-03 16:15) [30]

Спасибо за дискуссию, извините, срочный вылет


 
Сергей М. ©   (2010-11-03 16:35) [31]


> срочный вылет


Ну вот)
Как всегда кино закончилось на самом интересном месте)


 
Юрий Зотов ©   (2010-11-03 16:35) [32]

> Евгений07

GetMem не работать просто не может. Поэтому все попытки проверить ее абсолютно бессмысленны - если сама проверка правильная, то ее результат всегда будет положительным, а если результат все же получается отрицательным, то это свидетельствует лишь о неправильности самой проверки и ни о чем более.


 
Anatoly Podgoretsky ©   (2010-11-03 16:48) [33]

> Евгений07  (03.11.2010 14:32:07)  [7]

Зря ты реальное сообщение заменил троеточием.


 
Anatoly Podgoretsky ©   (2010-11-03 16:52) [34]

> Евгений07  (03.11.2010 16:15:30)  [30]

Забудь про указатели, это не твое.


 
Евгений07   (2010-11-05 12:46) [35]

Доброго времени от талантливого дворника
Как всегда кино закончилось на самом интересном месте)
Нашел все ляпы
Серия 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
После весьма значительного увеличения памяти, скрывшей адрес возникновения записи, ошибка исчезла
Судя по всему описание доступного мне интерфейса ДЛЛ и реального не соответствуют



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.01.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.004 c
15-1286828948
Юрий
2010-10-12 00:29
2011.01.23
С днем рождения ! 12 октября 2010 вторник


2-1288543652
mefodiy
2010-10-31 19:47
2011.01.23
Юникод в DBGrid


15-1286341199
12
2010-10-06 08:59
2011.01.23
Отчет за период. Интерфейс. Как Вы понимаете, с какого по какое?


2-1289220381
12
2010-11-08 15:46
2011.01.23
запрос к двум файлам Excel через ADO


4-1243758013
Unknown user
2009-05-31 12:20
2011.01.23
IsHandleValid?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский