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,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.
-
Вопрос заданболее года назад
-
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 Метки нет (Все метки)
Здравствуйте!
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 |
Это как проинициализировать ??
0 |
APALoff 1646 / 1075 / 1081 Регистрация: 03.07.2013 Сообщений: 4,507 |
||||
28.03.2015, 23:00 |
4 |
|||
писал перед циклом n:=0 — не помогло И не поможет, инициализировать надо тоже с умом. Можно поставить единицу, но у Вас скорее всего всплывет потом еще одна ошибка в строке 16. Добавлено через 2 минуты text[n] := s // ЭТУ строку подсвечивает а надо
Добавлено через 1 минуту
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 |
с другой стороны — пытаетесь записывать что-то после конца файла (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 |
|||
Может я написал не правильно, но имелся ввиду вывод на экран.. Если это вывод на экран, то не правильно — у Вас цикл привязан к файлу.
Добавлено через 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 |
|||
1 |
LR16 0 / 0 / 2 Регистрация: 15.03.2015 Сообщений: 20 |
||||
28.03.2015, 23:25 [ТС] |
13 |
|||
А нет, не пойдёт. Сначала надо сделать кодирование. Да я понял, усложнил себе задачу просто.. Добавлено через 7 минут
каша получается, а не код. Да, че-то тупанул с самого начала.
Опять где-то накосячил, только один символ выводит. P.S. там забыл вернуть номер символа опять в символ CHR, спасибо..
0 |
1646 / 1075 / 1081 Регистрация: 03.07.2013 Сообщений: 4,507 |
|
28.03.2015, 23:30 |
14 |
Сообщение было отмечено LR16 как решение Решение
for i:=1 to n-1 Тут уже можно изменить на просто n, без «-1» Добавлено через 1 минуту
Вы же пытаетесь с ним работать не пойми как, с одной стороны, как с файлом с последовательным доступом (readln), Думаю надо READ, без LN Добавлено через 1 минуту
1 |
0 / 0 / 2 Регистрация: 15.03.2015 Сообщений: 20 |
|
28.03.2015, 23:32 [ТС] |
15 |
Думаю надо READ, без LN Ого, сработало, большое Спасибо !)
0 |
Cyborg Drone Модератор 9588 / 4908 / 3244 Регистрация: 17.08.2012 Сообщений: 15,337 |
||||
28.03.2015, 23:41 |
16 |
|||
Сообщение было отмечено LR16 как решение РешениеНу не знаю… Во-первых, как правило, шифр Цезаря строится на ограниченном и закольцованном множестве символов, у Вас же — на всех символах. Как Вы думаете, каков будет результат преобразования для трёх последних символов кодовой таблицы? Правильно, весьма ошибочный. Скорее всего, программа вылетит с оговоркой, что нельзя привести какой-нибудь word или integer к типу char. Тем не менее, если из Вашей программы повытряхнуть всё лишнее, то будет так:
1 |
LR16 0 / 0 / 2 Регистрация: 15.03.2015 Сообщений: 20 |
||||
29.03.2015, 00:42 [ТС] |
17 |
|||
Ну не знаю БОЛЬШОЕ СПАСИБО ВАМ )
===============
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