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

Вниз

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

 
HelloEverybody ©   (2008-03-13 19:01) [0]

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

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

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


 
Сергей М. ©   (2008-03-13 19:20) [1]

Отключи в свойствах проекта оптимизацию. Удивись.


 
{RASkov} ©   (2008-03-13 19:27) [2]

Отключать собственно ничего не нужно, но нужно читать варнинги и "вкуривать" происходящее ;)


 
Leonid Troyanovsky ©   (2008-03-13 19:32) [3]


> {RASkov} ©   (13.03.08 19:27) [2]

> и "вкуривать" происходящее ;)

подсветив оный варнинг и жамкнув F1 :)

--
Regards, LVT.


 
Johnmen ©   (2008-03-13 19:51) [4]

Варнингов может и не быть в данном случае.


 
sniknik ©   (2008-03-13 20:14) [5]

> Буду благодарен за совет!
просто не нужно делать бессмысленных действий/присваиваний, присвоил чтото переменной? используй ее! и все станет на свои места. а оптимизатор лучше не трогать.


 
Семеныч   (2008-03-14 07:02) [6]

> HelloEverybody ©   (13.03.08 19:01)

Чтоб стало совсем понятно. У Вас получается что-то вроде этого: сначала переменной j присваивается ноль, а потом какое-то другое значение (явно или неявно) - и между этими двумя присвоениями переменная j никак не используется.

Ясно, что в этом случае присвоение j:=0 смысла не имеет. Оптимизирующий компилятор Delphi это обнаруживает и из кода его выбрасывает. Сообщение об ошибке он в таких случаях не выдает (потому что ошибки в программе и правда нет, а ошибки в логике программиста компилятор оставляет на его же совести), но выдает замечание (hint) или предупреждение (warning).

Которые обязательно нужно читать. И обязательно нужно добиваться того, чтобы их тоже не было. Иначе есть немалый шанс заполучить в программе баги, да еще и трудноуловимые.


 
Dimaxx ©   (2008-03-14 13:59) [7]

Кстати, подобное замечал. В процедуре использую локальную переменную не инициализируя ее (не пишу j:=0). Дельфи выдает предупреждение, что переменная не инициализирована. Лана, ставлю j:=0 - предупреждения нет.


> ...сначала переменной j присваивается ноль, а потом какое-то
> другое значение (явно или неявно) - и между этими двумя
> присвоениями переменная j никак не используется.
> Ясно, что в этом случае присвоение j:=0 смысла не имеет.
> Оптимизирующий компилятор Delphi это обнаруживает и из
> кода его выбрасывает.


Тогда на кой леший сигнализировать об отсутствии j:=0, если оптимизатор выкинет из кода это присваивание??


 
Плохиш ©   (2008-03-14 14:21) [8]


> Dimaxx ©   (14.03.08 13:59) [7]

Ты вообще понял о чём Семеныч писал? Или так а бы ляпнуть чего?


 
{RASkov} ©   (2008-03-14 14:31) [9]

> [7] Dimaxx ©   (14.03.08 13:59)

var i: Integer
begin
 i:=0;  //ни к чему hint от компилятора
 I:=x+y;
..................
var i: Integer
begin
 X:=I+y; // не инициализирована варнинг от компилятора
..................
var i: integer
begin
 n:=x+y; //i "ваще" нет хинт от компилятора и оптимизатор выкинет из конечного скомпилированного кода...
end;


 
Dimaxx ©   (2008-03-14 15:14) [10]


> Ты вообще понял о чём Семеныч писал? Или так а бы ляпнуть чего?

Я-то как раз понял о чем он, ибо часто сталкивался. А вот ты вроде не понял о чем я сказал.


> var i: Integer
> begin
>  i:=0;  //ни к чему hint от компилятора
>  I:=x+y;

В этом случае да, ибо присвоение 0 и тут же новое присвоение. А если

var i,x,y: integer
begin
 ...
 x:=4;
 ...
 y:=5;
 ...
 ...
 i:=x+y;
 ...
end;

орет, что i не инициализировано - ставишь i:=0 в начале и все отлично. Однажды даже столкнулся с такой тупостью, что переменная (не инициализированная) использовалась как временная для хранения промежуточного результата, далее выполнялись некие действия, а потом этот промежуточный рез-т заносился в поле record"а. И компилятор вякнул, что переменная объявлена, но нигде не используется... Видел такое только 1 раз - больше не попадалось. Даже не понял с какого перепугу он переменная не понравилась компилятору...


 
Плохиш ©   (2008-03-14 15:16) [11]


