Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

for i=1 to 10 do i=i+1- ошибка в дельфи .как отключить эту фишку


Страницы:   1 2

denisww ©   (2002-10-07 13:11:00) 

for i=1 to 10 do i=i+1- ошибка в дельфи .как отключить эту фишку


REA   (2002-10-08 10:57:00) [1]

Используйте C для таких наворотов. Там и как-то так можно:

for (i=i+1,i--;i<i+1;i+=2,i-=i-2);

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


Юрий Зотов   (2002-10-08 08:48:00) [2]

Дополнение.

Регистр используется, когда счетчиком цикла выступает локальная переменная. Если же глобальная - используется память. Почему - тоже понятно (событийное програмирование, однако - эта глобальная переменная может быть задействована в другом месте).

В последнем случае компилятор выдает предупреждение. И правильно делает - глобальная переменная мешает ему построить оптимальный код, о чем он честно сообщает. Но в этом случае можно написать, например, следующее (и ошибки не будет):

var
g: integer;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
for g := 0 to 2 do MessageBeep(0)
end;

procedure TForm1.FormClick(Sender: TObject);
begin
Inc(g)
end;


Юрий Зотов   (2002-10-08 01:44:00) [3]

> denisww

Ну, если Вы так уж сильно хотите узнать детали, то проделайте следующее.

1. Напишите любой цикл for, внутри него поставьте BreakPoint и запустите программу.

2. После остановки на BreakPoint"е откройте окно CPU и внимательно посмотрите ассемблерный код Вашего цикла.

3. Вы увидите, что для счетчика цикла компилятор использовал регистр, а не память. Надо ли объяснять, почему?

4. По этой причине менять счетчик цикла for внутри самого цикла бессмысленно. О чем и Вам и сообщается. И в Delphi используется уже далеко не тот Pascal, который был в TP для DOS. Это другой язык и у него другие правила. Похож - да, но не более.

5. Прежде, чем ругать Delphi или что-либо другое, было бы неплохо более детально ознакомиться с тем, что ругаешь. Иначе вспоминается басня одна... про мартышку и очки. Не читали?


still   (2002-10-07 14:34:00) [4]

а еще в паскале можно было получить длину строки как
s[0]
хотя во всей документации было сказано - НЕ ДЕЛАЙТЕ так.
в delphi строки физически представляются по-другому,
так что это работать не будет, а вот стандартное рекомендованное решение length(s) будет работать и там, и там.
Если еще по недокументированным функциям сохранять совместимость, то монстроидальность системы расти будет быстрей на порядок.


denisww   (2002-10-07 14:30:00) [5]

дельпхи это не сиси два крестика:(


denisww   (2002-10-07 14:29:00) [6]

есть предложения для борланда

платишь 1000бакинских дельфи работает
платишь 100 бакинских в дельфи обьектноорентированное програмирование неработает
за 10 баков нерабоает умножение , деление, 1 оператор цикла и тд
ну и так далее


Sectey   (2002-10-07 14:24:00) [7]

Delphi не позволяет изменять счетчик цикла оператора for. Данная переменная в теле цикла for to do имеет статус Read-only. Это реализовано для сохранения целлосности цикла. Если есть необходимость изменять переменную счетчика то можно использовать операторы цикла while do или repeat until.


denisww   (2002-10-07 14:06:00) [8]

где я наступил на логику тов паскаля


denisww   (2002-10-07 14:03:00) [9]

ну что сьели
и это хочу я сделать


still   (2002-10-07 14:03:00) [10]

юзай while


denisww   (2002-10-07 14:00:00) [11]

for i:=1 to 100 do if a[i]="Внимание прыгаю на -10" then i:=i-10;



Reindeer Moss Eater   (2002-10-07 13:58:00) [12]

for i:=1 to 100 do if a[i]="бздец" then Continue (*I:=101*);


denisww   (2002-10-07 13:55:00) [13]

for i:=1 to 100 do if a[i]="бздец" then I:=101;
работало в паскале а тут неееееее......................


Кот Бегемот   (2002-10-07 13:53:00) [14]

Это в голове у тебя ошибка !!!

>и паскаль раньше разрешал это делать
Нифига - позволял но все равно цикл for отрабатывался как надо а не так как тебе вздумается


Reindeer Moss Eater   (2002-10-07 13:53:00) [15]

Есть хорошее слово Continue
Специально для таких случаев


Демонов Е.В.   (2002-10-07 13:52:00) [16]

попробуй с указателями и/или ф-ией move, Fillchar


BizonWar   (2002-10-07 13:52:00) [17]

Если надо пропустить итерацию, поставь в теле цикла Continue, обработка перейдет к следующему значению i.


denisww   (2002-10-07 13:50:00) [18]

если информация на этой строке неполная тогда берём следующую строчку а к счётчику прибовляем +1 чтобы следующий раз считал через строчку

и паскаль раньше разрешал это делать

а вдруг я.....
он мне такое заявляет


denisww   (2002-10-07 13:47:00) [19]

Это где написанно что ненадо
а мне надо!!


AlexSam   (2002-10-07 13:18:00) [20]

Круто, такого я еще не видел. Ты претендент на самый крутой ФАК.
А если серьезно, то не нужно производить изменения переменных в цикле, по которым он отсчитывается. Если тебе так нравится i:=i+1, то замени while i<=10 do inc(i);


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо