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

Исправление ошибки - C++

Восстановить пароль Регистрация
 
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
28.01.2014, 17:01     Исправление ошибки #1
Добрый день, ув. форумчане! Помогите, пожалуйста, исправить ошибку. Не пойму в чём проблема.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
std::vector <unsigned char> converter ( std::string& str)
{
    std::vector <unsigned char> result_hex;
    std::vector <unsigned char> result_base;
    result_hex.reserve(str.size()/2);
    result_base.resize(str.size());
    for (int i = 0; i < str.size()/2; ++i)
        result_hex.push_back(((string_to_hex(str[2*i])) << 4) | (string_to_hex(str[2*i + 1])));
 
 
    for (int i = 0; i < result_base.size() - 4; ++i)
    {
        if ((2*i + 3) >= str.size()/2)
        convertToBase64(result_hex[2*i], result_hex[2*i+1], result_hex[2*i+2], result_base[2*i], result_base[2*i+1], result_base[2*i+2], result_base[2*i+3] );
        else break;
    }
    return result_base;
}
Ругается на строку
C++
1
convertToBase64(result_hex[2*i], result_hex[2*i+1], result_hex[2*i+2], result_base[2*i], result_base[2*i+1], result_base[2*i+2], result_base[2*i+3] );
мол вектор вне своих пределов.
Но, вроде, все условия проверяют и не должны позволить циклу зайти вне вектора.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2014, 17:01     Исправление ошибки
Посмотрите здесь:

исправление ошибки C++
Исправление ошибки в работе со строками C++
Исправление ошибки в коде C++
Исправление ошибки в программе C++
C++ Исправление ошибки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
28.01.2014, 17:23     Исправление ошибки #2
Чушь сморожу возможно но, у тебя result_hex.reserve(str.size()/2) в два раза меньше result_base.resize(str.size()). А теперь смотри последний цикл если ((2*i + 3) = str.size()/2) то (2*i + 3) больше раз мера вектора result_hex, а следовательно если ((2*i + 3) = str.size()/2 + 2) result_hex[2*i+1] становится за пределами
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.01.2014, 17:54     Исправление ошибки #3
Цитата Сообщение от Тамика Посмотреть сообщение
C++
1
if ((2*i + 3) >= str.size()/2)
а если равно, это разве не за пределами вектора ?)
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
28.01.2014, 17:58     Исправление ошибки #4
Цитата Сообщение от aLarman Посмотреть сообщение
а если равно, это разве не за пределами вектора ?)
Я тоже на это чуть не попался: (2*i + 3) то вызов то result_hex[2*i+2] с учетом что нумерация с 0, как раз в роде на последнюю указывает
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
28.01.2014, 17:58  [ТС]     Исправление ошибки #5
Цитата Сообщение от aLarman Посмотреть сообщение
а если равно, это разве не за пределами вектора ?)
Не-а. У меня половинный размер строки равен 3 как раз.)
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.01.2014, 18:01     Исправление ошибки #6
C++
1
if (2*(i + 1) < str.size()/2)
может так?
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
28.01.2014, 18:02  [ТС]     Исправление ошибки #7
Цитата Сообщение от aLarman Посмотреть сообщение
C++
1
if (2*(i + 1) < str.size()/2)
может так?
Не уверена... Мне нужны каждые четыре элемента. Там, кстати, ошибка... Вместо 2*i везде должно быть 4*i.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
28.01.2014, 18:04     Исправление ошибки #8
Должно еще к тому же выполняться условие кажется: 2*(result_base.size() - 4-1)+3<result_base.size(), т.е. result_base.size()<7;
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.01.2014, 18:05     Исправление ошибки #9
максимальный индекс у Вас 2*i+2
C++
1
result_hex[2*i+2]
поэтому это число должно быть меньше размера result_hex строго меньше, тогда не будет выхода за пределы вектора

Добавлено через 50 секунд
Цитата Сообщение от Тамика Посмотреть сообщение
Не уверенна...
не уверены или не правильно ?
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
28.01.2014, 18:08  [ТС]     Исправление ошибки #10
Цитата Сообщение от aLarman Посмотреть сообщение
максимальный индекс у Вас 2*i+2
C++
1
result_hex[2*i+2]
поэтому это число должно быть меньше размера result_hex строго меньше, тогда не будет выхода за пределы вектора

Добавлено через 50 секунд

не уверены или не правильно ?
Дошло о чём Вы. Не обратила внимание, что Вы убрали равно в условии.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
28.01.2014, 18:09     Исправление ошибки #11
Цитата Сообщение от aLarman Посмотреть сообщение
максимальный индекс у Вас 2*i+2
Код C++
1
result_hex[2*i+2]
поэтому это число должно быть меньше размера result_hex строго меньше, тогда не будет выхода за пределы вектора
Об этом я и говорю.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.01.2014, 18:11     Исправление ошибки #12
mustimur, дело говорит
чтобы не выйти за пределы result_base думаю надо так...раз у Вас максимальный индекс для этого вектора 2*i+3
C++
1
for (int i = 0; 2*i < result_base.size()-3; ++i)
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
28.01.2014, 18:13  [ТС]     Исправление ошибки #13
Ну да, тут поняла.)
Только объясните, пожалуйста - почему выражение
C++
1
if (result_hex[2*(i+1)] > str.size()/2)
лучше, чем проверка моя
C++
1
if (result_hex[2*i+1)] >= str.size()/2)
?
Никаких упреков, мне правда интересно.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.01.2014, 18:15     Исправление ошибки #14
Цитата Сообщение от Тамика Посмотреть сообщение
Никаких упреков, мне правда интересно
Ваши 2 строчки различаются только знаком, в одном случае строго в другом строго или равно, Вам предложили другую проверку вообще то другую , то что проверяете Вы не поможет не залезть за пределы вектора

Добавлено через 39 секунд

Не по теме:

Цитата Сообщение от aLarman Посмотреть сообщение
не поможет не залезть за пределы
что то я перегнул

mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
28.01.2014, 18:19     Исправление ошибки #15
Цитата Сообщение от Тамика Посмотреть сообщение
Только объясните, пожалуйста - почему выражение
Код C++
1
if (result_hex[2*(i+1)] > str.size()/2)
лучше, чем проверка моя
Код C++
1
if (result_hex[2*i+1)] >= str.size()/2)
?
так мне тут кажется или условия поменялись? В роде было if (2*(i + 1) < str.size()/2)
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
28.01.2014, 18:23  [ТС]     Исправление ошибки #16
Цитата Сообщение от mustimur Посмотреть сообщение
так мне тут кажется или условия поменялись? В роде было if (2*(i + 1) < str.size()/2)
Ой, да. Это я случайно.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
28.01.2014, 18:31     Исправление ошибки #17
Цитата Сообщение от Тамика Посмотреть сообщение
Ой, да. Это я случайно.
Быват сам этим грешу
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2014, 18:32     Исправление ошибки
Еще ссылки по теме:

решение задачи (сумма ряда). исправление ошибки C++
C++ Исправление ошибки. Строки С++
Исправление ошибки в работе со строками C++

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

Или воспользуйтесь поиском по форуму:
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
28.01.2014, 18:32  [ТС]     Исправление ошибки #18
Цитата Сообщение от mustimur Посмотреть сообщение
Быват сам этим грешу
Все мы таким грешим


Решила проблему другим путём таки, но всем спасибо, что помогли!
Yandex
Объявления
28.01.2014, 18:32     Исправление ошибки
Ответ Создать тему
Опции темы

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