> var i,x,y: integer
> begin
>  ...
>  x:=4;
>  ...
>  y:=5;
>  ...
>  ...
>  i:=x+y;
>  ...
> end;
>
> орет, что i не инициализировано - ставишь i:=0 в начале
> и все отлично.

А свои многоточия проверить западло конечно, всё компилятор виноват...


 
Dimaxx ©   (2008-03-14 15:21) [12]

В многоточиях не упоминается ни x, ни y, ни i. Поэтому они тут не причем. Мне непонятен один момент: зачем орать, что переменная не инициализирована, если i:=x+y и так инициализация с присвоением результата (по большому счету мне по барабану значение, которое хранится в i до инициализации). Ну подумаешь она не в самом начале процедуры.


 
Johnmen ©   (2008-03-14 15:28) [13]


> Dimaxx ©   (14.03.08 15:14) [10]
> Dimaxx ©   (14.03.08 15:21) [12]

Ты, наверное, и if"ы замноготочил?
А потом удивляешься...:)

PS
Для полного успокоения напиши
var i,x,y: integer
begin
x:=4;
y:=5;
i:=x+y;
if i=0 then;
end;

потом расскажи :)


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


> Ты, наверное, и if"ы замноготочил?
> А потом удивляешься...:)

Я уже говорил, что


> В многоточиях не упоминается ни x, ни y, ни i. Поэтому они тут не причем.


 
Johnmen ©   (2008-03-14 15:58) [15]


> Dimaxx ©   (14.03.08 15:44) [14]

Какая логическая(или другая) связь между
> if"ы замноготочил?
и
>В многоточиях не упоминается ни x, ни y, ни i.
?


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

Связь в том, что в пропущенных командах не употребляются указанные переменные и тем более нет if"ов с i, на отсутствие инициализации которой и ругается компилятор. Вроде я правильно понял вопрос. Если нет - растолкуй что ты имел в виду. :)


 
clickmaker ©   (2008-03-14 16:28) [17]


>  [16] Dimaxx ©   (14.03.08 16:22)

в таком коде
x:=4;
y:=5;
i:=x+y;

максимум, что робко шепнет компилятор, это "value assigned to x(y,i) never used"
так что, не надо тут ля-ля


 
Johnmen ©   (2008-03-14 16:29) [18]


> Dimaxx ©   (14.03.08 16:22) [16]

Я уже сам забыл, что имел в виду :)
Ты просто попробуй [13] и прокомментируй результат...


 
Dimaxx ©   (2008-03-14 16:32) [19]


> x:=4;
> y:=5;
> i:=x+y;

Именно в таком - ессно.


 
clickmaker ©   (2008-03-14 16:35) [20]


> [19] Dimaxx ©   (14.03.08 16:32)

а в [10] разве не такой вид?


 
Семеныч   (2008-03-14 16:51) [21]

> Dimaxx ©   (14.03.08 16:22) [16]

> в пропущенных командах не употребляются указанные переменные и тем
> более нет if"ов с i, на отсутствие инициализации которой и ругается
> компилятор.

А это и не обязательно. Связь может быть и не такой явной. Например:

var
 i: integer;
begin
 try
   i := MyFunction(...);
 except
   on E: Exception do
     ShowMessage(IntToStr(i)); // Здесь компилятор ругнется.
 end;
end;


 
Anatoly Podgoretsky ©   (2008-03-14 16:54) [22]


> орет, что i не инициализировано - ставишь i:=0 в начале
> и все отлично

Лапшу на уши не вешай.


 
Семеныч   (2008-03-14 17:00) [23]

> Dimaxx ©   (14.03.08 16:22) [16]

Обратите внимание, что переменная, вроде бы, железно инициализируется - а оказывается, что нет. То же самое (или что-то типа этого) может быть и в Вашем примере [10], смотря что написано в многоточиях. Например:

var
  i, x, y: integer
begin
 try
   ...
   if (x = 0) or (y = 0) then
     raise ...;
   i := x + y;
 finally
   ... // Здесь переменная i может быть неинициализирована.
 end;
end;


 
Anatoly Podgoretsky ©   (2008-03-14 17:11) [24]

Если будет использоваться в finally, то конечно может быть неинициализирована.


 
Dimaxx ©   (2008-03-14 17:58) [25]


