![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
record в record'е [D6, XP]
Knock © (2007-04-02 11:39:00)Привет. Пишу на KOL. Есть код:
type
PPoints = ^TPoints;
TPoints = record
InPoint: integer;
OutPoint: integer;
end;
PPlug = ^TPlug;
TPlug = record
GetInfo: string;
Copyright: string;
FileName: string;
CompilerName: string;
Points: array of PPoints;
end;
Далее в процедуре:
{Points}
SetLength(Points, 0);
repeat
p := pos(Delimiter, str);
if p = 0 then Continue;
s := Copy(str, 1, p - 1);
Delete(str, 1, p);
if s = '' then Continue;
p := pos('.', s);
if p = 0 then Continue;
InPoint := Str2Int(Copy(s, 1, p - 1));
Delete(s, 1, p);
OutPoint := Str2Int(s);
Len := Length(Points) + 1;
SetLength(Points, Len);
Points[Len] := New(PPoints);
Points[Len].InPoint := InPoint;
Points[Len].OutPoint := OutPoint;
showmessage(int2str(Points[Len].InPoint));
showmessage(int2str(Points[Len].OutPoint));
until str = '';
Проблема: на второй итерации цикла вылетает RunTime Error 204 в строке SetLength(Points, Len).
Что не так? Подскажите, я только учусь :)
MsGuns (2007-04-02 23:43:00) [1]А что, блондинки мешают пиву ?
Dmitriy___ (2007-04-02 23:33:00) [2]
> заменить вложенные рекорды на коллекцию
На KOL же пишу. Пытаюсь :)
MsGuns (2007-04-02 23:07:00) [3]Надо. Или заменить вложенные рекорды на коллекцию
Dmitriy___ (2007-04-02 21:43:00) [4]Понял, спасибо.
О том, как правильнее прилепить структуру к списку, вопрос снимается, всё пучком.
А вот о том, надо ли уничтожать все указатели и связанные с ними структуры, остаётся. Кто что скажет?
MBo (2007-04-02 20:22:00) [5]>Ну так чтоб в стеке не хранить,
данные динамического массива не хранятся в стеке.
>А что, лучше без него обойтись?
Конечно.
Dmitriy___ (2007-04-02 18:19:00) [6]
> С какой целью массив PPoints, а не TPoints используется?
Ну так чтоб в стеке не хранить, мало ли что... А что, лучше без него обойтись?
К слову. Хочу присобачить эту запись к pStrList. Что-то типа List.AddObject(Plug.GetInfo, Cardinal(@Plug) ). Ага, приклею, а как её потом читать? Что-то конструкция а-ля
Plug := New(PPlug);
Plug := PPlug(HeaderList.Objects[i]);
не приводит к успеху.
И ещё, напоследок. Я на пары не ходил, часто забивал, и теперь не знаю, нужно ли будет делать Dispose всем объектам списка, ведь память для них выделить-то я выделил, а освобождать кто должен?
MBo (2007-04-02 14:21:00) [7]С какой целью массив PPoints, а не TPoints используется?
Dmitriy___ (2007-04-02 14:17:00) [8]
> для тебя и последняя... (черный юмор)
Нет, я буду биться до конца! Только не говори "...своего" :D
Ой, спасибо большое! Помогло-таки. Есть пробелы в образовании, блин.
SlymRO (2007-04-02 13:38:00) [9]Dmitriy___ (02.04.07 13:26) [3]
первая-то петля
для тебя и последняя... (черный юмор)
SlymRO (2007-04-02 13:37:00) [10]У динам масивов zero based indexing, т.е. последний элемент это Length(Points)-1! а у тебя Length(Points)
Dmitriy___ (2007-04-02 13:26:00) [11]Именно, что динамический. Поэтому у меня написан SetLength. И первый раз он срабатывает, а во второй даёт ошибку.
> Points[Len - 1]
У меня Points[Len + 1], т.е. в каждой петле цикла количество элементов массива наращивается.
Не пойму, в чём тут дело. Ведь первая-то петля работает!
DrPass (2007-04-02 11:45:00) [12]
> Points[Len] := New(PPoints);
>
> Points[Len].InPoint := InPoint;
> Points[Len].OutPoint := OutPoint;
Если Points - это динамический массив, то
Points[Len - 1] := New(PPoints);
Points[Len - 1].InPoint := InPoint;
Points[Len - 1].OutPoint := OutPoint;
Если нет, то и SetLength тут не к месту
Dmitriy___ (2007-04-02 11:41:00) [13]Да, в самом начале процедуры, конечно же
Plug := New(PPlug);