Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];

Вниз

Компилятор пропускает команду...   Найти похожие ветки 

 
Anatoly Podgoretsky ©   (2008-03-14 21:48) [40]

> Dimaxx  (14.03.2008 21:31:34)  [34]

Это где же инициализировано

N:=TreeView1.TVInsert(J,N - это что?


 
Anatoly Podgoretsky ©   (2008-03-14 21:48) [41]

> Dimaxx  (14.03.2008 21:41:36)  [36]

Я тоже не люблю неинициализированных переменных. И компилятор солидарен.


 
Dimaxx ©   (2008-03-14 21:49) [42]

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


 
{RASkov} ©   (2008-03-14 21:49) [43]

> [40] Anatoly Podgoretsky ©   (14.03.08 21:48)

говорит, что пример не удачный ;)


 
{RASkov} ©   (2008-03-14 21:50) [44]

> [42] Dimaxx ©   (14.03.08 21:49)

Значит [33]? :)


 
{RASkov} ©   (2008-03-14 21:57) [45]

> [42] Dimaxx ©   (14.03.08 21:49)
> а писать времени нет, чтобы продемонстрировать

с 13:59 споришь и, наверняка, что еще дальше будешь спорить :) а говоришь времени нет )


 
Dimaxx ©   (2008-03-14 22:04) [46]

Кстати, походу проблема у меня в Д5 (система стоит давно, дельфи тоже - че тока на нее не вешал) - заменил N на 0 в TVInsert. Компилятор опять ругнулся (с чего бы вдруг?). Сохранил, закрыл, открыл снова. Больше не ругается. Снес Д5, вычистил реестр, поставил с нуля. Открыл проект - не ругается. Ну я же не слепой? Или мне мерещится?...


> с 13:59 споришь и, наверняка, что еще дальше будешь спорить
> :) а говоришь времени нет )

Я работаю, а браузер открыт постоянно. Нажать "Обновить" и прочитать не много времени надо... :)


 
Anatoly Podgoretsky ©   (2008-03-14 22:04) [47]

> {RASkov}  (14.03.2008 21:49:43)  [43]

Да давно уже говорит


 
{RASkov} ©   (2008-03-14 22:09) [48]

> [46] Dimaxx ©   (14.03.08 22:04)
> Нажать "Обновить" и прочитать не много времени надо... :)

Но чтобы вести аргументированный спор время все-таки нужно....
иначе... вообщем знаешь уже, я тебе говорил на что ты и твой спор похожи... ;)


 
Семеныч   (2008-03-15 22:28) [49]

> Dimaxx

Оххх... много-много раз я думал так же, как и Вы - дурак, мол этот компилятор, плюется варнингами почем зря.

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

Он и правда не дурак, поверьте. И как только я это понял и стал добиваться абсолютно чистой компиляции, он сэкономил мне массу времени и нервов.


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

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

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

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

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


 
Dimaxx ©   (2008-03-16 11:01) [51]

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

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

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


 
Loginov Dmitry ©   (2008-03-16 11:24) [52]

Бывает иногда, что компилятор за зря Варнинги пишет. Не такая уж редкость. Обычно просто делаешь что он просит и о них забываешь. Вот здесь например выдает "[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;


 
Loginov Dmitry ©   (2008-03-16 11:45) [53]

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

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;


чудно! :)


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

> [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;


 
{RASkov} ©   (2008-03-16 12:27) [55]

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

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

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

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


 
Loginov Dmitry ©   (2008-03-16 12:41) [56]

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


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


 
Dimaxx ©   (2008-03-16 12:44) [57]

Общий вид такой перебора списка. Все три типа, проверяемые в 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) давала аналогичный результат. Добавлю. Орал компилятор не при каждой компиляции, а иногда, хотя код не менялся. После переустановки Дельфи исчез и этот глюк - проверено многократной компиляцией без изменения текста.


 
Dimaxx ©   (2008-03-16 12:50) [58]

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


 
{RASkov} ©   (2008-03-16 12:51) [59]

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

Видел :)

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

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


 
{RASkov} ©   (2008-03-16 12:54) [60]

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

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


 
Loginov Dmitry ©   (2008-03-16 13:01) [61]

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


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


 
{RASkov} ©   (2008-03-16 13:09) [62]

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

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

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


 
{RASkov} ©   (2008-03-16 13:15) [63]

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

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


 
Dimaxx ©   (2008-03-16 13:39) [64]


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

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


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

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


 
Loginov Dmitry ©   (2008-03-16 13:40) [65]

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


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


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


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


 
Dimaxx ©   (2008-03-16 13:43) [66]

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


 
{RASkov} ©   (2008-03-16 13:45) [67]

Ну фик знает... просто не нужно перечить компилятору и все будут довольны :)
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;


 
{RASkov} ©   (2008-03-16 13:49) [68]

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

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

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

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


 
{RASkov} ©   (2008-03-16 13:51) [69]

> У меня D7 (Build 4.453)

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


 
{RASkov} ©   (2008-03-16 14:09) [70]

> [65] Loginov Dmitry ©   (16.03.08 13:40)
> И тебе он не понадобится.

