Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];

Вниз

Кто что думает по поводу...   Найти похожие ветки 

 
Rem   (2004-08-19 12:01) [0]

Вот это:

var
 iBuf: array[0..1023] of integer;
 i: integer;

begin
 for i := 0 to 1023 do
   iBuf[i] := Random(1000);
end;


в Debuger"е прогоняет цикл по i от 1024 до 1.


 
Думкин ©   (2004-08-19 12:04) [1]

уже обсуждалось.


 
Думкин ©   (2004-08-19 12:11) [2]

http://delphimaster.net/view/1-1091753019/


 
Anatoly Podgoretsky ©   (2004-08-19 12:19) [3]

Порядок не важен


 
Rem   (2004-08-19 13:21) [4]

Посмотрел [2]. Только вот незадача: там идет обсуждение случаев, когда переменная цикла не используется внутри цикла. В данном случае идет явное использование переменной цикла для указания индекса элемента массива. Массив-то от 0 до 1023. То-есть, запись идет в элементы массива с индексами не от 0 до 1023, а от 1 до 1024? Или все же идет неявная подстановка нужного индекса?

Вот пример:

var
 iBuf: array[0..1023] of integer;
 i: integer;

begin
 Randomize;
 ListBox1.Items.Clear;
 ListBox2.Items.Clear;  
 for i := 0 to 1023 do
   iBuf[i] := 0;
 for i := 0 to 1023 do
   iBuf[i] := Random(1000) + 1;
 for i := 0 to 1023 do // цикл 1
   ListBox1.Items.Add(IntToStr(iBuf[i]));
 for i := 0 to 1023 do // цикл 2
 begin
   ListBox2.Items.Add(IntToStr(iBuf[i]));
   iBuf[i] := i;  
 end;


В ListBox1 и ListBox2 вносятся одинаковые элементы, хоть в цикле 1 перебор идет от 1024 до 1, а в цикле 2 - от 0 до 1023.

Как отлаживать программу, если значение индексной переменной одно, а реально используется элемент массива с совершенно другим индексом?


 
Kerk ©   (2004-08-19 13:34) [5]

На самом деле странно, что меняется порядок прохода, хотя переменная используется внутри цикла.


 
Rem   (2004-08-19 14:01) [6]

Что, BugReport в Borland слать? Хотя, они же знают об этом - наверняка это где-то описано. Никто не встречал описания этой особенности?


 
Sandman25 ©   (2004-08-19 14:10) [7]

>Как отлаживать программу

Убрав галочку "оптимизация"


 
Digitman ©   (2004-08-19 14:12) [8]


> Rem   (19.08.04 14:01) [6]


> Что, BugReport в Borland слать?


прежде чем пороть горячку ответь на вопрос - массивы правильно в конечном итоге у тебя оказываются заполненными ?


 
DiamondShark ©   (2004-08-19 14:27) [9]

Блин. Достали.
Есть окно CPU.
Если туда заглянуть, можно увидеть, что для подобных циклов компилятор использует два регистра: один для счётчика повторений, другой для индекса массива.


> Как отлаживать программу

А нафига в отладчике следить за индексной переменной цикла for?


 
Holy   (2004-08-19 14:38) [10]


>DiamondShark ©   (19.08.04 14:27) [9]

Правильно говоришь...


> Rem   (19.08.04 12:01)

Неужели не писал на асме циклов... Там, если еще правильно помню, то LOOP уменьшает cx до нуля. Видимо поэтому у тебя и нестыкова логики и практики... Так как ты видишь цикл одним, а в памяти он смотрится по другому...


 
Kerk ©   (2004-08-19 14:42) [11]


> Там, если еще правильно помню, то LOOP уменьшает cx до нуля.

AFAIR, Delphi не использует инструкцию LOOP в циклах.
Там используется:
dec reg32
jnz @@next


 
Anatoly Podgoretsky ©   (2004-08-19 14:45) [12]

По сути одно и тоже, только это быстрее одиночной команжы loop


 
Rem   (2004-08-19 15:49) [13]

[7]
 не помогает

[8]
 Из серии "говорим одно, думаем другое, делаем третье"?

[9]
 Меня не интересует, сколько регистров используется. Вопрос не о регистрах вовсе. В данном случае я пользуюсь не ассемблером, а Object Pascal. В Object Pascal нет понятия регистра. Там есть понятие переменной. И если я пишу iBuf[i] := 0, и при этом i = 1023, то это значит, что элементу 1023 массива iBuf присваивается значение 0. Не больше, но и не меньше. На самом деле оказывается, что ноль заносится в ячейку 1. Debuger для того и предназначен, чтобы видеть реальную картину происходящего, а не побочные эффекты реализации этого разработчиками компилятора.
 А в цикле я слежу не за переменной цикла, а за индексом массива. И если, например, я читаю данные из порта, а затем заношу их в массив, то меня очень даже интересует, в каком порядке заносятся данные.

Давайте не отклоняться от темы: это Bug Debuger"a (упс, каламбур...)?

Чтобы не было снова кучи абстрактных комментариев, объясните:

Исходное условие:
 Цикл с переменной цикла i
 На некотором (не важно каком) шаге Debuger показывает i = 1023

Операция:
 Buf[i] := 0;
Вопрос:
 Какая ячейка массива Buf будет обнулена?

Желающим ответить "смотри окно CPU", задаю встречный вопрос: в приведенном примере недостаточно исходных данных?


 
Anatoly Podgoretsky ©   (2004-08-19 15:57) [14]

Выше говоришь про язык и индексы, а претензию тем не менее предхявляешь к отладчику, ты уж определись.
По приведеному коду опять же порядок не важен, во все ячейки честро будет записан 0.


 
Мастер ©   (2004-08-19 16:06) [15]

>Rem

Ты не ответил вот на какой вопрос - у тебя данные правильно заносятся в массив?


 
DiamondShark ©   (2004-08-19 16:16) [16]


> Rem   (19.08.04 15:49) [13]


> Вопрос:
>  Какая ячейка массива Buf будет обнулена?

Buf[i]

Этого достаточно.
А вот следить за значением i совсем не нужно.


 
Sandman25 ©   (2004-08-19 16:16) [17]

> не помогает

Нужно build выполнить, а не просто compile.


 
Holy   (2004-08-19 16:17) [18]

Rem, ну блин ну тебе же объясняют...

Ты видишь на ОП программу так, а то что видишь при выполнении зависит от настроек компилятоа и иже с ним. Какой-то кусок кода, который является лишним или никогда не выполняется будет выкинут при оптимизации. Будем в этом случае возмущаться что Борланд за тебя думает? Думай сам правильнее...

Ты пишешь на паскале, но когда дебаггер показывает память, то там асм (достаточно грубо сказано, но похоже на правду)

!!! Не нравится как сгенерил компилятор - напиши этот кусок сам на асме, только умудрись доказать, что так правильнее и оптимальнее для системы, а не для твоего понимания...


 
Igorek ©   (2004-08-19 16:21) [19]

Имхо налицо нестыковка Оптимизация-DebugInfo.

Если включено и DebugInfo и Оптимизация, то в любом случае не должна применяться никакая оптимизация кода, которая в отладчике покажет не то поведение, что юзер задал.

---
Еще одни грабли Delphi...


 
DiamondShark ©   (2004-08-19 16:27) [20]

Вы чего? Издеваетесь все?!
Ну нафига надо смотреть отладчиком параметр цикла for?


 
Rem   (2004-08-19 17:08) [21]

[14]
 >>Выше говоришь про язык и индексы, а претензию тем не менее предхявляешь к отладчику, ты уж определись.
 
 Отладчик для чего предназначен? Для отладки.
 Отладки чего? Исходного кода.
 Исходный код на чем пишется? На Object Pascal.
 Еще и название такое есть "пошаговая отладка", чтобы по шагам пройти по исходному коду на Object Pascal и посмотреть, так ли он выполняется?
 И если в отладчике у индексной переменной значение 1023, то это значит, что работа ведется с ячейкой массива 1023.

 >>По приведеному коду опять же порядок не важен, во все ячейки честро будет записан 0.
 
Ну, если уж желаете, то давайте так:
 
Исходное условие:
Цикл с переменной цикла i
На некотором (не важно каком) шаге Debuger показывает i = 1023

Операция:
Buf[i] := ReadFromPort("COM1:");
Вопрос:
В какую ячейку массива Buf будет занесено прочитанное из порта значение?

[18]
>>Ты пишешь на паскале, но когда дебаггер показывает память, то там асм
 Какой ассемблер? Я иду отладчиком по коду, написанному на Object Pascal. И все равно это не важно. Не важно, какой язык используется. Индексная пременная - она и Basic"е индексная переменная.
Неужели непонятно:

