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
Динамические массивы нумеруются с нуля. Цикл for var i:=1 to N do begin
должен выглядеть хотя бы так for var i:=0 to N-1 do begin
А вообще стоит оперировать такими функциями работы с массивами, как length
, High
и т.п.
ответ дан 6 дек 2017 в 6:27
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.
-
Вопрос задан
-
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 руб./за проект
Минуточку внимания
Простые решения: как предотвратить выход за границы массива в Паскале
При работе с массивами в языке программирования Паскаль может возникнуть проблема выхода за границы массива. Эта проблема может привести к сбоям программы и искажению данных. Однако, существуют простые решения, помогающие предотвратить подобные ситуации.
Проверка индекса массива
Перед тем, как обращаться к элементу массива, необходимо проверить, что индекс находится в пределах допустимых значений. Для этого можно использовать условную конструкцию 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
, а также определять константы для размерности массива.
Попытка вывести массив не поэлементно, а целиком
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: Программы и алгоритмы для начинающих
Содержание
- Индекс находился вне границ массива
- Индекс находился вне границ массива! [закрыт]
- 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.
Источник