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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2012, 01:24   #1
Dianasobaka
Новичок
Джуниор
 
Регистрация: 30.11.2012
Сообщений: 2
По умолчанию Выход за границы диапазона типа byte в Pascal

ABC Pascal пишет "выход за границы диапазона типа byte", FPC выдает ошибку 201 именно когда в меню выбираешь procedure pr1(т.е. все остальные процедуры работают).не знаю нужно ли здесь код вызывающей программы выкладывать
Код:
unit modul2;
interface
  type mas=array[1..25] of integer;
  procedure pr1 (var n: integer; var a: mas; flag: boolean);
  procedure pr2 (var n: integer; var a: mas; flag: boolean);
  procedure vvodmas (var n: integer; var a: mas; var flag:boolean);
  procedure vivmas (var n: integer; var a: mas; flag:boolean);

implementation
procedure vvodmas(var n: integer; var a: mas; var flag:boolean);
var i:integer;
  begin
    writeln('введите количество элементов массива <=25');
    readln(n);
    for i:=1 to N do
      begin
         writeln('введите элемент массива', i );
         readln(A[i]);
      end;
    flag:=true;
  end;

procedure vivmas(var n: integer; var a: mas; flag:boolean);
var i:integer;
  begin
    if (flag=true) then
      begin
        writeln( 'ранее введенный массив' );
        for i:=1 to N do
        writeln('A[',i,'] = ', A[i]);
      end
    else writeln ('массив не был введен');
  end;

procedure pr1(var n: integer; var i:integer; var a: mas; flag:boolean);
var
   imin,imax,amin,amax:integer;
   i:byte;
   min, max: real;

begin
 vivmas(n,a,flag);
 if flag then
  begin
   amin := 1;
   amax := 1;
   max := a[1];
   min := A[1];
   for i := 2 to n do
       if min > A[i] then
       begin
       min := A[i];
       amin := i;
    end;
   for i := 2 to n do
    if max < A[i] then
    begin
    max := A[i];
    amax := i;
    end;
    if imin < imax then
     for i:=imin+1 to imax-1 do
       writeln('A[',I,']=', A[i])
       else
        for i:=imax+1 to imin-1 do
         writeln('A[',I,']=', A[i]);
         readln;
    end;
    end;
есть еще одна процедура, поэтому end; в конце,но здесь она никак не влияет
Dianasobaka вне форума Ответить с цитированием
Старый 30.11.2012, 01:54   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Так правильно пишет. Ты ж нигде не инициализируешь imin и imax, потому в них при входе в процедуру будет какая-то неведомая фигня из стека. А потом ты присваиваешь эту фигню переменной i, которая имеет тип байт; она туда не помещается, вот и получается печаль.
Son Of Pain вне форума Ответить с цитированием
Старый 30.11.2012, 09:01   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
procedure pr1(var n: integer; var i: integer; var a: mas; flag: boolean);
var
  imin, imax, amin, amax: integer;
  i: byte;
Ничего странного не видете?! Уберите напрочь то, что красным выделено!

ну и Son Of Pain прав насчёт иницилизации переменных!

я бы вообще такой код предложил:
Код:
procedure pr1(n: integer; var a:mas; flag: boolean);
var
  imin, imax : integer;
  i: integer;
begin
  vivmas(n, a, flag);
  if flag then
  begin
    imin := 1;
    imax := 1;
    for i := 2 to n do begin
      if a[imin] > a[i] then
         imin := i;
      if a[imax] < a[i] then
        imax := i;
    end;
    if imin < imax then
      for i := imin + 1 to imax - 1 do
        writeln('A[', I, ']=', a[i])
    else
      for i := imax + 1 to imin - 1 do
        writeln('A[', I, ']=', a[i]);
    readln;
  end;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.11.2012, 12:07   #4
Dianasobaka
Новичок
Джуниор
 
Регистрация: 30.11.2012
Сообщений: 2
По умолчанию

Serge_Bliznykov, с этим кодом он пишет что не определена procedure pr1((
Dianasobaka вне форума Ответить с цитированием
Старый 30.11.2012, 13:50   #5
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Видимо, объявление функции стоит менять в двух местах - и в секции interface, и в implementation )
Son Of Pain вне форума Ответить с цитированием
Старый 30.11.2012, 14:06   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Son Of Pain
объявление функции стоит менять в двух местах - и в секции interface, и в implementation )
Son Of Pain, с Вами не интересно, Вы знаете правильные ответы!


Dianasobaka,
действительно, раз изменили реализацию, значит нужно и описание функции изменить (выделил изменения, которые надо сделать):
Код:
unit modul2;
interface
  type mas=array[1..25] of integer;
  procedure pr1(n: integer; var a:mas; flag: boolean);
  procedure pr2 (var n: integer; var a: mas; flag: boolean);
  procedure vvodmas (var n: integer; var a: mas; var flag:boolean);
  procedure vivmas (var n: integer; var a: mas; flag:boolean);
А ещё, предвосхищая следующий вопрос, если у Вас уже где-то есть вызов процедуры pr1, то его тоже нужно изменить (выкинуть из вызова второй параметр, где i)
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal ABC. Выход за пределы диапазона изменения индекса 1..100. Женька Good Помощь студентам 18 30.10.2014 07:24
Выход за границы массива weech Помощь студентам 8 30.04.2012 23:52
Проблема с выходом за границы диапазона Sanyok77 Общие вопросы Delphi 3 27.04.2012 14:23
Паскаль. Выдёт ошибку "выход за границы диапазона" Winterfox Помощь студентам 1 04.12.2011 14:13
Ошибка "выход за границы диапазона" Luuun Помощь студентам 6 28.01.2010 22:39