1. Debuger показывает i=1023
2. Buf[i] := 0; заносит 0 в ячейку 1 (не в 1023; зачем мне видеть 1023 вместо 1?). Откуда берется эта 1? Из другого регистра? Значит, это значение все же явно присутствует.
Его не надо изобретать.
Оно есть.
Почему тогда Debuger не показывает реального значения индексной переменной (из другого регистра)?

Ведь это значение строго соответствует исходному коду и логике работы программы.

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

Это - не моя программа, это - их реализация.

Вот мое мнение: Debuger должен показывать реальную работу каждой строчки программы.
Иначе теряется смысл Debuger"а.
Или мне надо радоваться от самого факта нажатия F8?
А то, что я вижу - не важно?
Нафига мне значения индексной переменной от 1024 до 1 вместо того, что я должен видеть от 0 до 1023?

Ответьте, зачем мне Debugger показывает 1024? Что мне это дает? Или это просто так, ради интереса?

Если я захочу увидеть оптимизированный ассемблерный код - я воспользуюсь соответствующими функциями оболочки. Но если я хочу видеть, как работает моя программа - то мне не должны подсовывать ложные значения.

[20]
 Buf[i] := ReadFromPort("COM1:");
 Где ты видишь тут параметр цикла for? Я вижу только индексную переменную i.


 
Anatoly Podgoretsky ©   (2004-08-19 17:20) [22]

Rem   (19.08.04 17:08) [21]
И если в отладчике у индексной переменной значение 1023, то это значит, что работа ведется с ячейкой массива 1023.

Наивный чукотский юноша, это значить только одно, отладчик показывает 1023

Buf[i] := ReadFromPort("COM1:");
Вопрос:
В какую ячейку массива Buf будет занесено прочитанное из порта значение?


Проверь тестом, а не отладчиком

1. Debuger показывает i=1023
2. Buf[i] := 0; заносит 0 в ячейку 1 (не в 1023; зачем мне видеть 1023 вместо 1?). Откуда берется эта 1? Из другого регистра? Значит, это значение все же явно присутствует.
Его не надо изобретать.
Оно есть.
Почему тогда Debuger не показывает реального значения индексной переменной (из другого регистра)?


Почему ты так уверен, а напримеh там так mov [eax-1023 + ebx]

Вот мое мнение: Debuger должен показывать реальную работу каждой строчки программы.

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

Нафига мне значения индексной переменной от 1024 до 1 вместо того, что я должен видеть от 0 до 1023?

Выключи оптимизацию, тебе это уже несколько раз сказали.

Если я захочу увидеть оптимизированный ассемблерный код - я воспользуюсь соответствующими функциями оболочки. Но если я хочу видеть, как работает моя программа - то мне не должны подсовывать ложные значения.

Бр, тебе ничего ложного не дают, работает строго в соответсвии с логикой указаной в коде.


 
Anatoly Podgoretsky ©   (2004-08-19 17:22) [23]

Да и если ты так недоволен Дельфи, то почему же ты тут сидишь? Почему не в другом языке и отладчике. Или ты ежик с кактусами?


 
Rem   (2004-08-19 17:45) [24]

>>Наивный чукотский юноша, это значить только одно, отладчик показывает 1023

Горячий эстонский парень, зачем мне 1023? С таким же успехом можно показать фигу.

Короче, я считаю, что если i = 1023, то строка
Buf[i] := 0;
должна заносить 0 в ячейку с номером 1023.
Это язык программирования. Тут все точно и формализировано.
И если при этом значение реально заносится в ячейку с индексом 0, то и значение индексной переменной должно быть 0.

Иначе пропадает любой смысл в таком понятии, как отладчик.

А Delphi я доволен. Все гораздо проще: я не доволен отладчиком.

P.S. "Мы оптимизировали телевизор! Теперь вместо любого цвета он показывает черный! В результате люминофор на вашем экране не выгорает совсем! При этом он на 1 канале показывает 65! Не выкидывайте деньги на ветер! Покупайте наш стильный телевизор!"



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.058 c
1-1092813495
Sergo_NIG
2004-08-18 11:18
2004.09.05
Как отследить изменение свойства компонента Enabled?


14-1092898007
gn
2004-08-19 10:46
2004.09.05
crypt


4-1090317648
TRyaSS
2004-07-20 14:00
2004.09.05
COM-порт.Немогу записать в порт.


1-1092713955
DmiSb
2004-08-17 07:39
2004.09.05
Аналог TStringAdapter в КОЛ ?


3-1092210115
Russel
2004-08-11 11:41
2004.09.05
Несандартное отображение данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский