![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не выполняются строки кода [D7, WinXP]
Chaser © (2005-08-24 09:41:00)Имеется код:
begin
z:=0;
k:=1;
p:=4;
if (i>1) and (i<6)
then
begin
x:=1;
z:=i-k;
for j:=1 to 11 do
begin
if (j>1) and (j<6)
then
begin
if (j-p)=i
then Str.Add('...')
else
begin
if (j-p)<0
then Str.Add('...');
if (j-p)>=1
then Str.Add('...');
dec(z);
end;
end;
...
end;
-> k:=k+2;
-> p:=p-1;
end;
end;
но вот эти две строки не выполняются:
k:=k+2;
p:=p-1;
Если вместо if (i>1) and (i<6)
поставить цикл, то они работают.
Почему так происходит и как это обойти?
Adder (2005-08-24 15:13:00) [1]В смысле - "внутри цикла", а не во "внутреннем цикле" -)
Adder (2005-08-24 15:01:00) [2]Chaser © (24.08.05 14:26) [15]
Дело в том что есть еще внешний цикл по i, скажем от 0 до ListBox1.Items.Count-1.
И при этом во внутреннем цикле ты делаешь
begin
z:=0;
k:=1;
p:=4;
Если пройтись отладчиком (с отключенной оптимизацией) - наверняка увидишь, что строчки
-> k:=k+2;
-> p:=p-1;
Ни на что не влияют
Alexander Panov (2005-08-24 14:27:00) [3]Тогда тебе придется весь код привести.
Chaser (2005-08-24 14:26:00) [4]Дело в том что есть еще внешний цикл по i, скажем от 0 до ListBox1.Items.Count-1.
Так что i попадает в интервал от 2 до 5.
Соответственно этот код
if (i>1) and (i<6)
then
begin
x:=1;
....
выполняется.
Плохиш (2005-08-24 14:20:00) [5]
> Chaser © (24.08.05 10:17) [6]
> Он почему-то пишет Хинт, что мол переменные "k", "p", и
> "z" не используются, хотя они ведь используются в программе,
1. Вообще-то компилятор говорит, что значения присвоенные переменным в отмеченных строчках не используются.
2. Кстати, ты сам ответил на свой вопрос:
> Если вместо if (i>1) and (i<6)
> поставить цикл, то они работают.
Adder (2005-08-24 14:14:00) [6]И второй вопрос - отладчиком смотрел?
Adder (2005-08-24 14:12:00) [7]Имеется код:
begin
z:=0;
k:=1;
p:=4;
if (i>1) and (i<6)
then
begin
x:=1;
А вот вопрос.... чему равно i?
Строка x:=1 и все последующее когда-нибудь выполняется?
Alexander Panov (2005-08-24 14:00:00) [8]>[10] Chaser © (24.08.05 13:36)
> Так они же используются в if'е!
Значит и эти if ни на что не влияют. А следовательно - не нужны.
Chaser (2005-08-24 13:36:00) [9]Так они же используются в if'е!
Alexander Panov (2005-08-24 12:26:00) [10]Chaser © (24.08.05 10:46) [8]
И как же мне поступить в моем случае?
Я думаю, что те переменные, которые не используются, надо убрать.
Chaser (2005-08-24 10:46:00) [11]И как же мне поступить в моем случае?
Alexander Panov (2005-08-24 10:30:00) [12]Chaser © (24.08.05 10:17) [6]
Сравни:
function A(const c: Char): String;
var
Sym: Char;
begin
Sym:= c;
Result := 'Результат - '+c;
end;
Компилятор здесь тоже скажет про Sym, что переменная не используется, потому что она действительно реально не используется.
Даже если ты присваиваешь переменной значение, а в пределах видимости эта переменная больше не используется, компилятор выбросит лишние операторы из твоего кода как ненужные. И он в джанном случае будет прав.
Chaser (2005-08-24 10:17:00) [13]Он почему-то пишет Хинт, что мол переменные "k", "p", и "z" не используются, хотя они ведь используются в программе, например
есть строка
cc:=SpinEdit1.Value-z-1;
или
pp:=SpinEdit1.Value-z;
или
xx:=j-p;
Потом здесь: Str.Add(Edit2.Text+'_'+IntToStr(pp)).
В чем проблема?
Anatoly Podgoretsky (2005-08-24 10:03:00) [14]Значит они не выполняют реальной работы и выкинуты оптимизатором.
Adder (2005-08-24 10:03:00) [15]Отключи оптимизацию, а потом выполни
> КаПиБаРа © (24.08.05 09:43) [1]
Chaser (2005-08-24 09:53:00) [16]"k" и "p" то есть.
Chaser (2005-08-24 09:52:00) [17]Значения k и z не меняются, эти строки просто игнорируются отладчиком и компилятором соотвественно.
КаПиБаРа (2005-08-24 09:43:00) [18]F7, F8 - пошаговое выполнение