Да черт с ним с примером из [67], но тыж сам говоришь, что

> В 99,9%

и ведь не отрицаешь 0,1%, вот для него и выдает варнинги компилятор...:)


 
{RASkov} ©   (2008-03-16 14:24) [71]

> Да черт с ним с примером из [67],

Впрочем пример немного переделаю:
function Fu(N: Byte): Byte;
begin
 try
  if (N=0) or (N=5) then raise Exception.Create("Zero or 5");
  Result:=(10 div N)+1;
 except
  ShowMessage("Error");
  //Result:=255;
 end;
end;

case fu(5) of
0: ShowMessage("code 0");
1: ShowMessage("code 1");
2: ShowMessage("code 2");
3: ShowMessage("code 3");
255: ShowMessage("Error code");
end;

И вот если расскоментировать //Result:=255; - то все встает на свои места....)


 
Dimaxx ©   (2008-03-16 14:44) [72]


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

Уже ничего не глючит! Ты как читаешь? :) Все решилось переустановкой Дельфи. Теперь код компилируется нормально.


 
{RASkov} ©   (2008-03-16 14:49) [73]

> [72] Dimaxx ©   (16.03.08 14:44)
> Уже ничего не глючит! Ты как читаешь? :)

Я читаю нормально, а сказанное было не на текущий твой момент, а к твоему спору об "глупом компиляторе" :)


 
Dimaxx ©   (2008-03-16 14:49) [74]


> а ты нет

Мне привести весь код процедуры, занимающей сотню-другую строк ради двух важных? Указанная мной переменная Р используется в двух строках. Вот их я и привел.


 
{RASkov} ©   (2008-03-16 18:39) [75]

> [74] Dimaxx ©   (16.03.08 14:49)
> Мне привести весь код процедуры, занимающей сотню-другую
> строк ради двух важных?

Зачем сотню? вот смотри код из 6 строк, но с тем самым хинтом, об НЕ использовании переменной P
var P: Integer;
begin
 P:=0;
 P:=10+15;
 Caption:=Format("Item #%d",[P]); //Но я же ее использую!!! ;)
end;

Вот и ищи в своих 100-200 строках нечто то что я тебе привел в 6... и поверь, найдешь :)
:о)


 
Плохиш ©   (2008-03-16 18:51) [76]


> Dimaxx ©   (16.03.08 13:39) [64]


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

При компиляции, в отличии от "build", компилятор заного компилирует только изменившиеся с последнего компилирования модули, а для остальных берёт уже существующие dcu, таким образом в твоём приведённом случае компиляция заключается только в проверки соответствий времени изменений pas- и dcu-файлов и последующая сборка exe.

PS. Вынеси себе кнопку Build и удивись.


 
Anatoly Podgoretsky ©   (2008-03-16 19:00) [77]

Изучи как работает компиляция в Дельфи, а если очень хочешь, то делай перестроение, а не компиляцию.


 
Dimaxx ©   (2008-03-16 20:48) [78]


> Вот и ищи в своих 100-200 строках нечто то что я тебе привел
> в 6... и поверь, найдешь :)

Вот ведь буквоед! :) Что я там должен искать? Того что нет? Ты привел точно такой же пример что и я. Весь остальной код у меня не касается этой переменной. Я привел тот участок, где она используется. Если у тебя эти 6 строк дают тот же хинт, что и мои 100 - значит дело не в остальном коде, а в этих 6 строках (только в моем коде их всего 2, если не считать Р:=0)... Как еще объяснить? :)


> Изучи как работает компиляция в Дельфи

Зачем? Я же не пишу свой компилятор. Меня интересует написание программы, получение exe из кода и правильная работа. А анализ кода, компиляцию и сборку изучали и писали авторы Дельфи. Для написания программы мне не нужно знать как это делает Дельфи внутри. Меня, например, не интересует как работает 3D Max - мне важен результат, полученный с его помощью. А применить этот результат - это уже моя забота. Что мне для этого надо изучить - я изучу. А лезть в дебри ни к чему...


 
Leonid Troyanovsky ©   (2008-03-16 20:58) [79]


> Dimaxx ©   (16.03.08 20:48) [78]

>  Что мне для этого надо изучить - я изучу.

Что же, будем надеяться.
Хотя, и весьма сомнительно.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2008-03-16 21:08) [80]


> Зачем? Я же не пишу свой компилятор.

Тогда не задавай вопрос.
Этоже издевательство, сначала задаем, а потом говорим что не надо.



Страницы: 1 2 3 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.64 MB
Время: 0.064 c
2-1205343170
MegaPiha
2008-03-12 20:32
2008.04.13
Как создать "живой" SQL запрос?


15-1204081129
Slider007
2008-02-27 05:58
2008.04.13
С днем рождения ! 27 февраля 2008 среда


6-1184911760
plotn
2007-07-20 10:09
2008.04.13
TCPClient


15-1204098805
Ega23
2008-02-27 10:53
2008.04.13
GUID - насколько уникален?


2-1205754947
Sonia
2008-03-17 14:55
2008.04.13
Графика на TurboPascal





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