Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.07;
Скачать: CL | DM;

Вниз

Диманический массив как поле класса   Найти похожие ветки 

 
ranetka   (2004-10-17 02:51) [0]

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


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

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

TMyClass=class
 FArray: array of Integer;
end


 
ranetka ©   (2004-10-17 17:27) [2]

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


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

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


 
ranetka ©   (2004-10-17 17:40) [4]

>Добрый дядька   (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;


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


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

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


 
ranetka ©   (2004-10-17 19:32) [6]


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

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


 
olookin ©   (2004-10-17 19:34) [7]

[6] ranetka ©   (17.10.04 19:32)

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

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


 
default ©   (2004-10-17 20:10) [8]

не
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. при увеличении длины массива неопределённые значения находятся только в добавленных элементах остальные как были


 
ranetka ©   (2004-10-20 22:42) [9]

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



Страницы: 1 вся ветка

Текущий архив: 2004.11.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.037 c
3-1097211160
SergeyMel
2004-10-08 08:52
2004.11.07
Пол (муж. или жен.), Ищу алгоритм или красивое готовое решен.


4-1096475029
gor_beliy
2004-09-29 20:23
2004.11.07
security


1-1098828526
BURN
2004-10-27 02:08
2004.11.07
Память


1-1098269315
dreamse
2004-10-20 14:48
2004.11.07
Проблемы с выделением колонок listview разным цветом


1-1098700751
Strimer
2004-10-25 14:39
2004.11.07
Использование Project2 в Project1