Индекс находится вне границ массива как исправить паскаль

PascalABC.NET как исправить ошибку?

    uses Arrays;
var 
  a: array of integer;
  N: integer;
  i1,i2:integer;
begin
  N := 50;
  a := CreateRandomIntegerArray(50);
  for var i:=1 to N do begin
    if a[i]>0 then
    i1+=1;
    if a[i]<0 then
    i2+=1;
   end;
write(i1);
write(i2);
end.

задан 6 дек 2017 в 6:19

Ярослав's user avatar

Динамические массивы нумеруются с нуля. Цикл for var i:=1 to N do begin должен выглядеть хотя бы так for var i:=0 to N-1 do begin

А вообще стоит оперировать такими функциями работы с массивами, как length, High и т.п.

ответ дан 6 дек 2017 в 6:27

Viktor Tomilov's user avatar

Viktor TomilovViktor Tomilov

8,0174 золотых знака24 серебряных знака61 бронзовый знак

program p1;

type
  massive = array of integer;

function PolMos(a: massive; n: byte): char;
var
  c, i: byte;
begin
  c := 0;
  for i := low(a) to high(a) div 2 do
    if a[i] <> a[high(a) - i + 1] then c := 1;
  if c = 0 then writeln(chr(13), 'Массив является палиндромом')
  else writeln(chr(13), 'Массив не является палиндромом');
end;

function massiv(n: byte): char;
var
  i: byte;
  a: massive;
begin
  setlength(a, n);
  randomize;
  for i := low(a) to high(a) do        
  begin
    a[i] := random(n);        
    write(a[i]:4);
  end;
  PolMos(a, n);
end;

var
  n: byte;

begin
  write('Введите размер массива:   '); read(n);
  write('Массив: '); massiv(n);
  
end.

61aa9f2b2b50e828286684.jpeg


  • Вопрос задан

    более года назад

  • 753 просмотра

Индекс находился вне границ массива

Русским по белому же написано.

Представим, что у нас массив a[] размером 2
Тогда
low(a)=0
high(a)=1
На первой же итерации:
i=0
high(a) — i + 1 = 2
2 находится за пределами границ массива.

А ещё из твоей функции никакое значение не возвращается.

И в PascalABC можно точки останова расставлять и смотреть, какие значения переменных у тебя там получились перед ошибкой.

Пригласить эксперта


  • Показать ещё
    Загружается…

29 мая 2023, в 13:30

30000 руб./за проект

29 мая 2023, в 13:26

5000 руб./за проект

29 мая 2023, в 13:25

130000 руб./за проект

Минуточку внимания

Попытка вывести массив не поэлементно, а целиком

const Sz = 100; 

var 
  a: array [1..Sz] of integer;
  i: integer;

begin
  read(a); // неверно: массив необходимо вводить поэлементно
end.

Использование записи a[i] вне цикла

const Sz = 10; 

var 
  a: array [1..Sz] of integer;
  i: integer;

begin
  var N := Sz;
  for i:=1 to N do 
    a[i] := Random(100);
  a[i] := 666; // Ошибка: переменной i нельзя пользоваться вне цикла for  
end.

Выход за границы диапазона изменения индекса

const Sz = 10; 

var a: array [1..Sz] of integer;

begin
  var N := Sz;
  for var i:=1 to N+1 do 
    a[i] := Random(100); // При i=N+1 происходит ошибка: индекс вне границ массива
end.

Затирание элементов при сдвиге

const Sz = 100; 

var a: array [1..Sz] of integer;

begin
  var N := 10;
  for var i:=1 to N do 
    a[i] := Random(100); 
  for var i:=1 to N do 
    write(a[i],' ');
  writeln;
  for var i:=1 to N-1 do // ошибка: алгоритм сдвига вправо надо начинать с конца
    a[i+1] := a[i];
  for var i:=1 to N do 
    write(a[i],' ');
end.

Ссылки

  • Программы для начинающих
  • Сайт PascalABC.NET: Программы и алгоритмы для начинающих

LR16

0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

1

Ошибка времени выполнения: Индекс находится вне границ массива

28.03.2015, 21:34. Показов 23799. Ответов 16

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте!
Столкнулся с ошибкой:
[Ошибка времени выполнения: Индекс находится вне границ массива]

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var f: textfile; n: longint;
    text: string; s: char;
begin
assignfile(f,'file.txt');
reset(f);
while (not eof(f)) do
  begin
    readln(f,s);
    inc(n);
    text[n] := s // ЭТУ строку подсвечивает
  end;
 n:=0;  
 while (not eof(f)) do
 begin
    inc(n);
    write(ord(text[n])+3);
  end;
  close(f);
end.



0



1646 / 1075 / 1081

Регистрация: 03.07.2013

Сообщений: 4,507

28.03.2015, 22:45

2

Проинициализируйте переменную «n» перед первым использованием.



1



0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

