![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Компилятор пропускает команду... [Delphi, Windows]
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 нет. В отладчике вообще пропускает эту строчку. При этом не ругается, как будто все в порядке... никак не пойму в чем дело?
Буду благодарен за совет!
Anatoly Podgoretsky (2008-03-14 18:54:00) [61]> Dimaxx (14.03.2008 18:01:26) [26]
В таком виде не скомпилируется, надо или убрать многоточия или замаскировать это, за тебя это уже сделали и доказали, что ты вешаешь лапшу на уши, все работает, а вот у тебя наверняка другая лапша, в которой ошибки.
clickmaker (2008-03-14 18:12:00) [62]
> [26] Dimaxx © (14.03.08 18:01)
ну так тебе Семеныч тут уже привел примеры, что там может скрываться для получения варнинга.
{RASkov} (2008-03-14 18:08:00) [63]> Dimaxx ©
Вот и я в твоем присутствии чувствую себя таким умным :)
Зачем спорить в том, что самому кажется глупым?
Dimaxx (2008-03-14 18:01:00) [64]
> а в [10] разве не такой вид?
За многоточием может скрываться десяток строк кода. В [17] у тебя просто три строки - в таком виде ессно данного варнинга не увидишь. :)
Dimaxx (2008-03-14 17:58:00) [65]
> Лапшу на уши не вешай.
Сначала попробуй - потом заявляй. :)
Народ, что в коде идет работа по выводу данных в listview (простой вывод в цикле). i - переменная для временного хранения промежуточных данных (которые более нигде не используются - только внутри цикла). Кроме суммы и последующей записи результата ничего с переменной не делается. Так вот именно отсутствие i:=0 в начале процедуры и не нравится компилятору. Но код рабочий и с i:=0 и без него. Никаких if'ов в коде нет вообще. Поэтому мне и непонятно - что именно не понравилось компилятору в неинициализированной переменной. Код процедуры дословно я уже не помню - было где-то год назад.
Если вам нравится придираться к словам - удачи...
Anatoly Podgoretsky (2008-03-14 17:11:00) [66]Если будет использоваться в finally, то конечно может быть неинициализирована.
Семеныч (2008-03-14 17:00:00) [67]> 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 16:54:00) [68]
> орет, что i не инициализировано - ставишь i:=0 в начале
> и все отлично
Лапшу на уши не вешай.
Семеныч (2008-03-14 16:51:00) [69]> 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;
clickmaker (2008-03-14 16:35:00) [70]
> [19] Dimaxx © (14.03.08 16:32)
а в [10] разве не такой вид?
Dimaxx (2008-03-14 16:32:00) [71]
> x:=4;
> y:=5;
> i:=x+y;
Именно в таком - ессно.
Johnmen (2008-03-14 16:29:00) [72]
> Dimaxx © (14.03.08 16:22) [16]
Я уже сам забыл, что имел в виду :)
Ты просто попробуй [13] и прокомментируй результат...
clickmaker (2008-03-14 16:28:00) [73]
> [16] Dimaxx © (14.03.08 16:22)
в таком коде
x:=4;
y:=5;
i:=x+y;
максимум, что робко шепнет компилятор, это "value assigned to x(y,i) never used"
так что, не надо тут ля-ля
Dimaxx (2008-03-14 16:22:00) [74]Связь в том, что в пропущенных командах не употребляются указанные переменные и тем более нет if'ов с i, на отсутствие инициализации которой и ругается компилятор. Вроде я правильно понял вопрос. Если нет - растолкуй что ты имел в виду. :)
Johnmen (2008-03-14 15:58:00) [75]
> Dimaxx © (14.03.08 15:44) [14]
Какая логическая(или другая) связь между
> if'ы замноготочил?
и
>В многоточиях не упоминается ни x, ни y, ни i.
?
Dimaxx (2008-03-14 15:44:00) [76]
> Ты, наверное, и if'ы замноготочил?
> А потом удивляешься...:)
Я уже говорил, что
> В многоточиях не упоминается ни x, ни y, ни i. Поэтому они тут не причем.
Johnmen (2008-03-14 15:28:00) [77]
> 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:21:00) [78]В многоточиях не упоминается ни x, ни y, ни i. Поэтому они тут не причем. Мне непонятен один момент: зачем орать, что переменная не инициализирована, если i:=x+y и так инициализация с присвоением результата (по большому счету мне по барабану значение, которое хранится в i до инициализации). Ну подумаешь она не в самом начале процедуры.
Плохиш (2008-03-14 15:16:00) [79]
> var i,x,y: integer
> begin
> ...
> x:=4;
> ...
> y:=5;
> ...
> ...
> i:=x+y;
> ...
> end;
>
> орет, что i не инициализировано - ставишь i:=0 в начале
> и все отлично.
А свои многоточия проверить западло конечно, всё компилятор виноват...
Dimaxx (2008-03-14 15:14:00) [80]
> Ты вообще понял о чём Семеныч писал? Или так а бы ляпнуть чего?
Я-то как раз понял о чем он, ибо часто сталкивался. А вот ты вроде не понял о чем я сказал.
> 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 раз - больше не попадалось. Даже не понял с какого перепугу он переменная не понравилась компилятору...