Паскаль ошибка индекс находится вне границ массива

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,3054 золотых знака25 серебряных знаков63 бронзовых знака

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

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


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

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

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

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

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

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

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

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


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

22 сент. 2023, в 23:30

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

22 сент. 2023, в 23:29

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

22 сент. 2023, в 23:14

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

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

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

7,9974 золотых знака23 серебряных знака60 бронзовых знаков

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


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

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

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

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

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

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

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

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

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


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

Сбер

Нижний Новгород

от 200 000 ₽

11 апр. 2023, в 12:50

1800 руб./в час

11 апр. 2023, в 12:38

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

11 апр. 2023, в 12:21

1200 руб./в час

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

LR16

0 / 0 / 2

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

Сообщений: 20

1

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

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

Модератор

9538 / 4864 / 3231

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

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

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

Модератор

9538 / 4864 / 3231

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

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

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

Модератор

9538 / 4864 / 3231

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

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

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

БЛОГ НА 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.

В мире существует три основных типа принтеров: матричные; струйные; лазерные.

Матричные принтеры используют комбинации маленьких штырьков, которые бьют по красящей ленте, благодаря чему на бумаге остаётся отпечаток символа. Каждый символ, печатаемый на принтере, формируется из набора 9, 18 или 24 игл, сформированных в виде вертикальной колонки

Струйные принтеры генерируют символы в виде последовательности чернильных точек. Печатающая головка принтера имеет крошечные сопла, через которые на страницу выбрызгиваются быстросохнущие чернила. Эти принтеры требовательны к качеству бумаги. Цветные струйные принтеры создают цвета, комбинируя чернила четырех основных цветов — ярко-голубого, пурпурного, желтого и черного.

Струйные принтеры, в основном, используются для незначительных объемов бытовой цветной печати – лучше всего они подходят для печати цветных фотографий или иллюстрированных документов. Однако при больших объемах печати со значительным потреблением краски они становятся невыгодными в использовании.

На специальной бумаге струйные принтеры позволяют печатать изображения очень высокого качества. Такие принтеры для профессиональной работы с цветными изображениями называют фото-принтерами. Некоторые из них могут печатать изображения прямо с цифровой камеры, а некоторые модели имеют цветной жидкокристаллический экран, позволяющий просмотреть изображение перед печатью.

Лазерные принтеры работают примерно так же, как ксероксы. Компьютер формирует в своей памяти «образ» страницы текста и передает его принтеру. Информация о странице проецируется с помощью лазерного луча на вращающийся барабан со светочувствительным покрытием, меняющим электрические свойства в зависимости от освещённости. После засветки на барабан, находящийся под электрическим напряжением, наносится красящий порошок — тонер, частицы которого налипают на засвеченные участки поверхности барабана. Принтер с помощью специального горячего валика протягивает бумагу под барабаном; тонер переносится на бумагу и «вплавляется» в неё, оставляя стойкое высококачественное изображение. Лазерные принтеры начального ценового уровня позволяют получать только черно-белые копии, но – высокого качества и очень быстро

Цветные лазерные принтеры представляют собой несколько обычных лазерных принтеров в одном корпусе. Изображение в них формируется последовательно для каждого из цветов CMYK-модели за четыре прохождения. Вот почему цветные лазерные принтеры такие большие – ведь каждый из них имеет 4 барабана с 4 разными тонерами. Соответственно у лазерных принтеров высокая стоимость цветной печати и не очень высокая скорость.

В последнее время лазерные принтеры пользуются все большей популярностью, к чему привели вполне весомые причины:

1. Резко снизились цены на лазерные принтеры.

2. Более дешевой и более качественной стала цветная лазерная печать – при значительных количествах отпечатков лазерные принтеры быстро оправдывают потраченные на их покупку средства.

3. Чрезвычайно высокое качество отпечатков, особенно текстов и деловой графики, распечатанных с помощью лазерных принтеров.

4. Лазерные принтеры, по сравнению со своими коллегами других типов, являются простыми в обслуживании, более надежными и экономными. Например, одна заправка картриджа лазерного принтера позволяет распечатать от 2,5 до 10 тысяч копий, а среднемесячный ресурс использования его барабана, в зависимости от модели, составляет от 10 до 60 тысяч отпечатков.

5. Лазерные принтеры печатают быстро и тихо, что очень важно для работы в офисе.

