Код C ++ мгновенно падает из-за проблем с памятью - PullRequest
0 голосов
/ 30 мая 2018

Этот код должен читать файл .pnm.Я попытался запустить его с двумя разрешениями:

  • 200x200 px: здесь все работает просто отлично.

  • 500x281 px: код мгновенно падает, поднимаяSIGSEGV ошибка.

Насколько я знаю, SIGSEGV связан с проблемами памяти.У меня 8 ГБ ОЗУ, и это количество, которое я считаю достаточным для этого.Я понятия не имею, почему это происходит и как это исправить.

Код

#define IO_ERROR                (5)
#define X_DIMENSION             (500)
#define Y_DIMENSION             (281)
#define C_DIMENSION             (3)
#define HEADER_SIZE             (3)
#define BODY_SIZE               (X_DIMENSION * Y_DIMENSION * C_DIMENSION)

#include <iostream>
#include <fstream>
#include <string>
using namespace std;


int readImage(string fileName, string *imgHeader, string *imgBody)
{
        ifstream inputFile(fileName);

        if (!inputFile.is_open())
                return IO_ERROR;

        string line;
        int count = 0;
        while (getline(inputFile, line)) {
                if (line.find("#") != string::npos)     
                        continue;
                if (count < 3)                          
                        imgHeader[count] = line;
                else                                    
                        imgBody[count - HEADER_SIZE] = line;
                count++;
        }
        inputFile.close();

        return 0;
}


void numericParser(const string *imgBody, unsigned char *numericBody)
{
        int i = 0;
        while(i < BODY_SIZE) {
                numericBody[i] = (unsigned) atoi(imgBody[i].c_str());
                i++;
        }
}

void rgbParser(const string *imgBody, unsigned char rgbMatrix[X_DIMENSION][Y_DIMENSION][C_DIMENSION])
{
        unsigned char numericBody[BODY_SIZE];
        numericParser(imgBody, numericBody);
        int k = 0;
        for (int i = 0; i < X_DIMENSION; i++) {
                for (int j = 0; j < Y_DIMENSION; j++) {
                        for (int c = 0; c < 3; c++) {
                                rgbMatrix[i][j][c] = numericBody[k];
                                k++;
                        }
                }
        }
}

void printInfo(const string *header, const string *body)
{
        cout << "#-*- Image Header -*-" << endl;
        for (int i = 0; i < HEADER_SIZE; i++) {
                cout << header[i] << endl;
        }

        cout << "#-*- Image Body -*-";
        for (int i = 0; i < 5 * C_DIMENSION; i++) {
                if (i % 3 == 0) cout << endl << "R: " << body[i];
                else if (i % 3 == 1) cout << " G: " << body[i];
                else cout << " B: " << body[i];
        }
        cout << endl << ". . ." << endl;
}


int main()
{
        string fileName;
        cout << "File name: ";
        cin >> fileName;

        string imgHeader[HEADER_SIZE];
        string imgBody[BODY_SIZE];
        if(readImage(fileName, imgHeader, imgBody) == IO_ERROR)
                return IO_ERROR;

//        printInfo(imageData);

        unsigned char rgbMatrix[X_DIMENSION][Y_DIMENSION][C_DIMENSION];
        rgbParser(imgBody, rgbMatrix);

        return 0;
}

Дополнительная информация

Я нахожусь на 64-битной версии Arch Linux, используя CLion в качестве IDE.

...