{138) for i:=0 to Length(nomera)-1 do
{139) if X=nomera[i] then break;
{140} if i=Length(nomera)-1 then goto 2;
................................
{180} 2:
Build
[Warning] Unit1.pas(140): FOR-Loop variable 'i' may be undefined after loop
[Warning] Unit1.pas(140): FOR-Loop variable 'i' may be undefined after loop
[Warning] Unit1.pas(140): FOR-Loop variable 'i' may be undefined after loop В чём ошибка? И почему в трёх экземплярах?
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
01-09-2006 12:56
»вопрос КС №36060« - советую ознакомиться для э-э-э уложения полученной информации в голове... или лучше сказать, для лучшего усвоения пройденного материала.
>>>После этого я вернулся к варианту без переменной nomer_naiden и опять всё нормально скомпилировалось.
По всей видимости проблема в операторе goto
Этот код в BDS2006 выдаёт warning
function Search(const A: array of Integer; Value: Integer): Integer;
label b2;
var
I: Integer;
begin
for I := 0 to High(A) do
begin
if A[I] = Value then
goto b2;
end;
b2:
Result:=I;
end;
А этот нет
function Search(const A: array of Integer; Value: Integer): Integer;
begin
for Result := 0 to High(A) do
if A[Result] = Value then
break;
end;
>>>автор вопроса не удосужился даже перевести это слово
Я имел ввиду ошибку в написании кода, а не ошибку компиляции. Но всё равно за критику спасибо. В следующий раз буду ясней выражаться, а то кто-то поймёт так, кто-то - сяк, а кто и вообще запутается.
>>>Массив B заполняется правильно, но какое значение будет иметь I после завершения цикла не известно.
Прочитав это, я сделал так:
nomer_naiden:=false;
for i:=0 to Length(nomera)-1 do
if X=nomera[i]
then begin
nomer_naiden:=true;
break;
end;
if not(nomer_naiden) then goto 2;
Но компилятор выдал точно такие же три ошибки в другой строке.
В этой строке у меня тоже цикл for to do и тоже со счётчиком i.
Переименовав i в i2 все Warning's пропали!
После этого я вернулся к варианту без переменной nomer_naiden и опять всё нормально скомпилировалось.
Объяснить это не могу, но если у кого что подобное: то вот так!
Кстати, какой-то странный контрольный вопрос мне частенько попадается:Зимой серый, летом белый. Кто? Я всем эту загадку загадал - однозначного ответа так и не получил. И написал Антизаяц Но получил сообщение о неверности ответа! Ответ Заяц оказался правильным? Что это за заяц такой? Тоже не могу объяснить.
Ну это уже верх наглости - давать здесь такую ссылку! Во-первых, сайт citforum.ru известен тем, что копирует с чужих сайтов статьи, не спрашивая согласия ни авторов, ни администрации сайта. Во-вторых, в данном случае статья не просто скопирована, а скопирована с Королевства, да ещё и автором является сама Королева. Правильный адрес статьи - http://www.delphikingdom.com/asp/viewitem.asp?catalogid=777
По существу вопроса. Дело в том что в Delphi мощьный оптимизатор и когда ты пишеш цикл
for I:=0 to 100 do
переменная I меняется не от 0 до 100, а на оборот от 100 до 0, в нутри цикла Delphi нормально коректирует значение I и по этому когда ты пишеш
for I:=0 to 100 do
B[I]:=f(I);
Массив B заполняется правильно, но какое значение будет иметь I после завершения цикла не известно.
>>>Всё прекрасно сработало, последняя строка вывела на экран 10. Так что и в C переменные цикла доступны.
А у меня в BDS2006 выдаёт
[C++ Error] Unit1.cpp(14): E2451 Undefined symbol 'i'
Возможно всё зависит от настроек или от версии C++
for (int i = 0; i < IntArr.Length; i++)
Console.WriteLine(string.Format("{0}={1}", i, IntArr[i]));
Console.WriteLine(IntArr[i]); // <== строка 10
Console.WriteLine("\nPress <Enter> to...");
Console.ReadLine();
}
}
ForTest.cs(10,30): error CS0103: The name 'i' does not exist in the class or namespace 'ForTest'
А вот такой будет работать без ошибок
using System;
class ForTest {
static void Main() {
int[] IntArr = new int[] {10, 20, 30};
int i = 0;
for (i = 0; i < IntArr.Length; i++)
Console.WriteLine(string.Format("{0}={1}", i, IntArr[i]));
Console.WriteLine(IntArr[i]);
Console.WriteLine("\nPress <Enter> to...");
Console.ReadLine();
}
}
27-06-2006 03:41 | Комментарий к предыдущим ответам
Если б это был Си, а не Делфи, то переменная i вне цикла ваще была бы недоступна и была бы именно ошибка, а не Warning
Да ладно! Это только если писать
for (int i = 0; i < Legnth; i++)
А если написать так:
int i;
for (i = 0; i < Length; i++)
всё будет доступно.
Это в Аде переменные, используемые как счётчики цикла, просто невозможно объявить так, чтобы они были видны вне цикла. А в C можно объявить и так, и этак.
27-06-2006 02:48 | Комментарий к предыдущим ответам
Да уж... Если б это был Си, а не Делфи, то переменная i вне цикла ваще была бы недоступна и была бы именно ошибка, а не Warning (автор вопроса не удосужился даже перевести это слово).
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.