LINUX.ORG.RU

Segmentation fault при чтении файла.


0

0

Код:

------------------- main.cpp -------------------------------------
#include "BMP.h"
#include <stdio.h>

tagBITMAPFILEHEADER bmpFileHeader;
tagBITMAPINFOHEADER bmpInfoHeader;

int file_bmp,nCol,nRow,col;
tagRGBQUAD* flat;
tagRGBQUAD p;


void out(void)
{
for (int i = 0; i < col; i++) cout << flat[i].r << flat[i].g << flat[i].b;
}

void readFile(char* file)
{
file_bmp = open (file, O_RDONLY);
read (file_bmp, &bmpFileHeader, 14);
read (file_bmp, &bmpInfoHeader, 40);

nCol = bmpInfoHeader.biWidth;
nRow = bmpInfoHeader.biHeight;

cout << (col = nRow*nCol) << "\n";

int n = 0;

for (int y = nRow; y > 0; y--)
{
for (int x = 0; x < nCol; x++)
{
read (file_bmp, &p, sizeof(p));
cout << n << "\n";
cout << (int)p.r << " " << (int)p.g << " " << (int)p.b << "\n";
flat[n].r = p.r;
flat[n].g = p.g;
flat[n].b = p.b;
n++;
}
}
out();
}

int main (int argc, char* argv[])
{
readFile(argv[1]);
cout << "\n";
return 0;
}
-------------------------------------------------------------------------------

------------------------------BMP.h-----------------------------------------
#include <fcntl.h> //Необходимо для работы системной функции открытия файлов
#include <unistd.h> //Необходимо для работы системной функции чтения файлов
#include <iostream.h> //необходим для cout

#pragma pack(push,1) //для чтения необходимо выравнивение, с сохранением его текущегозначения

typedef unsigned long DWORD; // Двойное слово - 32 бита (разряда)
typedef unsigned short WORD; // Слово - 16 бит (разрядов)
typedef signed long LONG;
typedef unsigned int UINT;

// Заголовок файла
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 'BM' = 4D42h
DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits; // Смещение к растру
};

// Заголовок Bitmap
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
};

//структура пиксела
typedef struct tagRGBQUAD
{
char r;
char g;
char b;
char a;
};

#pragma pack(pop) //восстановление значения выравнивания
-------------------------------------------------------------------------------- ------

[alexandr@cyclon Img]$ ./a.out 32b.bmp
289081 - общее счисло пикселов, необходимо для вывода значений
0 - значение индекса массива
74 41 41 - цвет первого пиксела
Segmentation fault - сбой

Вот собсно проблема. Читается бмпешка, но после чтения первого же пиксела происходит segmentation fault очевидно проблема в заполнение массиова, но в чём именно, ведь определён массив правильно или нет (я мнус по поводу динамического массива, если я не правильно его определил может кто подскажет как это определить).

Заранее спасибо!!!

★★★★★

Я заранее извинияюсь за возможно неверный ответ, но куда у тебя указвает flat????
то есть где проинициализирован этот указатель?

Dead ★★★★
()
Ответ на: комментарий от Dead

Так это же не указатель а массив!!!

Да к стати похоже проблема именно в нём, т.е. я определил не динамический массив а массив из одного элемента. Т.е. вопрос сводится к тому как изобразить динамический массив. (Но может я ошибаюсь.)

cyclon ★★★★★
() автор топика
Ответ на: Re от cyclon

Ну примерно так,

f = new tagRGBQUAD[PixelNumber];

PixelNumber сам посчитай :)

Dead ★★★★
()
Ответ на: комментарий от Dead

Re

Да, Да, Да вспомнил

flat = new tagRGBQUAD[col];

просто что-то с памятью моей стало, но всё равно спасибо ;).

cyclon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.