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

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

Господи, да что ж делается-то?! [D5, Win95/98]


Страницы:   1 2 3

Baz ©   (2001-12-26 10:21:00) 

Здравствуйте, мэтры!
ПОЧЕМУ после выполнения строки
for M:=-1000 to 1000 do
переменная М становится равна 2001, а, если изменить на
for M:=-100 to 1000 do
то 1101. М описана как integer. Я чего-то не знаю, или пора из компа бесов изгонять?!
Заранее спасибо за любые подсказки
Baz.


Alx2   (2001-12-27 14:24:00) [1]

Оптимизация=выигрыш в скорости и/или в размере etc.
Обычно не используется при отладке и профилировании программы.
Обычно используется в подготовке релизов.

Вообще, смотря что подо что оптимизировать.
В Delphi оптимизация сбалансированная. Дает выигрыш в размере и скорости. Но есть и исключения.

Об этом можно говорить до бесконечности, см. литературу по компиляторам, архитектуре процессоров, их конвейерах, предсказателей ветвления и еще о множестве других наворотов.

Если пишешь на ассемблере, то ты сам себе оптимизатор.
Если на языке высокого уровня, то, как правило, нечего заботится о сгенерированном коде, если не стоят специальные задачи.


Baz   (2001-12-27 14:03:00) [2]

to Alx2
Я уже отключил :). Но народ тут говорит, что она, вроде как, ничему не мешает. А зачем-то же она есть? Скомпилированный код меньше? Ну и я, собственно, продолжаю спрашивать, чтобы уже просто побольше узнать и, плюс, вдруг кто-нибудь про какие-нибудь грабли вспомнит?


VitHouse   (2001-12-27 12:47:00) [3]

vari: integer;
begin
i := 0;
fori := -100 to100 do
begin
end;
caption := inttostr(i);//будет ровно 100
end;


Alx2   (2001-12-27 12:45:00) [4]

>Baz
Отключаешь оптимизацию и смотришь...
Плохого не произойдет. Только упадет скорость выполнения программы.
Если раздражает "непонятное" поведение переменных в отладчике - отключи оптимизацию. Когда все отладишь - включи ее и продавай прогу :)).
PS
Уже третий раз пишу про отключить/включить оптимизацию 8-(


gek   (2001-12-27 12:36:00) [5]

Во елки-моталки, из-за чего спрашивается такой базар развели?
Из-за чепухи.


Baz   (2001-12-27 12:35:00) [6]

Во я спросил! Аж приятно, сколько копий ломается :). Раз уж разговор идет, продолжаю спрашивать. Я оптимизацию представляю весьма смутно. Что, вообще, произойдет плохого, если я ее отключу? Код сейчас не вспомню, но неколько раз натыкался на то, что не мог посмотреть значение I внутри цикла for I:=...... , если не вставлял в конце что-нибудь вроде If I>0 then; А частенько бывает нужно. А вот, к слову, только что набросал:

procedure TForm1.Button1Click(Sender: TObject);
var I,J:integer;
begin
J:=0;
for I:=0 to 10 do
J:=J+1;
if J>1 then;
end;
Здесь при проходе цикла I почему-то меняется от 11 до 1. Это имеет отношение к оптимизации?


Alx2   (2001-12-27 12:30:00) [7]

>nil
Так ведь опыт - сын ошибок трудных :))


nil   (2001-12-27 12:26:00) [8]

г-н МОДЕРАТОР, я думаю что, если бы молодой человек, затеявший эту дискуссию, не перепахивал свой код сто раз, а изначально разбил бы код на логические составляющие, то и не было бы всех этих страстей. А с точки зрения работодателя, мне нужен код читамый с одного взгляда, и если структура кода сделана правильно то я, в своей команде, могу закрыть глаза и на отсутсвие коментариев.


NUU   (2001-12-27 11:37:00) [9]

To nil ©
А я бы к такому и работать не пошел


Alx2   (2001-12-27 11:27:00) [10]

???


Alx2   (2001-12-27 11:23:00) [11]


