Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2013, 16:45   #1
frixer
Пользователь
 
Регистрация: 19.04.2010
Сообщений: 16
По умолчанию динамический массив

Здравствуйте всем, подскажите что тут не так?! сделал все по справочнику, нужен динамический массив, сейчас ошибку выдает на 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.
frixer вне форума Ответить с цитированием
Старый 26.09.2013, 16:49   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Код:
var

arComp : TArComp;
  iNumComp :integer;
  ch : char;
  bDone : boolean;
begin
   SetLength(TArComp, 6);
Вы объявили переменную arComp типа TArComp, а в SetLength пытаетесь присвоить размер типу TArComp, а не переменной ArComp.
Человек_Борща вне форума Ответить с цитированием
Старый 26.09.2013, 16:51   #3
frixer
Пользователь
 
Регистрация: 19.04.2010
Сообщений: 16
По умолчанию

я выше сам массив объявил

Код:
TArComp = array of TComp;
frixer вне форума Ответить с цитированием
Старый 26.09.2013, 16:53   #4
frixer
Пользователь
 
Регистрация: 19.04.2010
Сообщений: 16
По умолчанию

Цитата:
Сообщение от frixer Посмотреть сообщение
я выше сам массив объявил

Код:
TArComp = array of TComp;
а как правильно сделать?
frixer вне форума Ответить с цитированием
Старый 26.09.2013, 16:57   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну Вы же не ТИПУ хотите размер задать, а ПЕРЕМЕННОЙ!!

вот так надо:
Код:
 SetLength(arComp, 6);

p.s. у Вас так в типе запись используется string - это то же ссылочный тип и нужно с ним быть очень аккуратным!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.09.2013, 16:59   #6
frixer
Пользователь
 
Регистрация: 19.04.2010
Сообщений: 16
По умолчанию

Цитата:
Сообщение от frixer Посмотреть сообщение
а как правильно сделать?
Код:
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 значение, при вводе второго программа закрываеться
frixer вне форума Ответить с цитированием
Старый 26.09.2013, 17:28   #7
frixer
Пользователь
 
Регистрация: 19.04.2010
Сообщений: 16
По умолчанию

Чтоб не закрывалась программа, что нужно добавить?!
frixer вне форума Ответить с цитированием
Старый 26.09.2013, 20:58   #8
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,881
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамический массив. геннадий522 Общие вопросы C/C++ 3 12.03.2012 17:10
Динамический массив, массив указателей alexalisa Паскаль, Turbo Pascal, PascalABC.NET 4 22.04.2011 21:33
Динамический массив - или всё таки не динамический? vedro-compota Общие вопросы C/C++ 30 10.12.2010 23:22
Динамический массив vvv-091 Фриланс 4 01.06.2010 00:31
Динамический массив Golovastik Общие вопросы C/C++ 10 27.05.2010 20:36