> Лапшу на уши не вешай.

Сначала попробуй - потом заявляй. :)

Народ, что в коде идет работа по выводу данных в listview (простой вывод в цикле). i - переменная для временного хранения промежуточных данных (которые более нигде не используются - только внутри цикла). Кроме суммы и последующей записи результата ничего с переменной не делается. Так вот именно отсутствие i:=0 в начале процедуры и не нравится компилятору. Но код рабочий и с i:=0 и без него. Никаких if"ов в коде нет вообще. Поэтому мне и непонятно - что именно не понравилось компилятору в неинициализированной переменной. Код процедуры дословно я уже не помню - было где-то год назад.

Если вам нравится придираться к словам - удачи...


 
Dimaxx ©   (2008-03-14 18:01) [26]


> а в [10] разве не такой вид?

За многоточием может скрываться десяток строк кода. В [17] у тебя просто три строки - в таком виде ессно данного варнинга не увидишь. :)


 
{RASkov} ©   (2008-03-14 18:08) [27]

> Dimaxx ©

Вот и я в твоем присутствии чувствую себя таким умным :)
Зачем спорить в том, что самому кажется глупым?


 
clickmaker ©   (2008-03-14 18:12) [28]


> [26] Dimaxx ©   (14.03.08 18:01)

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


 
Anatoly Podgoretsky ©   (2008-03-14 18:54) [29]

> Dimaxx  (14.03.2008 18:01:26)  [26]

В таком виде не скомпилируется, надо или убрать многоточия или замаскировать это, за тебя это уже сделали и доказали, что ты вешаешь лапшу на уши, все работает, а вот у тебя наверняка другая лапша, в которой ошибки.


 
Dimaxx ©   (2008-03-14 19:56) [30]


> Зачем спорить в том, что самому кажется глупым?

Так вот именно эта глупость и непонятна! Ладно если бы спрашивал непонимая где сам накосячил и доказывал бы свою правоту. Я как раз и хочу понять - почему иногда компилятор выдает такую чушь.


> все работает

Ну ты даешь! А я что - доказывал, что не работает? Именно что работает! Но почему компилятору не нравится так, а так (практически тоже самое, но с обнулением переменной до использования) сойдет - непонятно. Читай плз внимательнее.


> другая лапша, в которой ошибки

Какая другая? В простом заполнении listview данными из record"а без намека на целочисленную переменную (кроме переменной цикла)? Не смеши... :)


> что там может скрываться для получения варнинга

Я это все видел и знаю об этом. Я спросил о том, что непонятно: зачем компилятор предупреждает об отсутствии инициализации переменной, если оптимизатор все равно этот код инициализации (i:=0) выкинет? Логики 0! Вполне возможно это "подарки" Д5 (именно на ней сижу). В более поздних версиях этого может и не быть.


 
{RASkov} ©   (2008-03-14 20:27) [31]

> [30] Dimaxx ©   (14.03.08 19:56)

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


 
Dimaxx ©   (2008-03-14 21:15) [32]

Да нет уже этого кода - ессно бы привел...


 
{RASkov} ©   (2008-03-14 21:17) [33]

> [32] Dimaxx ©   (14.03.08 21:15)

Значит, давай договоримся, что ты что-то путаешь, ок? ;)


 
Dimaxx ©   (2008-03-14 21:31) [34]

Не путаю. Вот нашел пример (KOL). Tree заполнен данными в другой процедуре. Далее они динамически заполняются.

var Tree: PTree;

procedure TForm1.Button1Click(Sender: PObj);
var I,J,N: integer;
begin
 TreeView1.BeginUpdate;
 TreeView1.Clear;
 J:=TreeView1.TVInsert(0,0,"Root");
 N:=0;
 for I:=0 to pred(Tree.Count) do
   begin
     N:=TreeView1.TVInsert(J,N,Format("%s (%d)",[Tree.Items[I].Name,Tree.Items[I].Tag]));
     if Tree.Items[I].Count>0 then SetTree(Tree.Items[I],N);
   end;
 TreeView1.EndUpdate;
end;


Если так компилировать - все ОК, но стоит закомментировать N:=0 как компилятор ругается на неинициализированную переменную. Какая ему разница, если в цикле переменной присваивается конкретное значение? Код рабочий в обоих вариантах.


 
{RASkov} ©   (2008-03-14 21:37) [35]

> [34] Dimaxx ©   (14.03.08 21:31)

А теперь внимательно глянь на эту строку