Baz"у, конечно, виднее. Но я думаю, что все уперлось в то, что в дебаггере ему надо было видеть значения любых переменных. А оптимизация это не обеспечивает. Посему выход: временно ее отключить (на время отладки).

Кстати,в Microsoft Visual C++ есть конфигурации Release и Debug.
В Debug оптимизации практически нет и видны все переменные. Но если выбрать Release, то многие локальные переменные накрываются медным тазом (ясно, почему). И, поверьте, оптимизация в MVC много лучше, чем в Delphi.

Но я, например, пишу на Delphi из-за комфорта, а скоростные алгоритмы, если допечет, конечно, делаю на MVC (связка с Delphi-project через DLL).


ValeraVV   (2001-12-27 11:11:00) [12]

Поясню (ValeraVV © (27.12.01 10:35)),
1.var
2. i:integer; //Объявили локальную переменную (Выделили память в стеке)
3.begin
4. for i:=0 to 100 do //1-ая итереция - Обнулили регистр, остальные - сверили значение регистра с 100
5. begin
6. Label1.Caption:=IntToStr(i); //для вызывая IntToStr передали ей значение регистра
7. end; // увеличили регистр
8.end;


По логике Baz © (26.12.01 10:21), где-то в строчке 6. надо было бы подставить в i (то есть в стек) значение регистра, затем для функции IntToStr подставить значение i (из стека), вопрос зачем?


ValeraVV   (2001-12-27 11:10:00) [13]

Поясню (ValeraVV © (27.12.01 10:35)),
1.var
2. i:integer; //Объявили локальную переменную (Выделили память в стеке)
3.begin
4. for i:=0 to 100 do //1-ая итереция - Обнулили регистр, остальные - сверили значение регистра с 100
5. begin
6. Label1.Caption:=IntToStr(i); //для вызывая IntToStr передали ей значение регистра
7. end; // увеличили регистр
8.end;

По логике Baz © (26.12.01 10:21), где-то в строчке 6. надо было бы подставить в i (то есть в стек) значение регистра, затем для функции IntToStr подставить значение i (из стека), вопрос зачем?


Алексей Петров   (2001-12-27 10:55:00) [14]

> Андрей Сенченко © (26.12.01 11:42)
Твой пример кода по одному параметру не подходит под утверждение "Если переменная цикла не используетсяв теле цикла, то тебе все равно, как она отсчитывается.".

У тебя в цикле идет присвоение Label1.Caption := IntToStr(i);и компилятор себе вольностей позволить уже не может.
Сделай тело цикла пустым, например, и результат будет другим.



ValeraVV   (2001-12-27 10:35:00) [15]

Структурное программирование ни при чем, если для организации for всего лишь нужно использовать регистр процессора, то зачем выделять под нее (переменную) память и обращаться к этой памяти каждый раз внутри цикла - оптимизатор действует нелогично? А логично выглядел бы ассемблерный код если бы все компилилось так как надо Baz © (26.12.01 10:21). Программа пишется всего один раз, и множество раз исполняется, что важнее?


Labert   (2001-12-27 09:36:00) [16]

To Виктор Щербаков
Ну это примерно то же самое, что и "хороший тон" в программировании. То есть - без Goto, и т.п. Если интересно, можно поискать в яндексе что-нибудь по структурному программированию.


Alx2   (2001-12-27 09:32:00) [17]

Labert, собственно говоря, речь сейчас идет не о значении переменой после цикла, а о работе дебаггера на оптимизированном коде.

Ну а про значение переменной цикла за его пределами говорить даже не стоит. Согласен, нет этого значения в общем случае да и не нужно оно, если подумать...


Виктор Щербаков   (2001-12-27 09:26:00) [18]

Labert (27.12.01 09:19)
Хм...
И что же это за правила такие???


Baz   (2001-12-27 09:23:00) [19]

Не буду врать, что все понял из предыдущего ответа, но метод борьбы уяснил, кажется. Спасибо!


Labert   (2001-12-27 09:19:00) [20]

Эх вы, "мастера"!
Единственную разумную мысль на этой ветке высказал panov. За пределами цикла переменная цикла не определена. Придерживайтесь правил структурного программирования, товарищи!


Страницы:   1 2 3

Наверх

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