Ошибка Exception unhandled

154
22 апреля 2022, 13:40

Помогите пожалуйста исправить оишбку

Вот весь код, 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] << " ";
    }
}
Answer 1

Как это "итератор за пределы массива не выходит"?

А тут?

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, т.е. за пределами инициализированной части...)

Answer 2
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].

И так по всем циклам практически.

Answer 3

Элементы массива в 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 элемента не существует и Вы обращаетесь к чужой памяти. Остановитесь и подумайте.

Компилятор вообще хороший парень, его надо слушать.

READ ALSO
Решить выражение

Решить выражение

Вычисление выражений с использованием побитовых операцийЗадано целые числа a, b, c и d

133
Двойная задержка выполнения скрипта

Двойная задержка выполнения скрипта

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

121
удалить символы из определенного интервала строки и вставки на их место другую строку С++

удалить символы из определенного интервала строки и вставки на их место другую строку С++

помогите с задачей, очень прошу! готов и очень хочу разбираться

206