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

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 бронзовых знака

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


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

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

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

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

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

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

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

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


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

22 сент. 2023, в 17:11

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

22 сент. 2023, в 17:10

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

22 сент. 2023, в 17:01

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

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

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

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

Содержание

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

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

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

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

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

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

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

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

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

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

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

Возможно, ваш SQL Reader не получил никаких строк, связанных с указанным вами индексом. Так было со мной; Я получал столбцы, которых не было в базе данных.

Вы можете изменить свой код следующим образом:

Источник

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

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику 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.

Источник

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

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

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

Перед тем, как обращаться к элементу массива, необходимо проверить, что индекс находится в пределах допустимых значений. Для этого можно использовать условную конструкцию 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, а также определять константы для размерности массива.

Понравилась статья? Поделить с друзьями:
  • Ошибка времени выполнения stackoverflowexception
  • Ошибка вольво se8701 11
  • Ошибка времени выполнения basic объектная переменная не установлена
  • Ошибка времени выполнения basic аргумент является обязательным
  • Ошибка времени выполнения basic openoffice