Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Компилятор пропускает команду... [Delphi, Windows]


Страницы:   1 2 3 4 5

HelloEverybody ©   (2008-03-13 19:01:00) 

Всем доброго времени суток! :)
Не первый раз сталкиваюсь с проблемой в Delphi, когда компилятор в процессе отладки (да и вообще) пропускает команду. Например в

procedureUpdateGraph(Anum, Number:integer);
var
   ...
   num,i,j,maxi,jend:integer;
   ...
begin
...
  i:=0;
  j:=0;
...

Он переменной i присваивает ноль, а переменной j нет. В отладчике вообще пропускает эту строчку. При этом не ругается, как будто все в порядке... никак не пойму в чем дело?
Буду благодарен за совет!


{RASkov}   (2008-03-16 13:51:00) [21]

> У меня D7 (Build 4.453)

Эх... что-то я пропустил [66] :(
Я 5 дельфю сразу невзлюбил и продержалась она у меня ну может с неделю, потом ведро.... мусорное :)


{RASkov}   (2008-03-16 13:49:00) [22]

> [64] Dimaxx ©   (16.03.08 13:39)
> Я тебе показал как использовалась P не понравившаяся компилятору.

Вот Дима Логинов показал, а ты нет :)

> Тебе видео снять??

Прекрати.... оно мне надо? :)
Если глючит среда, это не значит, что виноват компилятор.... Ты кинь кусок "глючного" кода, да так что бы я его мог у себя скомпилировать, и посмотрим будут ли глюки у моего компилятора.... У меня D7 (Build 4.453)
:)


{RASkov}   (2008-03-16 13:45:00) [23]

Ну фик знает... просто не нужно перечить компилятору и все будут довольны :)
function Fu(N: Integer): Byte;
begin
 try
  if N=0 then raise Exception.Create('Zero');
  Result:=(10 div N)+1;
 except
  ShowMessage('Error');
 end;
end;

case fu(0) of
0: ;
1: ;
2: ;
end;


Dimaxx   (2008-03-16 13:43:00) [24]

Не знаю на какой версии сидит тезка, но компилятор (вернее проверка синтаксиса) в Д5 иногда выкидывает финтиля! :)


Loginov Dmitry   (2008-03-16 13:40:00) [25]

> Обрати внимание, что компилятор, хоть и умный, но он не
> ИИ и он не может знать нужен тебе результат при исключении
> или нет, но предупредить об опасности это его работа и ничего
> в этом плохого нет, а вот не слушаться его и делать по своему
> - вот это плохо :(


В 99,9% случаев компилятор абсолютно точно знает, что результат при исключении мне не нужен, так как им просто нельзя воспользоваться в случае исключения.


> Тебе не нужен, а мне вот понадобился и что делать компилятору?


И тебе он не понадобится.


Dimaxx   (2008-03-16 13:39:00) [26]


> Незнай... незнай, тыж опять "вырванный кусок бросил", что
> там на самом деле было одному ...(вот и думай что тут(..
> .) было) известно.

Я тебе показал как использовалась P не понравившаяся компилятору. Можно согласиться с тем, что Inc(P) это не использование. Но генерация строки c помощью Р разве не использование? И хватит плз придираться к словам... :)


> Что-то путаешь все таки наверное.... есть различия показа
> хинтов и варнингов при проверке синтаксиса и компиляции,
>  т.е. при проверке синтаксиса они не покажутся, а при компиляции
> "всплывут"....

Тебе видео снять?? Я говорю не про проверку синтаксиса, а про компиляцию (у меня кнопка Compile вынесена на панель). При первой компиляции вылезают хинты/варнинги (согласен), но если тут же нажать второй раз компиляция - все хинты/варнинги исчезают (исчезает и окно, в котором они выводились). :)


{RASkov}   (2008-03-16 13:15:00) [27]

> [57] Dimaxx ©   (16.03.08 12:44)
> // разве это не использование?

