Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
Внизrecord в record е Найти похожие ветки
← →
Knock (2007-04-02 11:39) [0]Привет. Пишу на 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).
Что не так? Подскажите, я только учусь :)
← →
Dmitriy___ (2007-04-02 11:41) [1]Да, в самом начале процедуры, конечно же
Plug := New(PPlug);
← →
DrPass © (2007-04-02 11:45) [2]
> 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 13:26) [3]Именно, что динамический. Поэтому у меня написан SetLength. И первый раз он срабатывает, а во второй даёт ошибку.
> Points[Len - 1]
У меня Points[Len + 1], т.е. в каждой петле цикла количество элементов массива наращивается.
Не пойму, в чём тут дело. Ведь первая-то петля работает!
← →
SlymRO © (2007-04-02 13:37) [4]У динам масивов zero based indexing, т.е. последний элемент это Length(Points)-1! а у тебя Length(Points)
← →
SlymRO © (2007-04-02 13:38) [5]Dmitriy___ (02.04.07 13:26) [3]
первая-то петля
для тебя и последняя... (черный юмор)
← →
Dmitriy___ (2007-04-02 14:17) [6]
> для тебя и последняя... (черный юмор)
Нет, я буду биться до конца! Только не говори "...своего" :D
Ой, спасибо большое! Помогло-таки. Есть пробелы в образовании, блин.
← →
MBo © (2007-04-02 14:21) [7]С какой целью массив PPoints, а не TPoints используется?
← →
Dmitriy___ (2007-04-02 18:19) [8]
> С какой целью массив PPoints, а не TPoints используется?
Ну так чтоб в стеке не хранить, мало ли что... А что, лучше без него обойтись?
К слову. Хочу присобачить эту запись к pStrList. Что-то типа List.AddObject(Plug.GetInfo, Cardinal(@Plug) ). Ага, приклею, а как её потом читать? Что-то конструкция а-ля
Plug := New(PPlug);
Plug := PPlug(HeaderList.Objects[i]);
не приводит к успеху.
И ещё, напоследок. Я на пары не ходил, часто забивал, и теперь не знаю, нужно ли будет делать Dispose всем объектам списка, ведь память для них выделить-то я выделил, а освобождать кто должен?
← →
MBo © (2007-04-02 20:22) [9]>Ну так чтоб в стеке не хранить,
данные динамического массива не хранятся в стеке.
>А что, лучше без него обойтись?
Конечно.
← →
Dmitriy___ (2007-04-02 21:43) [10]Понял, спасибо.
О том, как правильнее прилепить структуру к списку, вопрос снимается, всё пучком.
А вот о том, надо ли уничтожать все указатели и связанные с ними структуры, остаётся. Кто что скажет?
← →
MsGuns © (2007-04-02 23:07) [11]Надо. Или заменить вложенные рекорды на коллекцию
← →
Dmitriy___ (2007-04-02 23:33) [12]
> заменить вложенные рекорды на коллекцию
На KOL же пишу. Пытаюсь :)
← →
MsGuns © (2007-04-02 23:43) [13]А что, блондинки мешают пиву ?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c