иногда выводит ошибку: Ошибка времени выполнения, индекс находится вне границ массива. PascalABC.NET
вот само задание: Дан массив А(n). Поменять местами максимальный и минимальный элементы

исходный код:
var max,min,n,i,go,ga: integer;
var a : array [1..100] of integer;
begin
write(‘Введите размерность массива: ‘);
readln(i);
for n:=1 to i do begin
a[n] := random (101);
writeln(‘a[‘,n,’]= ‘,a[n]);
end;
max := a[1];
min := a[1];
for n:=1 to i do begin
if a[n] > max then begin
max := a[n];
go := n;
end;
if a[n] < min then begin
min := a[n];
ga := n;
end;
end;
writeln;
writeln(‘max = ‘, max);
writeln(‘min = ‘, min);
writeln;
writeln(‘Меняем местами ‘,go,’ и ‘,ga,’ элементы массива’);
writeln;
a[go] := a[go] + a[ga]; //меняем местами максимальный и минимальный элементы массива
a[ga] := a[go] — a[ga];
a[go] := a[go] — a[ga];
for n:=1 to i do begin
writeln(‘a[‘,n,’]= ‘,a[n]);
end;
end.

Приложения:

Ответы на вопрос

Ответ:

Исключение IndexOutOfRangeException («Индекс находился вне границ массива») указывает на то, что в каком либо месте программы вы пытаетесь обратится к массиву с индексом, выходящим за его границы.

Вероятнее всего, конкретно в вашем коде ошибка может быть на строке 4, т.к вы объявляете имя a как массив на 100 элементов с допустимыми индексами от 1 до 100, но позже даёте пользователю право самому ввести требуемую размерность, и никак не проверяете вводимое пользователем значение. В таком случае любое число > 100 будет приводить к исключению IndexOutOfRangeException.

Что бы избежать исключительных ситуаций, вы можете пойти двумя путями:

1. Проверять вводимые данные на соответствие диапазону допустимых индексов для массива а

2. Использовать коллекции с динамической размерностью (Array of T или List<T>)  


Новые вопросы

Регистрация

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

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

Простые решения: как предотвратить выход за границы массива в Паскале

При работе с массивами в языке программирования Паскаль может возникнуть проблема выхода за границы массива. Эта проблема может привести к сбоям программы и искажению данных. Однако, существуют простые решения, помогающие предотвратить подобные ситуации.

Проверка индекса массива

Перед тем, как обращаться к элементу массива, необходимо проверить, что индекс находится в пределах допустимых значений. Для этого можно использовать условную конструкцию if..then..else.

Пример:

var
  arr: array[1..10] of integer;
  i: integer;
begin
  i := 12;
  if (i >= 1) and (i <= 10) then
    arr[i] := 5
  else
    writeln('Индекс находится за пределами массива');
end.

Использование функции Low и High

Функции Low и High возвращают минимальный и максимальный индекс элементов массива соответственно. Эти функции позволяют легко проверить, находится ли индекс в допустимых границах.

Пример:

var
  arr: array[1..10] of integer;
  i: integer;
begin
  i := 12;
  if (i >= Low(arr)) and (i <= High(arr)) then
    arr[i] := 5
  else
    writeln('Индекс находится за пределами массива');
end.

Использование констант

Еще одним способом предотвратить выход за границы массива является использование констант, определяющих размерность массива. Это позволяет избежать ошибок при изменении размерности массива в дальнейшем.

Пример:

const
  ARRAY_SIZE = 10;

var
  arr: array[1..ARRAY_SIZE] of integer;
  i: integer;
begin
  i := 12;
  if (i >= 1) and (i <= ARRAY_SIZE) then
    arr[i] := 5
  else
    writeln('Индекс находится за пределами массива');
end.

Заключение

Выход за границы массива — распространенная проблема при работе с массивами в языке программирования Паскаль. Однако, существует несколько простых решений, которые позволяют избежать эту проблему. Рекомендуется всегда проверять индекс массива перед его использованием, использовать функции Low и High, а также определять константы для размерности массива.

Понравилась статья? Поделить с друзьями:
  • Паскаль ошибка времени выполнения устройство не готово
  • Паскаль ошибка 215 арифметическое переполнение
  • Пасито 2 ошибка check atomizer
  • Паскаль ошибка 205
  • Паскаль ошибка 200