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

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

Диманический массив как поле класса [D6, WinXP]


ranetka ©   (2004-10-17 02:51:00) 

Хотелось бы использовать динамический массив как поле класса. Т.е. я не знаю заранее, сколько элементов мне понадобится занести в этот массив( что-то вроде класса-контейнера в с++ ). Вопрос - как бы это было удобнее реализовать на Object Pascal?


ranetka   (2004-10-20 22:42:00) [1]

спасибо, все работает. В след раз буду внимательнее


default   (2004-10-17 20:10:00) [2]

не
function VM.AddOperand (op:string):boolean;
var tmp:array of Variable;
 i,j:integer;
begin
 if VarCount>0 then begin // изменяем размер массива не первый раз
    SetLength(tmp,VarCount);
    for i:=0 to VarCount do
       tmp[i]:=Variables[i];
    inc(VarCount);
    SetLength(Variables,VarCount);
    for i:=0 to VarCount-1 do
       Variables[i]:=tmp[i];
    Variables[i+1].name:=op;
  end
 else begin
 inc(VarCount);
 SetLength(Variables,VarCount);
 Variables[0].name:=op;
 end;
а
function VM.AddOperand (op:string):boolean;
begin
 Inc(VarCount);
 SetLength(Variables, VarCount);
 Variables[High(Variables)].Name := op;
end;

P.S. при увеличении длины массива неопределённые значения находятся только в добавленных элементах остальные как были


olookin   (2004-10-17 19:34:00) [3]

[6] ranetka ©   (17.10.04 19:32)

А ведь он (begin..end) прав.  Вот тут

SetLength(tmp,VarCount);
    for i:=0 to VarCount(а надо бы VarCount-1) do
       tmp[i]:=Variables[i];


ranetka   (2004-10-17 19:32:00) [4]


> begin...end ©   (17.10.04 17:47) [5]

Я, наверно, совсем глупая. Где здесь выход за границы?


begin...end   (2004-10-17 17:47:00) [5]


> [4] ranetka ©   (17.10.04 17:40)

Выход за границы массива... Даже не смешно...


ranetka   (2004-10-17 17:40:00) [6]

>Добрый дядька   (17.10.04 17:28) [3]
Кусочек кода:
 VM = class
  private
   Variables : array of variable;// variable = record
   VarCount : integer;
  public
   function AddOperand (op:string):boolean;

 end;

function VM.AddOperand (op:string):boolean;
var tmp:array of Variable;
  i,j:integer;
begin
  if VarCount>0 then begin // изменяем размер массива не первый раз
     SetLength(tmp,VarCount);
     for i:=0 to VarCount do
        tmp[i]:=Variables[i];
     inc(VarCount);
     SetLength(Variables,VarCount);
     for i:=0 to VarCount-1 do
        Variables[i]:=tmp[i];
     Variables[i+1].name:=op;
   end
  else begin
  inc(VarCount);
  SetLength(Variables,VarCount);
  Variables[0].name:=op;
  end;

end;


Добрый дядька   (2004-10-17 17:28:00) [7]

>ranetka ©   (17.10.04 17:27) [2]
Ну что тут можно сказать. Ошибка в программе.


ranetka   (2004-10-17 17:27:00) [8]

Дело в том, что когда второй раз изменяю размер этого массива с помощью SetLength(..), то появляется ошибка обращения к памяти.


Добрый дядька   (2004-10-17 02:53:00) [9]

А в чем проблема?

TMyClass=class
 FArray: array of Integer;
end


Наверх

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