Текущий архив: 2008.04.13;
Скачать: CL | DM;
Вниз
Компилятор пропускает команду... Найти похожие ветки
← →
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 строк, но с тем самым хинтом, об НЕ использовании переменной Pvar 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;
Скачать: CL | DM;
Память: 0.63 MB
Время: 0.01 c