28.03.2015, 22:50

 [ТС]

3

Это как проинициализировать ??
писал перед циклом n:=0 — не помогло



0



APALoff

1646 / 1075 / 1081

Регистрация: 03.07.2013

Сообщений: 4,507

28.03.2015, 23:00

4

Цитата
Сообщение от LR16
Посмотреть сообщение

писал перед циклом n:=0 — не помогло

И не поможет, инициализировать надо тоже с умом.

Можно поставить единицу, но у Вас скорее всего всплывет потом еще одна ошибка в строке 16.
Но дело даже не в ней. Вы изначально оперируете с символами строки не заданной изначально длины.

Добавлено через 2 минуты
Т.е., Pabc.NET за Вас инициализирует переменную «text» нулевым значением, т.е. text:=»;
А Вы пытаетесь изменить символы в позициях превышающих длину строки.
Надо не изменять, а суммировать:

text[n] := s // ЭТУ строку подсвечивает

а надо

Pascal
1
text:=text+s;

Добавлено через 1 минуту
Только учтите, что после накопления строки, Выше значение n будет превышать истинное значение на единицу.



1



Модератор

9592 / 4911 / 3245

Регистрация: 17.08.2012

Сообщений: 15,346

28.03.2015, 23:06

5

Лучший ответ Сообщение было отмечено LR16 как решение

Решение

Изначальная длина массива (а строка — это массив) text при инициализации — 0 символов. Вы пытаетесь присвоить прочитанный символ сразу за границы строки. Кроме того, f объявлен как textfile, то есть, является файлом с последовательным доступом, Вы же пытаетесь с ним работать не пойми как, с одной стороны, как с файлом с последовательным доступом (readln), с другой стороны — пытаетесь записывать что-то после конца файла (write), что возможно только для файлов с произвольным доступом, но с каким-то нелепым условием записи до конца файла (второе while). Естественно, после конца файла с последовательным доступом ничего записать Вам не удастся, во-первых, потому что он открыт для чтения, и, во-вторых, вообще не удастся, потому что открыть его для добавления информации (append) можно не во всех диалектах паскаля, в-третьих, ничего не запишется, так как конец файла уже достигнут в первом цикле while. В общем, не программа, а сплошная ошибка.



2



0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

28.03.2015, 23:08

 [ТС]

6

OK, счас попробую



0



1646 / 1075 / 1081

Регистрация: 03.07.2013

Сообщений: 4,507

28.03.2015, 23:10

7

LR16, выше Cyborg Drone дополнил то, что я проглядел (textfile).

Добавлено через 1 минуту
Вообще да, какая то каша получается, а не код.



1



0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

28.03.2015, 23:13

 [ТС]

8

Цитата
Сообщение от Cyborg Drone
Посмотреть сообщение

с другой стороны — пытаетесь записывать что-то после конца файла (write)

Может я написал не правильно, но имелся ввиду вывод на экран..
А, точно, файл закрыт.. извините, во втором цикле должен был написать длину строки..
За остальное спасибо!



0



Модератор

9592 / 4911 / 3245

Регистрация: 17.08.2012

Сообщений: 15,346

28.03.2015, 23:14

9

А что вообще Ваша программа должна делать? Так, навскидку, мне кажется, она с Цезарем воюет, но воюет неправильно.



1



APALoff

1646 / 1075 / 1081

Регистрация: 03.07.2013

Сообщений: 4,507

28.03.2015, 23:15

10

Цитата
Сообщение от LR16
Посмотреть сообщение

Может я написал не правильно, но имелся ввиду вывод на экран..

Если это вывод на экран, то не правильно — у Вас цикл привязан к файлу.
Напишите просто

Pascal
1
Writeln(text);

Добавлено через 40 секунд
А нет, не пойдёт. Сначала надо сделать кодирование.



1



0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

28.03.2015, 23:16

 [ТС]

11

Спасибо..



0



APALoff

1646 / 1075 / 1081

Регистрация: 03.07.2013

Сообщений: 4,507

28.03.2015, 23:16

12

Pascal
1
For i:=1 to n-1 do text[i]:=Chr(ord(text[i])+3);



1



LR16

0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

28.03.2015, 23:25

 [ТС]

13

Цитата
Сообщение от APALoff
Посмотреть сообщение

А нет, не пойдёт. Сначала надо сделать кодирование.

Да я понял, усложнил себе задачу просто..

Добавлено через 7 минут

Цитата
Сообщение от APALoff
Посмотреть сообщение

каша получается, а не код.

Да, че-то тупанул с самого начала.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var f: textfile; n, i: longint;
    text: string; s: char;
begin
  AssignFile(f,'file.txt');
  reset(f);
  while (not eof(f)) do
    begin
      readln(f,s);
      inc(n);
      text:=text+s
    end;
  close(f);
  
  for i:=1 to n-1 do text[i]:=Chr(ord(text[i])+3);
  write('RES: ',text);
