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

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,0074 золотых знака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


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

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

  • 750 просмотров

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

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

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

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

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

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


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

27 мая 2023, в 18:36

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

27 мая 2023, в 18:18

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

27 мая 2023, в 17:14

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

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

LR16

0 / 0 / 2

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

Сообщений: 20

1

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

28.03.2015, 21:34. Показов 23776. Ответов 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



Модератор

9588 / 4908 / 3244

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

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

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



Модератор

9588 / 4908 / 3244

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

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

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

Модератор

9588 / 4908 / 3244

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

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

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



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

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: Программы и алгоритмы для начинающих
Регистрация

Выдаёт ошибку в коде для сортировки двумерного массива, помогите исправить:

const
n=4;
var
a:array [1..n,1..n] of integer;
i,j,k,count:integer;
begin
writeln(‘Исходный массив:’);
for i:=1 to n do
for j:=1 to n do begin
a[i,j]:=random(9)+1;
end;
for i:=1 to n do begin
for j:=1 to n do
write (a[i,j],’ ‘);
writeln;
end;
begin
k:=n*n;
k:=k div 2;
while (k>0) do begin
for i:=1 to n do begin
for j:=1 to n do
if a[i+(j+k-1) div n,(j+k-1) mod n+1] Последний раз редактировалось KorLinor; 24.03.2018 в 12:02 .

Источник

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

Я получаю это сообщение об ошибке случайно:

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

И это указывает на эту строку:

4 ответа

Это означает, что ваш RichTextBox1 в нем нет строк. Замените это на:

Больше информации:
Представьте массив как улицу, и каждый элемент массива — это дом. Если на улице 30 домов, и я хочу найти дом № 20, я начинаю с начала (1) и поднимаюсь до тех пор, пока не достигну 20. С массивом 0 — это то место, с которого вы начинаете, а не 1, поэтому массив с 30 элементами, содержит индексы 0-29. Теперь вернемся к аналогии с улицей. Представьте, что я иду на улицу и спрашиваю дом № 31. Этого дома не существует, потому что там всего 30 домов. Это эффективно то, что программа говорит вам. Он говорит: «В массиве недостаточно элементов, чтобы я мог найти тот, который вы просили». Итак, вы попросили элемент 0 в массиве строк, фактически говоря: «Дайте мне первую строку». Теперь, если в текстовом поле 0 строк, то первая строка не существует, и вы получите эту ошибку.

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

Это сообщение об ошибке обычно означает, что вы вызвали объект в массиве в месте, которое является нулевым, или там ничего нет. Это происходит в случаях, подобных следующему;

Поскольку в массиве с индексом 6 ничего нет, он находится за пределами границ. Если массив во время вызова пуст, он выдаст ошибку для объекта с индексом 0.

Я не могу сказать больше, чем это по количеству кода, который вы разместили. Попробуйте проверить, чтобы убедиться, что массив заполнен до вызова этой строки.

Источник

Индекс находился вне границ массива! [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском.

Закрыт 5 лет назад .

Почему выводит, что индекс вне границ.
Необходимо вывести сумму всех элементов массива.

В результате выполнения кода получаю ошибку на строке: sum += a[i];

3 ответа 3

Причина ошибки состоит в том, что вы пытаетесь использовать индексы там, где это не требуется. В результате когда вы делаете это самостоятельно, вы можете допустить неточность или опечатку.

Так как вы создали массив, содержащий n элементов, то допустимый диапазон индексов [0, n-1]

поэтому лучше было бы написать

не ссылаясь на индексы.:)

Как сказали ранее, проблема находится в строке: for (int i = 0; i .

Для решения этой проблемы я бы подошел немного с другой стороны. Во время перебора коллекции можно использовать не сторонние переменные, которые могут быть ошибочными, а длину массива. Вы в первом for использовали это.

К примеру, если n = 10 , а в массиве у Вас будет девять элементов, то Вы снова получите исключение. Вдруг переменная n где-то поменялась?

Можно использовать Length (для списков Count ). Вот так:

Также очень удобен метод foreach, in для перебора коолекции, если Вам не нужны индексы, в таком случае Вам не нужно беспокоиться о знании количества элементов массива:

Однако его не следует использовать для добавления или удаления элементов исходной коллекции во избежание непредвиденных побочных эффектов. Если нужно добавить или удалить элементы исходной коллекции, следует использовать цикл for.

Источник

Adblock
detector

Понравилась статья? Поделить с друзьями:
  • Как найти путь к папке с программой
  • Как найти коммит по хэшу
  • Как составить резюме инструктора по йоге
  • Маткад как найти максимальное значение функции
  • Уголки рта опущены вниз как исправить уколы