Конференция "Начинающим" » не работает getmem
 
  • Евгений007 (03.11.10 13:14) [0]
    Доброго времени!
    Подскажите кто может:
    не работает getmem
    свел код к нескольким строкам

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

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

    Евгений
  • CrytoGen (03.11.10 13:25) [1]
    Приведите код
  • clickmaker © (03.11.10 13:29) [2]
    > if isBadWritePtr() выдает ошибку

    разумеется, секретную
  • Евгений007 (03.11.10 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 © (03.11.10 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?
  • Сергей М. © (03.11.10 14:25) [5]

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


    Если "печатает", значит нет никакой "ошибки".
  • clickmaker © (03.11.10 14:28) [6]
    > if IsBadReadPtr(l1, 519) then                   //уже есть
    > ошибка
    >         Memo1.Lines.Add(Format(' 110  p %p', [l1])); //=это
    > не печатает

    если не печатает, значит он не Bad, то есть Good. В чем тогда ошибка-то?
  • Евгений07 (03.11.10 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 © (03.11.10 14:35) [8]

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

    что это?
  • clickmaker © (03.11.10 14:36) [9]
    > l2 := l1;             //  стр1

    зачем это?
  • Сергей М. © (03.11.10 14:52) [10]

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


    GetMem(l1, 519);                        // <-здесь нет никакой ошибки, если
    Memo1.Lines.Add(Format(' 101  p %p', [l1]));  //<- если "это" у тебя "печатает"
  • Евгений07 (03.11.10 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 © (03.11.10 15:03) [12]
    у меня не выдаёт.
  • Сергей М. © (03.11.10 15:08) [13]

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


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


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


    Да нет здесь никакой ошибки, сколько еще раз надо повторить ?)
    Если бы она была, ты не увидел результатов работы ни одной из последующих строчек своего кода.
  • sniknik © (03.11.10 15:17) [14]
    похоже сейчас будет путевка в жизнь еще одному дворнику...

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

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

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

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

    То что оттранслировано у меня дает ошибки
  • Сергей М. © (03.11.10 15:21) [16]

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


    Ну так ее и нет !
    С какого перепугу ты утверждаешь что она есть, да еще и до сих пор никому не известно какая ?)
  • sniknik © (03.11.10 15:30) [17]
    > Конфликт с устройствами
    > (видеокарта)???
    17-я строка?
  • Евгений07 (03.11.10 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 © (03.11.10 15:37) [19]

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

    Может повлиять несоблюдение соглашений по обмену данными с основной программой.
  • RWolf © (03.11.10 15:41) [20]

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

    я тоже сделал — нет ошибки.
  • Сергей М. © (03.11.10 15:42) [21]

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


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


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


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


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


    Ну и чему верить ?)
  • Евгений07 (03.11.10 15:44) [22]
    может повлиять несоблюдение соглашений по обмену данными с основной программой.


    Но почему на пустом проекте после завершения программы выдает такую же ошибку Access violation at adress 01A... in module XX write of adress 01D...
  • RWolf © (03.11.10 15:51) [23]
    выложи архив с исходниками проекта — скомпилируем, проверим.
  • clickmaker © (03.11.10 15:55) [24]
    > l1 := nil;
    >   l2 := nil;  

    и вот это, интересно, зачем?
  • sniknik © (03.11.10 15:56) [25]
    > 1, в ДЛЛ был примерно такой код
    откуда вдруг dll взялась? нет в [0], и в коде никаких dll...

    но теперь хоть понятно, разные менеджеры памяти, а ты судя по всему, в 17-й строке передаешь переменные/лезешь в области  не принадлежащие программе/dll.
    прочитай внимательно предупреждение которое когда создаешь dll в ней вначале стоит.
  • Евгений07 (03.11.10 15:57) [26]
    Ну и чему верить ?


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

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

    Как это можно проверить?
  • sniknik © (03.11.10 15:59) [27]
    > где ошибка? пальцем покажи после завершения программы выдает Access violation at adress 01A... in module XX write of adress 01D...
    НЕТ, в ПОКАЗАННОМ КОДЕ. а не отсебятине какой то, сам приписал...

    СОВЕРШЕННО НЕ ИНТЕРЕСНО ТО, ЧТО "ОСТАЛОСЬ ЗА КАДРОМ", не показано.
  • Сергей М. © (03.11.10 16:03) [28]

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


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

    Так надо понимать ?)
  • sniknik © (03.11.10 16:10) [29]
    > Так надо понимать ?)
    надо понимать еще один талантливый дворник пропадает... незамутненное логикой сознание.
  • Евгений07 (03.11.10 16:15) [30]
    Спасибо за дискуссию, извините, срочный вылет
  • Сергей М. © (03.11.10 16:35) [31]

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


    Ну вот)
    Как всегда кино закончилось на самом интересном месте)
  • Юрий Зотов © (03.11.10 16:35) [32]
    > Евгений07

    GetMem не работать просто не может. Поэтому все попытки проверить ее абсолютно бессмысленны - если сама проверка правильная, то ее результат всегда будет положительным, а если результат все же получается отрицательным, то это свидетельствует лишь о неправильности самой проверки и ни о чем более.
  • Anatoly Podgoretsky © (03.11.10 16:48) [33]
    > Евгений07  (03.11.2010 14:32:07)  [7]

    Зря ты реальное сообщение заменил троеточием.
  • Anatoly Podgoretsky © (03.11.10 16:52) [34]
    > Евгений07  (03.11.2010 16:15:30)  [30]

    Забудь про указатели, это не твое.
  • Евгений07 (05.11.10 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
    После весьма значительного увеличения памяти, скрывшей адрес возникновения записи, ошибка исчезла
    Судя по всему описание доступного мне интерфейса ДЛЛ и реального не соответствуют
 
Конференция "Начинающим" » не работает getmem
Есть новые Нет новых   [134431   +15][b:0][p:0.001]