Динамический массив

Здравствуйте всем, подскажите что тут не так?! сделал все по справочнику, нужен динамический массив, сейчас ошибку выдает на SetLength(TArComp, 6);
program work_3;

{$APPTYPE CONSOLE}

uses
 SysUtils,
 UnitLib in 'UnitLib.pas';

type
 TComp = record
 sCompName: string;
 rPrice : string;
 end;

 
TArComp = array of TComp;

function GetMinLenName ( ar: TArComp; n: integer) : integer;
var
 i, iMinLen: integer;

begin
 { TODO -oUser -cConsole Main : Insert code here }
 iMinLen := 0;
 if (n>0) then iMinLen := Length (ar[1].sCompName);
 for i := 1 to n do
 if (Length(ar[i].sCompName)< iMinLen) then
 iMinLen := Length(ar[i].sCompName);
 Result := iMinLen;
 end;


function GetMaxLenName (ar: TArComp; n: integer) : integer;
var
 i, iMaxLen: integer;

begin
 { TODO -oUser -cConsole Main : Insert code here }
 iMaxLen := 0;
 if (n>0) then iMaxLen := Length (ar[1].sCompName);
 for i := 1 to n do
 if (Length(ar[i].sCompName)> iMaxLen) then
 iMaxLen := Length(ar[i].sCompName) ;
 Result := iMaxLen;
 end;


var

 arComp : TArComp;
 iNumComp :integer;
 ch : char;
 bDone : boolean;
begin
 SetLength(TArComp, 6);
 iNumComp := 0;
 bDone := false;
while (not bDone) do begin
 Writeln ('Number of computers:', iNumComp);
 Writeln ('1- Add computer');
 Writeln ('2- Length of min name');
 Writeln ('3- Length of max name');
 Writeln ('4- Exit');
 Readln (ch);
 case (ch) of
 '1' : begin
 iNumComp := iNumComp+1;
 Writeln('Enter computer name:');
 Readln(arComp [iNumComp].sCompName);
 Writeln ('Enter computer price:');
 Readln(arComp[iNumComp].rPrice) ;
 end;
 '2' : begin
 Writeln ('Minmal length =', GetMinLenName(arComp, iNumComp));
 Readln;
 end;
 '3' : begin
 Writeln ('Maxmal length =', GetMaxLenName(arComp, iNumComp));
 Readln;
 end;
 '4' : bDone := true;
 end;
 end;

end.
7 ответов

var

<b>arComp : <font color="Blue">TArComp</font>;</b>
 iNumComp :integer;
 ch : char;
 bDone : boolean;
begin
 SetLength(<font color="Red">TArComp</font>, 6);
Вы объявили переменную arComp типа TArComp, а в SetLength пытаетесь присвоить размер типу TArComp, а не переменной ArComp.


я выше сам массив объявил
TArComp = array of TComp;


я выше сам массив объявил
TArComp = array of TComp;
а как правильно сделать?


ну Вы же не ТИПУ хотите размер задать, а ПЕРЕМЕННОЙ!!вот так надо:
SetLength(arComp, 6);
p.s. у Вас так в типе запись используется string - это то же ссылочный тип и нужно с ним быть очень аккуратным!


а как правильно сделать?
program work_3;

{$APPTYPE CONSOLE}

uses
 SysUtils,
 UnitLib in 'UnitLib.pas';

type
 TComp = record
 sCompName: string;
 rPrice : string;
end;

 
TArComp = array of TComp;

function GetMinLenName ( ar: TArComp; n: integer) : integer;
var
 i, iMinLen: integer;

begin
 { TODO -oUser -cConsole Main : Insert code here }
 iMinLen := 0;
 if (n>0) then iMinLen := Length (ar[1].sCompName);
 for i := 1 to n do
 if (Length(ar[i].sCompName)< iMinLen) then
 iMinLen := Length(ar[i].sCompName);
 Result := iMinLen;
 end;


function GetMaxLenName (ar: TArComp; n: integer) : integer;
var
 i, iMaxLen: integer;

begin
 { TODO -oUser -cConsole Main : Insert code here }
 iMaxLen := 0;
 if (n>0) then iMaxLen := Length (ar[1].sCompName);
 for i := 1 to n do
 if (Length(ar[i].sCompName)> iMaxLen) then
 iMaxLen := Length(ar[i].sCompName) ;
 Result := iMaxLen;
 end;


var
 arComp : TArComp;
 iNumComp :integer;
 ch : char;
 bDone : boolean;
begin
 SetLength(arComp, 2);
 iNumComp := 0;
 bDone := false;
while (not bDone) do begin
 Writeln ('Number of computers:', iNumComp);
 Writeln ('1- Add computer');
 Writeln ('2- Length of min name');
 Writeln ('3- Length of max name');
 Writeln ('4- Exit');
 Readln (ch);
 case (ch) of
 '1' : begin
 iNumComp := iNumComp+1;
 Writeln('Enter computer name:');
 Readln(arComp [iNumComp].sCompName);
 Writeln ('Enter computer price:');
 Readln(arComp[iNumComp].rPrice) ;
 end;
 '2' : begin
 Writeln ('Minmal length =', GetMinLenName(arComp, iNumComp));
 Readln;
 end;
 '3' : begin
 Writeln ('Maxmal length =', GetMaxLenName(arComp, iNumComp));
 Readln;
 end;
 '4' : bDone := true;
 end;
 end;

end.
сделал так но теперь можно добавить только 1 значение, при вводе второго программа закрываеться


Чтоб не закрывалась программа, что нужно добавить?!


при вводе второго программа закрываеться
Динамические массивы нумеруются с 0, а не с 1.