Форум программистов, компьютерный форум CyberForum.ru

Выход за пределы массива. Исправить код - C++

Восстановить пароль Регистрация
 
cin_cout
25 / 25 / 7
Регистрация: 06.10.2012
Сообщений: 114
12.10.2012, 12:06     Выход за пределы массива. Исправить код #1
Вот такой результат исполнения кода:
5 17 22 10.5 11.23 12.87 6.64 9.82 15.35 - ввел числа в массив с клавиатуры

5 5 17
17 22 22
22 44 10.5
10.5 54.5 11.23
11.23 65.73 12.87
12.87 78.6 6.64
6.64 85.24 9.82
9.82 95.06 15.35
terminate called after throwing an instance of 'Range_error'
what(): Range error: 9

При компилировании никаких замечаний. При исполнении вылезаем за пределы вектора.
Как мы можем вылезти за его размеры, если в цикле заданы рамки i<dist.size() ?
И как тогда определять "последующий" элемент вектора для сравнения с предыдущим, для прочих итераций (нахождение максимального, минимального значений, сортировки)?
Где в моей логике рассуждений ошибка?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include "std_lib_facilities.h"
 
int main()
{
    vector<double> dist;
    double distance;
    while (cin>>distance)
        dist.push_back(distance); 
    double sumdist;
    
    for (int i=0;i<dist.size(); ++i) 
    {
        sumdist+=dist[i];
        cout << dist[i] << '\t' << sumdist << '\t' << dist[i+1] << '\n';
    }
        
    cout << " Среднее расстояние: " << sumdist/dist.size() << '\n';
 
    return 0;
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.10.2012, 12:08     Выход за пределы массива. Исправить код #2
Цитата Сообщение от cin_cout Посмотреть сообщение
Как мы можем вылезти за его размеры, если в цикле заданы рамки i<dist.size() ?
А вот здесь выход за границу: dist[i+1]. В конце цикла, при значении i = i + 1, должен быть выход, а делается попытка cout << dist[i+1]
cin_cout
25 / 25 / 7
Регистрация: 06.10.2012
Сообщений: 114
12.10.2012, 12:13  [ТС]     Выход за пределы массива. Исправить код #3
Цитата Сообщение от alsav22 Посмотреть сообщение
А вот здесь выход за границу: dist[i+1]. В конце цикла, при этом значении i, должен быть выход, а делается попытка cout << dist[i+1]
А как этого избежать? Если, например, дальше я хочу сравнивать в цикле предыдущий элемент с последующим?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.10.2012, 12:23     Выход за пределы массива. Исправить код #4
Цитата Сообщение от cin_cout Посмотреть сообщение
А как этого избежать? Если, например, дальше я хочу сравнивать в цикле предыдущий элемент с последующим?
Сделать можно, но самый последний с чем будете сравнивать?

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
for (int i=0; ; ) 
{
     sumdist+=dist[i];
     cout << dist[i] << '\t' << sumdist << '\t';
     i++;
     if (i < dist.size()) cout  << dist[i+1] << '\n';
     else break;
}
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
12.10.2012, 12:37     Выход за пределы массива. Исправить код #5
cin_cout, вы используете не инициализированную переменную double sumdist.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.10.2012, 12:47     Выход за пределы массива. Исправить код #6
Цитата Сообщение от yuron_477 Посмотреть сообщение
cin_cout, вы используете не инициализированную переменную double sumdist.
В 14 она, вроде бы, инициализируется (но нужно проверить). Для проядка можно в 10:
C++
1
double sumdist = 0;
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
12.10.2012, 12:55     Выход за пределы массива. Исправить код #7
Нельзя использовать не инициализированную переменную в выражении +=

Добавлено через 40 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    int a[] = {1, 2, 3};
    vector<int> v(a, a+3);
    int sum;
    for (int i = 0; i<v.size(); i++)
        sum+=v[i];
    cout<<sum<<endl; // что будет выведено?
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2012, 13:06     Выход за пределы массива. Исправить код
Еще ссылки по теме:

Задача коммивояжера - выход за пределы массива C++
C++ Почему код работает, хотя есть выход за пределы массива?
C++ Массив. Задачка. Выход за пределы массива

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.10.2012, 13:06     Выход за пределы массива. Исправить код #8
Ошибку сделал. Нужно так:
C++
1
2
3
4
5
6
7
8
for (int i=0; ; ) 
{
     sumdist+=dist[i];
     cout << dist[i] << '\t' << sumdist << '\t';
     i++;
     if (i < dist.size()) cout  << dist[i] << '\n';
     else break;
}
Добавлено через 45 секунд
Цитата Сообщение от yuron_477 Посмотреть сообщение
Нельзя использовать не инициализированную переменную в выражении +=
Согласен.
Yandex
Объявления
12.10.2012, 13:06     Выход за пределы массива. Исправить код
Ответ Создать тему
Опции темы

Текущее время: 17:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru