Ошибка bad_array_new_length при попытке загрузить текстовый файл в динамически размещенный 2d массив - PullRequest
0 голосов
/ 19 февраля 2019

Итак, проблема, с которой я столкнулся в этом коде, заключается в том, что при его запуске я получаю сообщение об ошибке: terminate called after throwing an instance of "std:bad_array_new_length" what(): std:: bad_array_new_length В противном случае ошибок нет, и код компилируется просто отлично.Ниже приведен текстовый файл, который я пытаюсь загрузить:

10  8
0   255 255 255 0   0   255 255 255 0
255 0   255 255 0   0   255 255 0   255
255 255 0   255 255 255 255 0   255 255
255 255 255 0   255 255 0   255 255 255
255 255 255 355 0   0   255 255 255 255
255 255 255 255 0   0   255 255 255 255
255 255 255 0   255 255 0   255 255 255
0   0   0   255 255 255 255 0   0   0

Первые два значения (10/8) - это длина (строки) и высота (столбцы), а остальные предназначены для хранения вмассив 2d.

#include <iostream>
#include <fstream>
#include <string>
#include "image.h" // Has the prototypes for the functions

using namespace std;

int** load(string imageFile, int &length, int &height) {
    int** array = new int*[length];
    ifstream file(imageFile);
    if(file.is_open()) {
        file >> length; // Takes the first value and stores it as length
        file >> height; // Takes the second value and stores it as height
        for(int i = 0; i < length; i++) {
            array[i] = new int[height]; 
            for(int j = 0; j < height; j++) {
                file >> array[i][j];
            }
        }
    }
    else {
        cout << "Unable to open file." << endl;
        return 0;
    }
    return array;
}

int main() {
    int height, length;
    int **image = load("../resource/imagecorrupted.txt", length, height);
}

Я должен добавить, что это домашнее задание, поэтому я довольно ограничен в том, что я могу сделать.В основном мне нужно сохранить значения из загрузки в ** образ, а также параметры функции, которые были заданы для меня, и их нельзя изменить.Кроме того, это все еще довольно рано в классе, поэтому для этого назначения мы не должны использовать структуры или классы или что-то подобное.Спасибо за любую помощь / совет, который вы можете дать мне!

РЕДАКТИРОВАТЬ:

Благодаря @IgorTandetnik рассказал мне о моей проблеме, я нашел решение.Этот новый код работает, если у кого-то возникнет та же проблема в будущем, и ему потребуется помощь:

int** load(string imageFile, int &length, int &height) {
    ifstream file(imageFile);
    if(file.is_open()) {
        file >> length; 
        int** array = new int*[length];
        file >> height;
        for(int i = 0; i < length; i++) {
            array[i] = new int[height]; 
            for(int j = 0; j < height; j++) {
                file >> array[i][j];
            }
         }
         return array;
    }
    else {
        cout << "Unable to open file." << endl;
        return 0;
    }
}

int main() {
    int height = 0;
    int length = 0;
    int **image = load("../resource/imagecorrupted.txt", length, height);
}

1 Ответ

0 голосов
/ 19 февраля 2019

int** array = new int*[length] На данный момент, length является неинициализированной переменной.Ваша программа демонстрирует неопределенное поведение.

На практике, length, вероятно, содержит очень большое значение мусора.Попытка выделить такой большой объем памяти не удалась.

...