Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.52 MB
Время: 0.02 c
3-1122373282
-=snoop=-
2005-07-26 14:21
2005.09.04
закрыть коннект к базе


1-1123165458
VID
2005-08-04 18:24
2005.09.04
ДЛЯ ПРОФИ. OleContainer и его OleObject. У них недопонимание :)


3-1122398760
Оля
2005-07-26 21:26
2005.09.04
Проблема с печатью


8-1113403006
Unknown user
2005-04-13 18:36
2005.09.04
Разрешение картинки


4-1121679144
Asteroid
2005-07-18 13:32
2005.09.04
Как открыть хендл к чужому потоку?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский