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

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

Проблема с дебагом [D5, D6, Win2k]


vint45 ©   (2005-01-19 13:16:00) 

Всем привет!
У меня в приведенном ниже примере дебагер неверно отображает значение переменной inc1, приведу для начала сам код:

type

 THKActions = (hkaChoiceElList);
 TSHKActions = set of THKActions;
 THKFormComp = record
  Form: string;
  Component: string;
  AccActions: TSHKActions;
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   cbHKAction: TComboBox;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

const
 arrHKFormComp: array[0..0] of THKFormComp =
  ((Form:'AAAA'; Component: 'BBBB'; AccActions: [hkaChoiceElList]));
 arrHKNameAction: array[THKActions] of String =
  ('Выбор элемента из списка');

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var inc1: integer;
   inc2: THKActions;
begin
for inc1:=0 to High(arrHKFormComp) do begin
//  Self.Tag:=inc1;
 if     (AnsiUpperCase(Trim(arrHKFormComp[inc1].Form))=AnsiUpperCase(Trim('AAAA')))
    and (AnsiUpperCase(Trim(arrHKFormComp[inc1].Component))=AnsiUpperCase(Trim('BBBB')))
 then begin
  for inc2:=Low(arrHKNameAction) to High(arrHKNameAction) do
   if inc2 in arrHKFormComp[inc1].AccActions then cbHKAction.AddItem(arrHKNameAction[inc2],nil);
  Break;
 end;
end;
end;

так вот в обработчике события нажатия кнопки в цикле с inc1, после присвоения ей начального значения 0, дебагер показывает присвоенное значение 1 (и как следствие, неправильно отображает значения элементов массивов с inc1).
Просвятите, плз, может я что-то неправильно делаю или может это, например, неправильная оптимизация)?


vint45   (2005-01-19 14:19:00) [1]

спасибо


vint45   (2005-01-19 14:08:00) [2]

В общих чертах понятно, т.е., как я понял, основным моментом здесь является то, что для inc1 здесь все-таки включается алгоритм оптимизации кода.


Digitman   (2005-01-19 13:41:00) [3]


> хотелось узнать почему такая трабла возникает


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


vint45   (2005-01-19 13:30:00) [4]

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


Digitman   (2005-01-19 13:21:00) [5]

вместо //  Self.Tag:=inc1; напиши ShowMessage(inttostr(inc1)) и убедись, что значение inc1 в точности соответствует ожидаемому

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


Наверх

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