Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.04;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.035 c
1-1123898980
DFR
2005-08-13 06:09
2005.09.04
Как отловить момент запуска Screen Save`r


1-1123741333
Ксардас
2005-08-11 10:22
2005.09.04
Пара вопросов по richedit


2-1092289278
jappak
2004-08-12 09:41
2005.09.04
Как урезать нужные символы?


2-1123015211
Pasha L
2005-08-03 00:40
2005.09.04
Скопировать, вставить, переименовать файлы


2-1120925367
Michael5
2005-07-09 20:09
2005.09.04
Подскажите, как код разнести по разным файлам (Unit ам)?