Codeblocks c ++ код не работает в VS 19 (векторный индекс вне диапазона) - PullRequest
0 голосов
/ 27 февраля 2020

Я выполнил несколько тестов простой проблемы как в VS 19, так и в CodeBlocks после ошибки, которая продолжает появляться во многих моих проблемах с кодированием. Удивительно, но в Codeblocks все работает нормально, и я получаю ожидаемый результат, в то время как в VS я всегда получаю ошибку «векторный индекс вне диапазона».

Проблема довольно проста, получить наименьшее количество остановок до места назначения. (просто посчитайте их) Ошибка появляется во время l oop, где я сравниваю i с размером вектора.

Мне интересно, почему это на самом деле работает в кодовых блоках, а также хотелось бы знать, как исправить это в VS


#include <iostream>
#include <vector>

using namespace std;

int compute_min_refills(int dist, int tank, vector<int>& stations) {


    int distanceTraversed = 0;
    int i = 0;
    int stops = 0;
    bool impossible = false;    
    while (distanceTraversed<=dist)
    {
        if((distanceTraversed + tank)> dist)
        {
            distanceTraversed = dist;
            return stops;
        }
        while ((distanceTraversed + tank) > stations[i] && i< stations.size())
        {
            i++;
            impossible = false;
        }

        if ((distanceTraversed + tank) <= stations[i] || i == stations.size())
        {
            if (impossible == true)
            {
                return -1;
            }

            else
            {
            distanceTraversed += stations[i - 1];
            stops++;
            impossible = true;
            }

        }
    }

    return stops;
}


int main() {
    int d = 0;
    cin >> d;
    int m = 0;
    cin >> m;
    int n = 0;
    cin >> n;

    vector<int> stations;
    int a;
    for (int i = 0; i < n; ++i)
    {
        cin>>a;
        stations.push_back(a);
    }
    cout << compute_min_refills(d, m, stations) << "\n";

    return 0;
}



Вот некоторые выводы, если вы хотите проверить это:

Ввод: 500 200 4 100 200 300 400

1 Ответ

3 голосов
/ 27 февраля 2020

Вы обязаны проверять ваш векторный доступ слишком поздно.

Из-за оценки короткого замыкания (distanceTraversed + tank) > stations[i] && i< stations.size() работает не так, как вы думаете, 1-й вы обращаетесь к массиву, и только если условие было выполнено, вы проверяете, был ли доступ внутри границ, то есть UB, если это не так.

Позже (distanceTraversed + tank) <= stations[i] || i == stations.size() также не проверяет границы.

И как последнее замечание, distanceTraversed += stations[i - 1]; если i==0, вы попытаетесь получить доступ к элементу -1, но std::vector проиндексирован с использованием std::size_t, который является беззнаковым, вызывая неявное преобразование, присваивая ему очень большое значение.

...