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

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

Не пойму почему ошибка при SetLetngth [D7, XP]


Страницы:   1 2

kostyl_kostyl ©   (2009-09-15 17:55:00) 

Не пойму почему ошибка при SetLetngth
Есть объект, у которого дискретно увеличиваются массивы свойств
procedure TMyObject.Add(NewValue: Integer);
var
 L: Integer;
begin
 L := length(Values);
 if (L  < Count + 1) then
 begin
    SetLength(Values, L + 10);
    SetLength(OtherValues, L + 10);
    SetLength(OtherOtherValues, L + 10);
 end;
 Values[Count] := NewValue;
 Inc(Count);
end;

То есть три свойства это массивы и я выделяю постепенно память для них. Все одни синхронизированы, то есть всегда имеют одинаковую длину?
И вот  SetLength(OtherValues, L + 10); происходит ошибка access violation read of adress...
Пробовал компилировать с {$R+}, все равно не пойму как понять почему такое бывает.


Rouse_   (2009-09-15 23:59:00) [21]


> KilkennyCat ©   (15.09.09 23:43) [5]
>
> последние две строчки тоже неплохо выглядят.

Нормально выглядят, там же проверка выше :)
Тут Сергей прав - где-то засираются указатели...


Achpile   (2009-09-15 23:46:00) [22]

делаешь так:

type
 TValue = record
   Value,
   OtherValue,
   OtherOtherValue: integer;
 end;

var
 Values: array of TValue;

procedure Add(NewValue: TValue);
begin
 SetLength(Values, Length(Values) + 1);
 Values[High(Values)] := NewValue;
end;

И все... Чтобы обратиться к любому элементу класса делаешь так:

Values[i].Value
или
Values[1].OtherValue

Ну вообщем как-то так... i - это индекс элемента, к которому хочешь обратиться...


KilkennyCat   (2009-09-15 23:43:00) [23]

последние две строчки тоже неплохо выглядят.


Rouse_   (2009-09-15 23:22:00) [24]


> Есть объект, у которого дискретно увеличиваются массивы
> свойств

Зачем "дискретно" увеличивать три массива, представляющие данные по одному значению, вместо того чтобы представить эти три значения одной записью и плясать уже от массива оных?


Сергей М.   (2009-09-15 21:43:00) [25]


> SetLength(OtherValues, L + 10); происходит ошибка access
> violation


Костыль тут простой - кто-то или что-о загадило содержимое структуры, скрываемой за идентификатором OtherValues


Сергей М.   (2009-09-15 21:37:00) [26]


> все равно не пойму как понять почему


Песня !


palva   (2009-09-15 19:07:00) [27]

Что такое массив свойств? Как в объекте описана Values?


Страницы:   1 2

Наверх

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