Форум: "Основная";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];
Вниз
Ловля Найти похожие ветки
← →
Сергей Б. (2002-08-07 13:59) [0]Приветствую, друзья! Проблемка наметилась: при выполнении происходит молчаливое вылетание программы без каких бы то ни было сообщений. Вернее сообщение от Дельфей есть, но оно как бы не об ошибке как это обычно бывает, а информационное: типа там у вас что-то с программой, фаулт какой-то и привет. После такого сообщения трассировка становится невозможной, выполнение кода как будто бы зацикливается. Если запускать программу вне Дельфей, то она просто схлопывается и выгружается из памяти. И тоже без сообщения об ошибке. Что за чудо?
Да! Началось всё с того, что я выделил кусок кода в виде процедуры без параметра (он у меня дважды вызывается). И вот при выходе из этой процедуры (по сути подпрограммы) всё гавкается. Блин, что же делать? Прошу совета!!!
← →
Song (2002-08-07 14:00) [1]Ну... что можно сказать. Код хотя бы посмотреть проблемной процедуры.
← →
tovSuhov (2002-08-07 14:06) [2]Тут ведь смотря какой фаулт...А вдруг сегментейшен?
← →
Сергей Б. (2002-08-07 14:08) [3]Хм... 242 строки?
← →
Сергей Б. (2002-08-07 14:12) [4]2 tovSuhov: "access violation at 0x0058e5b7: read of address 0x000004b2"
← →
VaS (2002-08-07 15:05) [5]Код в студию.
← →
Anatoly Podgoretsky (2002-08-07 15:21) [6]Указатели инициализируй
← →
Сергей Б. (2002-08-07 18:24) [7]
> Указатели инициализируй
А это как, извините?..
> Код в студию.
Да нет там ничего интересного. Когда он дважды повторялся, всё работало. Запихнул в процедуру (без изменений) - глючит.
← →
ZrenBy (2002-08-07 18:32) [8]А эта процедура как описана ?
procedure TForm1.pr;
или
procedure pr;
← →
Сергей Б. (2002-08-07 18:40) [9]Вот как:
procedure TForm1.Button1Click(Sender: TObject);
procedure MyProcedure; // это моя глючная проца
begin
...
end;
begin
...
MyProcedure; // это вызов моей глючной процы
DataSet1.Active := false; // на этом месте вылетает
... // и не важно что за код в этой строке
end;
← →
ZrenBy (2002-08-07 18:45) [10]Вместо MyProcedure
напиши Tform1.MyProcedure
должно заработать
Я думаю, что DataSet1 принадлежит Form1
а MyProc - нет, и соответственно она не может к нему обратиться
← →
ZrenBy (2002-08-07 18:48) [11]Про DataSet я сказал зря, но все равно попробуй
← →
DAO (2002-08-07 18:59) [12]Мне кажется дело не в этом!!! Т.к. я раньше исп. проц. подход и писал их немерено в свойх прогахи причем таким же образом, т.е.
> procedure TForm1.Button1Click(Sender: TObject);
>
> procedure MyProcedure; // это моя глючная проца
> begin
> ...
> end;
>
> begin
У меня допустим такие ошибки чаще всего появляются когда обращаешься к объектам которых еще нет! Ну это тоже самое что и инициализация указателей!
← →
Сергей Б (из дому) (2002-08-07 19:22) [13]Нет там ни динамически создаваемых объектов, ни указателей! :( Весь код строится вокруг предопределенных переменных и объектов.
← →
MrBeer (2002-08-07 19:47) [14]esli problemi uzhe v sobrannom .exe ya obichno zapisivaju adres gde esjt problema, smotrju v IDA, a tam uzhe do Delphi 1 shag.
← →
Сергей Б (из дому) (2002-08-07 20:13) [15]Да-а... Это, пожалуй, для меня сложновато. Последний раз я ассемблер в глаза видел лет 12 назад. Тогда программировать под Виндовз мало кто умел, только ДОС.
← →
Cobalt (2002-08-07 21:02) [16]242 строки - это, конечно, напряжно будет... Да и объяснять, что делает каждая переменная...
Какие хоть классы/компоненты используете, параметры этих классов/компонентов - ? А то все равно что спрашивать у слепого - какая это буква?
Или попробуйте отказаться от этой процедуры и пихайте код "напрямую", ведь он работает?
А вы в процедуре не объявляли к-л. совпадающих по именам компонентов/переменных?
← →
ЮЮ (2002-08-08 05:35) [17]Тогда поставь BreakPoint в теле процедуры и не поленись пройтись по ней, тогда увидишь где происходит access violation
← →
VAleksey (2002-08-08 06:37) [18]если бы он обращался к не созданному объекту то Access violation был бы по адресу FFFF... или 00000....
Ты динамические массивы случаем в процедуре не используешь ?
← →
IlyaA (2002-08-08 07:36) [19]Возможно, что ты просто выходишь где-то за рамки массива. Какие компоненты ты используешь в этой процедуре.
Замечание: Если эта процедура вызывается из какого-ни-ть объекта(напр. формы), то лучше сделай её методом этого объекта.
← →
Сергей Б. (2002-08-08 11:07) [20]
> пихайте код "напрямую", ведь он работает?
Да, видимо только это и поможет. :(
> процедуре не объявляли к-л. совпадающих по именам компонентов/переменных?
Нет, объявлений не было. Повторюсь, в процедуру запихнут дважды повторяющийся код. Никаких параметров! Никаких деклараций! Никаких локальных переменных!
> Тогда поставь BreakPoint в теле процедуры и не поленись
Не помогает. Процедура прекрасно отрабатывается, происходит выход из нее и при попытке выполнить любую инструкцию, следующую за вызовом, в теле вызывающей процедуры происходит ошибка.
> Ты динамические массивы случаем в процедуре не используешь
> ?
Нет. В других местах использую, но там все работает.
> Возможно, что ты просто выходишь где-то за рамки массива.
> Какие компоненты ты используешь в этой процедуре.
Компоненты? FIB использую.
Резюме: либо глючат компоненты FIB, либо Дельфя. Любопытно, что в интерфейсной процедуре, из которой происходит вызов злополучной процедуры, используется еще две, аналогичным образом построенные процедурки (они вызываются значительно чаще - тысячи раз за один проход), и с ними нет никаких проблем!!! А вот эта...
← →
Yuri Btr (2002-08-08 11:30) [21]Даже не знаю, поможет ли мой опыт в вашем случае. Но всё равно посмотрите:
Я писал программу, которая соединяется с сервером FTP через компонент NMFTP заходит в одну директорию и делает ей LIST, в OnList я забил закачивание найденных файлов методом LIST. Так вот первое время я не мог понять, почему у меня программа вылетает при попытке закачать файл с сервака (Access Violation ...)- оказалось, что OnList вызывается чаще, чем я успеваю закачать файл. Т.е. я имел дело с "асинхронным" процессом.
← →
VAleksey (2002-08-08 13:07) [22]Мне кажется дело где - то в динамическом массиве и выходе за его границы.
Проверь значения элементов массивов (и других указателей) до процедуры и после. (можно и трассировкой) Возможно ты где-то косвенно к ним обращаешся. Отсюда и сбои после процедуры.
А эти компоненты FIB ты в процедуре динамически создаешь - уничтожаешь ?
← →
Andrey007 (2002-08-08 13:24) [23]IMHO, пока код не будет опубликован, дельные советы дать невозможно.
← →
Сергей Б. (2002-08-08 15:33) [24]
> А эти компоненты FIB ты в процедуре динамически создаешь
> - уничтожаешь ?
Нет, используются только те, что брошены на форму изначально.
> пока код не будет опубликован
А если все-таки абстрагироваться? Есть кусок кода, он находится внутри интерфейсной процедуры. Повторяется два (три, четыре - неважно) раза. Этот код вырезается и оформляется в виде простейшей вложенной процедуры (ну прямо как подпрограмма в Бейсике). Вместо него прописывается вызов этой процедуры. И все! Такой модифицированный код нормально компилится. При трассировке процедура превосходно вызывается и выполняется. Но при выходе - БАЦ! и ошибка. Мистика!
Код могу представить, но только не на всеобщее обозрение. Если есть желающие, вышлю на мыло.
← →
VaS (2002-08-08 15:42) [25]А не смешиваешь ли ты объектные и интерфейсные ссылки?
← →
Сергей Б. (2002-08-09 09:40) [26]Каким образом? Подробнее плиззз...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c