Форум: "Потрепаться";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];
ВнизCompiler ... Найти похожие ветки
← →
kblc © (2005-08-08 12:13) [0]Уважаемые мастера, у меня к вам вопрос:
Вот у меня есть такой код:type
..
TServerType=(stLOG, stVAR, stUPD, stLIB);
..
var
i: TServerType;
begin
for i:=Hight(TServerType) downto Low(TserverType) do
begin
...
end;
end;
..
Почему при заходе дебуггера каждый раз в цикл сначало он пишет что i=(out of bounds) -4
потом i=(out of bounds) -3
i=(out of bounds) -1
а потом Invalid Pointer Operations
Почему ???
← →
begin...end © (2005-08-08 12:16) [1]Что в цикле, и где именно возникает Invalid Pointer Operation?
← →
kblc © (2005-08-08 12:20) [2]
type
..
TServerType=(stLOG, stVAR, stUPD, stLIB);
Servers: array[Low(TServerType)..High(TServerType)] of IServer;
..
var
i: TServerType;
begin
for i:=Hight(TServerType) downto Low(TserverType) do
begin
if Assigned(Servers[i]) then //exception
begin
end
...
end;
end;
..
← →
Anatoly Podgoretsky © (2005-08-08 12:20) [3]Наверно ошибка в другом месте.
← →
kblc © (2005-08-08 12:37) [4]Приведу полный код:
type
..
TServerType=(stLOG, stVAR, stUPD, stLIB);
Servers: array[Low(TServerType)..High(TServerType)] of IServer;
..
var
AcceptClose: boolean = false;
procedure fmMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
var
i: TServerType;
res: string;
begin
CanClose:=AcceptClose;
if CanClose then
begin
if not Visible then Show;
for i:=Hight(TServerType) downto Low(TserverType) do
begin
if Assigned(Servers[i]) then //exception
begin
Servers[i].ExecFunction("UPLOAD",res);
if Assigned(Servers[i]) then
while Servers[i].Status = ssBusy do Sleep(100);
Sleep(500);
Servers[i]:=nil;
end
...
end;
end;
end;
..
Ошибка возникает именно в том месте, где я показал, при этом, при каждом заходе в циклfor to do
значение переменной i равно:
1) "i=(out of bound) -4"
2) "i=(out of bound) -3"
3) "i=(out of bound) -2"
И потом получаеться exception ...
Скажите мне пожалуйста... у меня что, руки кривые? :((((((
← →
Anatoly Podgoretsky © (2005-08-08 12:43) [5]
for i:=Hight(TServerType) downto Low(TserverType) do
begin
(*
if Assigned(Servers[i]) then //exception
begin
Servers[i].ExecFunction("UPLOAD",res);
if Assigned(Servers[i]) then
while Servers[i].Status = ssBusy do Sleep(100);
Sleep(500);
Servers[i]:=nil;
end
...
*)
end;
← →
kblc © (2005-08-08 12:46) [6]Anatoly Podgoretsky © (08.08.05 12:43) [5]
Что это? ;)
← →
kblc © (2005-08-08 13:18) [7]Вем:
троеточия там нет. это полный код процедуры.
Anatoly Podgoretsky © (08.08.05 12:43) [5]for i:=Hight(TServerType) downto Low(TserverType) do
begin
if not Assigned(Servers[i]) then break; //no exception
end;
end;
Что ж это такое то :((
Но почему же тогда при заходе в цикл остаёться вот это:
1) "i=(out of bound) -4"
2) "i=(out of bound) -3"
3) "i=(out of bound) -2"
4) "i=(out of bound) -1"
← →
Anatoly Podgoretsky © (2005-08-08 13:26) [8]kblc © (08.08.05 12:46) [6]
Ты сделай это и результаты в студию
← →
kblc © (2005-08-08 13:33) [9]Прошу у всех прощения... я неправильно написал в kblc © (08.08.05 12:37) [4]. exception возникает не на функции
if Assigned(..) then
, а реньше, при попытке зайти в цикл с переменнойi=(out of bound) -1
(пятый раз).
т.е. for i:=..... // exception (хотя вместо этого цикл должен прекратиться)
Если же использовать код, приведённый в [7], то ошибки не возникает.
← →
Anatoly Podgoretsky © (2005-08-08 13:36) [10]Вот в таком духе и продолжай, пока не скажешь какая строка дает ошибку.
← →
kblc © (2005-08-08 13:45) [11]
type
..
TServerType=(stLOG, stVAR, stUPD, stLIB);
Servers: array[Low(TServerType)..High(TServerType)] of IServer;
..
var
AcceptClose: boolean = false;
procedure fmMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
var
i: TServerType;
res: string;
begin
CanClose:=AcceptClose;
if CanClose then
begin
if not Visible then Show;
for i:=Hight(TServerType) downto Low(TserverType) do
begin
if Assigned(Servers[i]) then
begin
Servers[i].ExecFunction("UPLOAD",res);
while Servers[i].Status = ssBusy do Sleep(100);
Sleep(500);
Servers[i]:=nil;
end
end;
end;
end;
Итак что я имею:
1) программа точно заходит 4 раза в цикл.
2) когда курсор (красная полоска) дебаггера становиться на строкеfor i:=Hight(TServerType) downto Low(TserverType) do
(при этом значение i=(out of bound) -1) то при нажатии F7/F8 вызываеться exception "Invalid Pointer Operations".
я не могу определить причину этой ошибки. Помогите пожалуйста.
← →
Anatoly Podgoretsky © (2005-08-08 13:54) [12]Не используй отладчик
← →
kblc © (2005-08-08 14:01) [13]"Run without debugging" тоже выдаёт мне ошибку.
Может я что-то не так делаю? Что ты имеешь ввиду под словом не использовать его?
← →
Anatoly Podgoretsky © (2005-08-08 14:03) [14]Ты уж как то одназначнее будь, не вводи в заблуждение.
А рекомендацию 10 выполнил или ждешь когда кто ни будь за тебя оттрасирует?
← →
kblc © (2005-08-08 14:08) [15]Я же написал какая строка! в [11] я всё написал.
← →
Anatoly Podgoretsky © (2005-08-08 14:11) [16]
for i:=Hight(TServerType) downto Low(TserverType) do
begin
(*
if Assigned(Servers[i]) then
begin
Servers[i].ExecFunction("UPLOAD",res);
while Servers[i].Status = ssBusy do Sleep(100);
Sleep(500);
Servers[i]:=nil;
end
*)
end;
← →
kblc © (2005-08-08 14:18) [17]Анатолий, дебаггер делфи просто перескакивает через эту строку. Я не могу видеть в них значение переменной i.
Какие ещё нужны результаты???
← →
GuAV © (2005-08-08 15:21) [18]for i:=Hight(TServerType) downto Low(TserverType) do
begin
if Assigned(Servers[i]) then //exception
begin
(* Servers[i].ExecFunction("UPLOAD",res);
if Assigned(Servers[i]) then
while Servers[i].Status = ssBusy do Sleep(100);
Sleep(500); *)
Servers[i]:=nil; {Place Breakpoint here}
end
...
end;
← →
Anatoly Podgoretsky © (2005-08-08 15:32) [19]kblc © (08.08.05 14:18) [17]
То есть ошибки не дает, дальше по одной строчке включай пока не появится ошибка. А появится она наверно вServers[i].ExecFunction("UPLOAD",res);
← →
Desdechado © (2005-08-08 16:13) [20]а что за функция такая Hight()?
← →
kblc © (2005-08-09 07:47) [21]2Desdechado: Мне описАться нельзя? читай
High
2Anatoly Podgoretsky: прошу прощения за невнимательность. Начинаю всё проверять.
← →
kblc © (2005-08-09 10:34) [22]Да, как только включил функцию
Servers[i].ExecFunction("UPLOAD",res);
стала появляться ошибка.
ВключилUse dubug DCUs
. Ошибка приFreeMem()
из System, а вот что пытаеться освободить память я так и не понял.
Вот функцияexecprec()
(это функция извлекаемая последней):type
TLogServer = class(TComObject, IServer)
...
LogFile: TextFile;
LogFileIsOpen: boolean; // on create = FALSE;
end;
function TLOGSerevr.ExecProc(const Parameters: string; var sResult: string);
var
...
begin
...
if Pos("UPLOAD",Parameters)=1 then
begin
if LogFileIsOpen then CloseFile(LogFile);
LogFileIsOpen:=FALSE;
Result:=TRUE;
end else
...
end;
Резве возможно здесь ошибиться?
Подскажите пожалуйста...
← →
kblc © (2005-08-09 11:59) [23]Ау
← →
Гаврила © (2005-08-09 12:11) [24]
> Servers: array[Low(TServerType)..High(TServerType)] of IServer;
-->
Servers: array[TServerType] of IServer;
отключи оптимизацию
{$O-}
сообщи о результатах
← →
Гаврила © (2005-08-09 12:18) [25]Тьфу блин.!
> kblc ©
А ты что, руками тут код набиваешь каждый раз? Или все таки через буфер копируешь?
← →
kblc © (2005-08-09 12:58) [26]2 Гаврила:
Приходиться руками потому что вся программа располагаеться на ноутбуке рядом со мной... и оттуда не представляеться возможным скопировать текст.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.012 c