Главная страница
    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 - это что?



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

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

Наверх





Память: 0.56 MB
Время: 0.008 c
2-1205935938
Studios
2008-03-19 17:12
2008.04.13
TMemoryStream как превратиь в string?


2-1205745505
k@te4ka
2008-03-17 12:18
2008.04.13
указатель в процедуре


11-1187786759
mdw
2007-08-22 16:45
2008.04.13
Сайт http://www.kolnmck.ru/


4-1187003036
DevilDevil
2007-08-13 15:03
2008.04.13
Удалить все сообщения контролу из очереди сообщений


2-1205652230
NewSer
2008-03-16 10:23
2008.04.13
В чём причина появления ошибки: «parameter Kod not found»?(ADO)





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