Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi 2009 for...in эксепшн 
:(
    Опции темы
v00d00
Дата 1.9.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 28.12.2005

Репутация: нет
Всего: нет



В цикле перебираются елементы TDictionary<string,extnended>

Код

procedure TAnalyser.SetValList(dic:TDictionary<string,extended>)overload;
var entry:TPair<string,extended>;
s:string;e:TFloat32;
begin
  FEvaluator.Free;
  FEvaluator:=TEvaluator.Create();

  if dic.Count > 0 then
  for entry in dic do
  begin
    s:=entry.Key;
    e:=entry.Value;
    FEvaluator.AddConst(s,e);
  end;

  AddStdFuncs;
end;


после того как данная процедура запускается 3 раз. Вылетает следующий эксепшн
user posted image

на строке 
Код

for entry in dic do


Для компиляции цикла for in используется следующий метод класса TDictionary

Код

function TDictionary<TKey,TValue>.TPairEnumerator.GetCurrent: TPair<TKey,TValue>;
begin
  Result.Key := FDictionary.FItems[FIndex].Key;
  Result.Value := FDictionary.FItems[FIndex].Value;
end;


Переменная FIndex имеет значение 4, что больше чем число элементов в списке.

Вот disassmebly процедуры в которой используется цикл for..in

Код

UnitExprEval.pas.144: FEvaluator.Free;
005E88A9 8B45FC           mov eax,[ebp-$04]
005E88AC 8B4014           mov eax,[eax+$14]
005E88AF E8D8B7E1FF       call TObject.Free
UnitExprEval.pas.145: FEvaluator:=TEvaluator.Create();
005E88B4 B201             mov dl,$01
005E88B6 A12C395D00       mov eax,[$005d392c]
005E88BB E800D0FEFF       call TEvaluator.Create
005E88C0 8B55FC           mov edx,[ebp-$04]
005E88C3 894214           mov [edx+$14],eax
UnitExprEval.pas.147: if dic.Count > 0 then
005E88C6 8B45F8           mov eax,[ebp-$08]
005E88C9 83780800         cmp dword ptr [eax+$08],$00
005E88CD 7E7F             jle $005e894e
UnitExprEval.pas.148: for entry in dic do
005E88CF 8B45F8           mov eax,[ebp-$08]
005E88D2 E899110000       call Generics + $5E9A70
005E88D7 8945EC           mov [ebp-$14],eax
005E88DA 33C0             xor eax,eax
005E88DC 55               push ebp
005E88DD 6847895E00       push $005e8947
005E88E2 64FF30           push dword ptr fs:[eax]
005E88E5 648920           mov fs:[eax],esp
005E88E8 EB2E             jmp $005e8918
005E88EA 8D55D0           lea edx,[ebp-$30]
005E88ED 8B45EC           mov eax,[ebp-$14]
005E88F0 E89F110000       call Generics + $5E9A94
UnitExprEval.pas.150: s:=entry.Key;
005E88F5 8D45F4           lea eax,[ebp-$0c]
005E88F8 8B55D0           mov edx,[ebp-$30]
005E88FB E874D8E1FF       call @UStrLAsg
UnitExprEval.pas.151: e:=entry.Value;
005E8900 DB6DD8           fld tbyte ptr [ebp-$28]
005E8903 D95DF0           fstp dword ptr [ebp-$10]
005E8906 9B               wait 
UnitExprEval.pas.152: FEvaluator.AddConst(s,e);
005E8907 FF75F0           push dword ptr [ebp-$10]
005E890A 8B45FC           mov eax,[ebp-$04]
005E890D 8B4014           mov eax,[eax+$14]
005E8910 8B55F4           mov edx,[ebp-$0c]
005E8913 E8FCD5FEFF       call TEasyEvaluator.AddConst
UnitExprEval.pas.148: for entry in dic do
005E8918 8B45EC           mov eax,[ebp-$14]
005E891B E860120000       call Generics + $5E9B80
005E8920 84C0             test al,al
005E8922 75C6             jnz $005e88ea
005E8924 33C0             xor eax,eax
005E8926 5A               pop edx
005E8927 59               pop ecx
005E8928 59               pop ecx
005E8929 648910           mov fs:[eax],edx
005E892C 684E895E00       push $005e894e


Если у вас были подобные проблемы. Или вы знаете чем может быть вызвана данная проблема пожалуйста поделитесь своими соображениями по данному вопросу.


P.S.


После добавления одного(1) элемента в словарь наблюдаем следующую картину:

user posted image

Видимо это какая-то оптимизация выделения памяти?


PM MAIL   Вверх
CodeMonkey
Дата 3.9.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Хорошо бы сказать, D2009 это или D2010 и стоят ли апдейты. Ибо TDictionary был жутко глючен и неюзабелен, пока его не поправили в апдейтах.

Добавлено через 3 минуты и 1 секунду
Ссылка.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
bems
Дата 4.9.2009, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Я не знаю что там с TDictionary, но вот пример с TList
Код

list := TList<TRecord>.Create;
try
 list.Add(RecordVariable);
 list.Delete(0)
finally
 list.Free
end;

Легче перечислить случаи когда оно работает, чем когда глючит. Если размер записи 4, то все нормально. Про большем или меньшем размере записи этот код дает AV в д2009. Исчезает глюк когда размер записи записи становится достаточно большим, чтобы стало проще работать с ней как с блоком памяти и не мучать регистры. В этих самых регистрах компилятор путается и генерирует бессмысленный код. Никакими апдейтами не исправлено, но в 2010 работает как надо.

Так что если топикстартер пробовал только под 2009, то советую попробовать под 2010 и если работает - принять решение забыть про дженерики под 2009, потому что по большому счету из там нет. Задекларированы, но не работают.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Alexeis
Дата 8.9.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(bems @  4.9.2009,  07:04 Найти цитируемый пост)
Легче перечислить случаи когда оно работает, чем когда глючит. Если размер записи 4, то все нормально. 

  С объектами работает?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bems
Дата 8.9.2009, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Работает. Объект же ссылка. Ровно 4 байта.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Alexeis
Дата 8.9.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(bems @  8.9.2009,  14:09 Найти цитируемый пост)
Работает. Объект же ссылка. Ровно 4 байта. 

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bems
Дата 8.9.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Для объектов вполне подходит старый TObjectList с приведением типа. Тут и дженерики не то чтобы и сильно нужны.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1182 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.