Незнай... незнай, тыж опять "вырванный кусок бросил", что там на самом деле было одному ...(вот и думай что тут(...) было) известно. :(
:о)


{RASkov}   (2008-03-16 13:09:00) [28]

> [61] Loginov Dmitry ©   (16.03.08 13:01)
> Если произошло исключение, то на кой черт мне этот результат нужен?

Обрати внимание, что компилятор, хоть и умный, но он не ИИ и он не может знать нужен тебе результат при исключении или нет, но предупредить об опасности это его работа и ничего в этом плохого нет, а вот не слушаться его и делать по своему - вот это плохо :(

ЗЫ: Тебе не нужен, а мне вот понадобился и что делать компилятору? :о)


Loginov Dmitry   (2008-03-16 13:01:00) [29]

> Да. Результат функции в твоем случае не будет возвращен.


Если произошло исключение, то на кой черт мне этот результат нужен?


{RASkov}   (2008-03-16 12:54:00) [30]

> [58] Dimaxx ©   (16.03.08 12:50)
> Кстати, еще в догонку вопрос: почему при первой компиляции,
> когда вылезают варнинги, компилятор их выдает, а если тут
> же снова скомпилировать программу (ессно без изменения текста)
> , то компилятор не выводит варнинги повторно?? Или он посчитал,
> что они исчезли? Или посчитал, что юзеру виднее? Или вообще
> забыл про них?

Что-то путаешь все таки наверное.... есть различия показа хинтов и варнингов при проверке синтаксиса и компиляции, т.е. при проверке синтаксиса они не покажуться, а при компиляции "всплывут"....


{RASkov}   (2008-03-16 12:51:00) [31]

> [56] Loginov Dmitry ©   (16.03.08 12:41)
> А регенерацию исключения в EXCEPT...END заметил? А пост
> [53] видел?

Видел :)

> По прежднему настаиваешь, что компилятор прав?

Да. Результат функции в твоем случае не будет возвращен. Обрати внимание, что компилятор при таком коде выдает не ошибку, а предупреждение, и он прав... ну сам подумай хорошенько :)


Dimaxx   (2008-03-16 12:50:00) [32]

Кстати, еще в догонку вопрос: почему при первой компиляции, когда вылезают варнинги, компилятор их выдает, а если тут же снова скомпилировать программу (ессно без изменения текста), то компилятор не выводит варнинги повторно?? Или он посчитал, что они исчезли? Или посчитал, что юзеру виднее? Или вообще забыл про них?


Dimaxx   (2008-03-16 12:44:00) [33]

Общий вид такой перебора списка. Все три типа, проверяемые в case, присутствуют 100%. Поэтому списать на то, что при blabla2 код не выполнится (следовательно P не используется) не получится.

var I,P: integer;

P:=0;
for I:=0 to 99 do
begin
 case ... of
   blabla1: <тут P не используется>
   blabla2:
     begin
       Listbox1.Add(Format('Item #%d',[P])); // разве это не использование?
       Inc(P);
     end;
   blabla3:<тут P не используется>
 end;
end;


Именно P не нравилась компилятору как неиспользуемая. Замена на 'Item #'+IntToStr(P) давала аналогичный результат. Добавлю. Орал компилятор не при каждой компиляции, а иногда, хотя код не менялся. После переустановки Дельфи исчез и этот глюк - проверено многократной компиляцией без изменения текста.


Loginov Dmitry   (2008-03-16 12:41:00) [34]

> А то что весь код обернут в try, а при исключении Result
> не возвращается... вот компилятор и предупреждает.... и
> правильно делает... и ничего ЗРЯ он не делает....


А регенерацию исключения в EXCEPT...END заметил? А пост [53] видел? По прежднему настаиваешь, что компилятор прав?


{RASkov}   (2008-03-16 12:27:00) [35]

> [51] Dimaxx ©   (16.03.08 11:01)
> Уже закрыта эта тема - проблема была в самой Дельфи.

Как всегда.... Дело было не в бабине...., так?
:о)

> Так вот компилятор ругался на то, что эта переменная-счетчик
> не используется. Согласитесь бред. Но это было.

Ну покажите хотя бы один пример с неправильной реакцией компилятора, но с логически верным кодом....


{RASkov}   (2008-03-16 12:12:00) [36]

> [52],[53] Loginov Dmitry ©   (16.03.08 11:24)
> Формально все правильно. Что его не устраивает?

А то что весь код обернут в try, а при исключении Result не возвращается... вот компилятор и предупреждает.... и правильно делает... и ничего ЗРЯ он не делает....
:о)

т.е. должно быть нечто так:
begin
 Result:=
 try

 except

 end;
end;

или
begin
 try
  Result:=
 except
  Result:=
 end;
end;

или
begin
 try
...
 finally
  Result:=
 end;
end;


Loginov Dmitry   (2008-03-16 11:45:00) [37]

Тоже самое получается здесь:

function TRecordMatrix.FieldByIndex(Index: Integer): TMatrix;
begin
   FieldListCriticalSection.Enter;
   try
     if (Index < 0) or (Index >= FFieldList.Count) then
       raise EMatrixError.CreateFmt(matSRecordIndexNotExists, [Index]);

     Result := TMatrix(FFieldList.Objects[Index]);
   finally
     FieldListCriticalSection.Leave;
   end;
end;


чудно! :)


Loginov Dmitry   (2008-03-16 11:24:00) [38]

Бывает иногда, что компилятор за зря Варнинги пишет. Не такая уж редкость. Обычно просто делаешь что он просит и о них забываешь. Вот здесь например выдает "[Warning] Matrix32.pas(10638): Return value of function 'TRecordMatrix.FieldByIndex' might be undefined". Формально все правильно. Что его не устраивает?


function TRecordMatrix.FieldByIndex(Index: Integer): TMatrix;
begin
 try
   NotifyListCriticalSection.Enter;
   try
     if (Index < 0) or (Index >= FFieldList.Count) then
       raise EMatrixError.CreateFmt(matSRecordIndexNotExists, [Index]);

     Result := TMatrix(FFieldList.Objects[Index]);
   finally
     NotifyListCriticalSection.Leave;
   end;
   Result.CheckRef;
 except
   on E: Exception do
     raise {$IFDEF RecreateEObj}ReCreateExceptObject(E, 'FieldByIndex', mkFunc){$ENDIF}
 end;
end;


Dimaxx   (2008-03-16 11:01:00) [39]

Уже закрыта эта тема - проблема была в самой Дельфи.

Была также проблема, что использовалась переменная-счетчик и ее значение использовалось для формирования строки типа "итем #1". Так вот компилятор ругался на то, что эта переменная-счетчик не используется. Согласитесь бред. Но это было. Я не обращал внимания на этот варнинг - код работал.

Переустановил начисто - все нормально стало. Исчезли все глюки... Не знаю как  более поздние версии, но не стоит увешивать дельфи тоннами всякой всячины.


Проходящий   (2008-03-16 06:44:00) [40]

> Dimaxx и всем
Спор. да спор. У меня были аналогичные проблемы.
На мой взгляд есть просто малая нестыковка, выполненная в компиляторе, которая к общему краху никогда не приведет.

1. Дельфи не любит не инициализированных переменных. Это факт. Вот он и  орет Вам об этом. Но он орет об этом когда? Только в процессе проверки правильности кода(то есть когда он может вам и ошибку выдать, варнинги и т.д.). Дело до оптимизации еще не дошло и построение исполняемого файла не выполнено.

2. После того как он проверит на правильность Ваш исходный код, только потом начинается его оптимизация и построение ехе-файла. Вот здесь то и оптимизатор выкидывает из исполняемого кода неиспользованные переменные. Тем самым строя более "правильный" исполняемый код в "его глазах". Вот и все.

Это малая нестыковка в самой системе и не более.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо