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

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

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);


Наверх

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