Почему я получаю переполнение буфера? Как я могу избежать этого? [C ++] - PullRequest
0 голосов
/ 08 ноября 2018

Введение:

Привет всем, у меня есть файл .csv, который содержит (x, y, z) координаты изображения с разрешением 1280x720 (ширина x высота),В этих точках данных он содержит значение z, которое представляет глубину для данного конкретного пикселя.В файле CSV 1280x720 = 921 600 баллов.

CSV File: Last Row Last Column

Проблема:

Сначала я хотелскопировать эти 921 600 точек в двумерном массиве в мою собственную программу для обработки.Я написал double Array2D[1280][720];, но программа потерпела крах, скорее всего из-за переполнения стека.Мой другой новый метод почти работает, но также, похоже, возникла аналогичная проблема, это переполнение буфера?

В моем собственном тестировании кода ниже, запрос (x, y) из точек (0, 0) в(1279, 565) работает, но что-либо после 565 является недействительным.Например, в файле .CSV в точке (1279, 565) фактическое значение равно 1,589, которое удается получить моей программе.В точке (1279, 566) фактическое значение равно 1.579, но моя программа возвращает значение 0.

Console Test Program

Это переполнение буфера некоторогоСортировать?Что я могу сделать, чтобы это исправить?

Файл CSV: Ссылка на файл .CSV

Полный упрощенный код:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <memory>

template <class T, size_t W, size_t H>
class Array2D {
public:
    const int width = W;
    const int height = H;
    typedef typename T type;

    Array2D() {
        buffer.resize(width*height);
    }

    T &operator() (int x, int y) {
        return buffer[y*width + x];
    }

    const T &operator() (int x, int y) const {
        return buffer[y*width + x];
    }

private:
    std::vector<T> buffer;
};

int main() {
    char eater; // Charater to remove ',' and '\n' in a .CSV file
    int xs, ys; // User queried points, X & Y coordinates

    Array2D<double, 1281, 721> a;

    // Opening (x, y, z) .CSV file with 921,600 points
    std::ifstream coordinatesFile;
    coordinatesFile.open("test2.csv_Depth_3068.csv");

    std::cout << "COPYING" << std::endl;

    // Copying the z(depth) data into a Vector
    for (int y = 1; y < 720; y++) { // Iterating through 720 rows
        for (int x = 1; x < 1280; x++) { // Iterating through 1280 columns
            coordinatesFile >> a(x, y); // Copying the value with X, Y coordinates
            coordinatesFile >> eater; // Remove the ',' after each z(depth) value
        }
        coordinatesFile >> eater; // Removes the '\n' after every row in a .CSV file, should run 720 times since there are 720 rows which means there are 720 '\n's
    }

    // For user to Query the data stored in vector
    while (1) {
        std::cout << "Enter X val: ";
        std::cin >> xs;
        std::cout << "Enter Y val: ";
        std::cin >> ys;

        std::cout << "Value = " << a(xs, ys) << std::endl;
    }

    coordinatesFile.close();
    std::cin.get();
    std::cin.ignore();
}

1 Ответ

0 голосов
/ 08 ноября 2018

Массивы (и std::vector s) имеют допустимые индексы от 0 до size - 1.

Также не уверен, почему вы определяете

Array2D<double, 1281, 721> a;

Использование:

Array2D<double, 1280, 720> a;

и

for (int y{}; y < 720; ++y) {
    for (int x{}; x < 1280; ++x) {
        if (!(coordinatesFile >> a(x, y) >> std::noskipws >> eater >> std::skipws)
            && !coordinatesFile.eof() && eater != ',' && eater != '\n')
        {
            std::cerr << "Format error at " << x + 1 << '/' << y + 1 << " :(\n\n";
            return EXIT_FAILURE;
        }
    }
}

должен сделать трюк.

...