end.

Опять где-то накосячил, только один символ выводит. P.S. там забыл вернуть номер символа опять в символ CHR, спасибо..



0



1646 / 1075 / 1081

Регистрация: 03.07.2013

Сообщений: 4,507

28.03.2015, 23:30

14

Лучший ответ Сообщение было отмечено LR16 как решение

Решение

Цитата
Сообщение от LR16
Посмотреть сообщение

for i:=1 to n-1

Тут уже можно изменить на просто n, без «-1»

Добавлено через 1 минуту
А еще Вам писали:

Цитата
Сообщение от Cyborg Drone
Посмотреть сообщение

Вы же пытаетесь с ним работать не пойми как, с одной стороны, как с файлом с последовательным доступом (readln),

Думаю надо READ, без LN

Добавлено через 1 минуту
Хотя я в Pabc.NET не сильно еще знаком с обработкой файлов…



1



0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

28.03.2015, 23:32

 [ТС]

15

Цитата
Сообщение от APALoff
Посмотреть сообщение

Думаю надо READ, без LN

Ого, сработало, большое Спасибо !)
————
Да, это на Цезаре тренировался, в программе кодирования по XOR ошибка, не хотел захламлять лишним кодом.



0



Cyborg Drone

Модератор

9592 / 4911 / 3245

Регистрация: 17.08.2012

Сообщений: 15,346

28.03.2015, 23:41

16

Лучший ответ Сообщение было отмечено LR16 как решение

Решение

Ну не знаю… Во-первых, как правило, шифр Цезаря строится на ограниченном и закольцованном множестве символов, у Вас же — на всех символах. Как Вы думаете, каков будет результат преобразования для трёх последних символов кодовой таблицы? Правильно, весьма ошибочный. Скорее всего, программа вылетит с оговоркой, что нельзя привести какой-нибудь word или integer к типу char. Тем не менее, если из Вашей программы повытряхнуть всё лишнее, то будет так:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var f: textfile;
    i: integer;
    text: string;
begin
  AssignFile(f, 'file.txt');
  reset(f);
  while not eof(f) do
    begin
      readln(f, text);
      for i := 1 to length(text) do text[i] := chr(ord(text[i]) + 3);
      writeln(text)
    end;
  close(f);
  readln
end.



1



LR16

0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

29.03.2015, 00:42

 [ТС]

17

Цитата
Сообщение от Cyborg Drone
Посмотреть сообщение

Ну не знаю

БОЛЬШОЕ СПАСИБО ВАМ )
Я ошибочно выразился, делал другую программу, там произошла затычка над которой ломал голову 2 часа.
Решил обратится к Вам, но чтобы не захламлять форум, сделал другую прогу(покороче) с той-же ошибкой.
———
Какраз теперь доделал основную.
2 процедуры, функция + основной код. Вот основа программы, функция:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function cry_xor(text,key:string):string;
var ln,lnk,i:longint; longkey, res: string;
    tx: char;
begin
ln := Length(text);
lnk := Length(key);
  
  For i := 0 to ln div lnk do
    longkey := longkey + key;
  
  For i := 1 to ln-2 do
    begin
      // XOR algorithm
      tx := chr((ord(text[i]) xor ord(longkey[i])));
      res := res + tx
    end;
    cryptxor := res
end;

===============
Ещё раз Спасибо Вам за помощь, когда буду программировать получше(да и теперь стараюсь), буду также помогать начинающим програмам на форуме. Пока-что сам фигею с задач в темах.



0



БЛОГ НА HUSL

  • Деловая переписка на английском языке: фразы и советы
  • Принцип цикады и почему он важен для веб-дизайнеров
  • В популярных антивирусах для ПК обнаружили лазейки в защите

Ошибка времени выполнения: Индекс находился вне границ массива

Автор вопроса: Ярослав

PascalABC.NET как исправить ошибку?

    uses Arrays;
var 
  a: array of integer;
  N: integer;
  i1,i2:integer;
begin
  N := 50;
  a := CreateRandomIntegerArray(50);
  for var i:=1 to N do begin
    if a[i]>0 then
    i1+=1;
    if a[i]<0 then
    i2+=1;
   end;
write(i1);
write(i2);
end.

Источник

Ответы (1 шт):

Автор решения: Viktor Tomilov

Динамические массивы нумеруются с нуля. Цикл for var i:=1 to N do begin должен выглядеть хотя бы так for var i:=0 to N-1 do begin

А вообще стоит оперировать такими функциями работы с массивами, как length, High и т.п.

→ Ссылка

licensed under cc by-sa 3.0 with attribution.

Понравилась статья? Поделить с друзьями:
  • Нашли собаку с клеймом как найти хозяина
  • Что делать если корни светлее чем концы как исправить
  • Как составить иск в суд по договору подрядчика
  • Стал узкий экран на компьютере как исправить
  • Как найти беспроводные наушники по bluetooth