Помогите пожалуйста исправить оишбку
Вот весь код, c++. итератор за пределы массива не выходит
#include <iostream>
using namespace std;
int main() {
short n, mx = -101, f = 0;
cin >> n;
int* mass = new int[n];
int mxindexes[100];
for (int i = 1; i <= n; i++)
{
cin >> mass[i];
if (mass[i] > mx)
{
mx = mass[i];
}
}
for (int i = 1; i <= n; i++)
{
if (mass[i] == mx)
{
mxindexes[f] = i;
f++;
}
}
for (int L = f; L >0; L--)
{
for (int i = mxindexes[L]; i <n; i++)
{
mass[i] = mass[i+1];
}
}
for (int i = 1; i <= n-f+1; i++)
{
mass[i] = mx;
}
for (int i = 1; i <= n; i++)
{
cout << mass[i] << " ";
}
}
Как это "итератор за пределы массива не выходит"?
А тут?
int* mass = new int[n];
.....
for (int i = 1; i <= n; i++)
{
if (mass[i] == mx)
{
Да и вы гарантируете, что дальше f
не станет равным 100? Да и дальше натыкано много чего...
Посмотрите отладчиком, чему равны ваши значения индексов.
Вы помните (или нет?), что нумерация массивов в С++ начинается с нуля?
Или вот (то самое место, куда вы по случайности UB таки добрались...):
mxindexes[f] = i;
f++;
}
}
Итак, последний f
- за пределами mxindexes
. А тут вы
for (int L = f; L >0; L--)
{
for (int i = mxindexes[L]; i <n; i++)
начинаете работать с неинициализированным значением в mxindexes[L]
(при первой итерации L
равно f
, т.е. за пределами инициализированной части...)
int* mass = new int[n];
Запомним, под mass
выделено n
элементов (с индексами от 0
до n-1
).
for (int i = 1; i <= n; i++)
{
...
mass[i];
...
}
На последнем проходе будет i = n
, значит будет обращение к mass[n]
.
for (int i = 1; i < n; i++)
{
...
mass[i+1];
...
}
На последнем проходе будет i = n - 1
, значит будет обращение к mass[n]
.
И так по всем циклам практически.
Элементы массива в C++ (и многих других языках) нумеруются с нуля. Тут, например,
int n = 5;
int* mass = new int[n];
Я выделил память под массив из 5 интов, НО первый элемент в нем будет иметь индекс 0
, а последний 4 (n-1)
Это необходимо учитывать. Вы в комментариях писали:
И какая разница как нумеровать массив. в данном случае массив заполняю от 1 до n включительно, это то же самое, что от 0 до n-1
Не тоже самое ни разу. Вы в случае такого цикла
for (int i = 1; i <= n; i++)
{
if (mass [i] == mx){// код... }
}
Говорите машине:
Организуй мне, пожалуйста, цикл, и в нем проверь элементы массива, начиная с элемента
С ИНДЕКСОМ 1 (То есть второго) в массиве (То есть первый НЕ проверяй) До элемента с ИНДЕКСОМ n
Включительно. (То есть ШЕСТОГО (n+1) по порядку).
Компилятор такой:
Хозяин, Вы выделили память только под n
элементов, а n+1
элемента не существует и Вы обращаетесь к чужой памяти. Остановитесь и подумайте.
Компилятор вообще хороший парень, его надо слушать.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Вычисление выражений с использованием побитовых операцийЗадано целые числа a, b, c и d
Есть такой скрипт, на ардуино (крутит шаговый двигатель)Подскажите как сделать так чтобы этот скрипт выполнялся 10 секунд, потом была задержка...
//Преобразование "строки" в "СТРОКУ"
помогите с задачей, очень прошу! готов и очень хочу разбираться