> N:=TreeView1.TVInsert(J,N,Format("%s (%d)",[Tree.Items[I].Name, Tree.Items[I].Tag]));

как ты думаешь чему здесь должно быть ровно выделенная N???!!! это если с закоментированной строкой //N:=0;


 
Dimaxx ©   (2008-03-14 21:41) [36]

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


 
{RASkov} ©   (2008-03-14 21:41) [37]

> [34] Dimaxx ©   (14.03.08 21:31)

Ну и кто теперь дурак? Компилятор или.... ;)


 
{RASkov} ©   (2008-03-14 21:42) [38]

> [36] Dimaxx ©   (14.03.08 21:41)

Мыло мачало... :(
:о)


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

> [36] Dimaxx ©   (14.03.08 21:41)
> Но факт есть факт - не любит компилятор неинициализированных
> переменных.

Вообщето вы здесь с компилятором - правы, но ты споришь выше не об этом :)


 
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]


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

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


 
Dimaxx ©   (2008-03-16 23:08) [81]


> Хотя, и весьма сомнительно.

Сомневаться надо по поводу себя, а не других. :)


 
{RASkov} ©   (2008-03-16 23:20) [82]


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

> Того что нет?

Того что ЕСТ...)

> Что я там должен искать?

Ищи, как говорится (см [81]), свои косяки, а не компилятора....
:) Удачи.


 
sniknik ©   (2008-03-16 23:59) [83]

{RASkov} ©   (16.03.08 14:24) [71]
> Впрочем пример немного переделаю:
упрости, много лишнего.

procedure TForm1.Button2Click(Sender: TObject);

function Fu: Byte;
begin
 try
   result:= 1;
 except
 end;
end;

begin
 case Fu of
   1: ShowMessage("code 1");
 end;
end;


так достаточно.


 
sniknik ©   (2008-03-17 00:16) [84]

или даже лучше так

procedure TForm1.Button2Click(Sender: TObject);

function Fu: Byte;
begin
 try
   raise Exception.Create("always");
   result:= 1;
 except
 end;
end;

begin
 ShowMessage(IntToStr(Fu));
end;


так, просто таки очевидно, что функция действительно вернет не инициализированное значение.


 
Anatoly Podgoretsky ©   (2008-03-17 00:19) [85]

> sniknik  (16.03.2008 23:59:23)  [83]

Лучше

ShowMessage(IntToStr(Fu));


 
Dimaxx ©   (2008-03-17 01:08) [86]


> Ищи, как говорится (см [81]), свои косяки, а не компилятора...

Тебе бы следователем работать... Косяка нет, а про 6 строк и 100 строк ты так и не понял... :) Удачи...


 
{RASkov} ©   (2008-03-17 01:22) [87]

> [86] Dimaxx ©   (17.03.08 01:08)
> Косяка нет, а про 6 строк и 100 строк ты так и не понял..

Я понял только то, что "языком молоть"(сорри за выражение:) ты мастер, а что либо конкретно сказать по теме, увы... :(
Ладно... не буду тебя больше отвлекать - работай. Иначе не сюда "глючного кода" не напишешь, и работу свою не выполнишь ;)

> Удачи...

Спасибо, я не откажусь)


 
{RASkov} ©   (2008-03-17 01:26) [88]

> Dimaxx ©

И это.... не вздумай обидеться ;) ...ну мало ли) я ж в шутку [87])
В прочем можешь и обидеться - меня ты этим не обидешь :)


 
Dimaxx ©   (2008-03-17 10:20) [89]


> Я понял только то, что "языком молоть"(сорри за выражение:
> ) ты мастер

Тоже могу сказать и про тебя... :) Только это выражение тут неприменимо.


> И это.... не вздумай обидеться

Интересно на что я должен обидеться? :)



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

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

Наверх





Память: 0.72 MB
Время: 0.01 c
2-1206086434
Mishenka
2008-03-21 11:00
2008.04.13
Какие версии Дельфи могут работать с chm ами ?


15-1204015113
Ega23
2008-02-26 11:38
2008.04.13
Шифрование данных для Web-Server а


2-1205852672
Dima
2008-03-18 18:04
2008.04.13
Как включить и выключить микрофон?


15-1204209605
Interior
2008-02-28 17:40
2008.04.13
Видео чат по локальной сети


15-1204018720
@!!ex
2008-02-26 12:38
2008.04.13
Синхронизация потоков





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