C++ Crashujący się program

0

Tak jak w temacie, kompiluje sie idealnie, crashuje przy odpaleniu.

 #include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

int main()
{
    const int x = 16;
    const int y = 16;


    FILE *fp = fopen("nowy.bmp", "wb");

    // INFORMACJE W NAGLOWKU SA ZAPISANE 2 LUB 4 BAJTAMI DANYCH
    // UNSIGNED SHORT INT JEST ODPOWIEDNIK DLA TYPU WORD - 2 BAJTY
    // UNSIGNED LONG INT JEST ODPOWIEDNIK DLA TYPU DWORD - 4 BAJTY

    // Nagłowek pliku
    unsigned short int bfType;
    unsigned long int bfSize;
    unsigned short int bfReserved1;
    unsigned short int bfReserved2;
    unsigned long int bfOffBits;
    // Nagłowek bitmapy
    unsigned long int biSize;
    unsigned long int biWidth;
    unsigned long int biHeight;
    unsigned short int biPlanes;
    unsigned short int biBitCount;
    unsigned long int biCompression;
    unsigned long int biSizeImage;
    unsigned long int biXPelsPerMeter;
    unsigned long int biYPelsPerMeter;
    unsigned long int biClrUsed;
    unsigned long int biClrImportant;

    unsigned char b = 'B', m = 'M';

    bfType = (b) | (m);    // Musi być BM - czyli bitmapa
    bfSize = 54+((x*y)*3); // Określenie długości pliku w bajtach
    bfReserved1 = 0;       // Zarezerwowane - 0
    bfReserved2 = 0;       // Zarezerwowane - 0
    bfOffBits = 54;        // Położenie obszaru danych względem początku pliku - czyli gdzie zaczyna się obraz właściwy

    biSize =  40;          // Długość nagłówka obrazu (40)
    biWidth = x;           // Szerokość obrazka
    biHeight = y;          // Wysokość obrazka
    biPlanes = 1;          // Liczba planów w urządzeniu docelowym, zawsze równa 1
    biBitCount = 24;       // Pole określa ile kolejnych bitów z obszaru danych opisuje kolor jednego punktu rysunku. Jednocześnie informuje ono, ile maksymalnie kolorów zawiera paleta kolorów. Pole to może przyjmować kilka wartości:
                           // 1 obrazek jest dwubarwny, paleta kolorów zawiera opis maksymalnie dwóch barw, każdy bit obszaru danych określa kolor jednego punktu rysunku,
                           // 4 obrazek może mieć maksimum 16 kolorów i taka jest maksymalna liczba barw w palecie kolorów, każde cztery bity obszaru danych określają barwę jednego punktu,
                           // 8 obrazek może mieć maksimum 256 kolorów, paleta zawiera opis maksimum 256 barw, każdy punkt rysunku opisywany jest przez 8 bitów,
                           // 24 rysunek może mieć maksimum 224 = 16.777.216 kolorów (True Color), w tym przypadku nie ma palety kolorów tylko każde trzy bajty obszaru danych określają odpowiednio natężenie koloru czerwonego, zielonego i niebieskiego
                           // 32 rysunek może mieć maksimum 224 = 16.777.216 kolorów (True Color), w tym przypadku nie ma palety kolorów tylko każde cztery bajty obszaru danych określają odpowiednio natężenie koloru czerwonego, zielonego i niebieskiego zaś ostatni bajt może służyć do przechowywania składowej A (Alpha), bądź nie jest wykorzystany
    biCompression = 0;     // Pole określa sposób kompresji obszaru danych pliku i może przyjmować jedną z trzech wartości:
                           // 0 brak kodowania,
                           // 1 kodowanie RLE8 (Run Length Encoding 8-Bits),
                           // 2 kodowanie RLE4 (Run Length Encoding 4-Bits).
    biSizeImage = (x*y)*3; // Długość obszaru danych w bajtach
    biXPelsPerMeter = 0;   // Rozdzielczość pozioma obrazka w punktach na metr
    biYPelsPerMeter = 0;   // Rozdzielczość pionowa obrazka w punktach na metr
    biClrUsed = 0;         // Pole określa ile kolorów z palety jest wykorzystywanych w rysunku, wartość zero oznacza, że wykorzystywana jest cała paleta, w trybie True Color (24-bitowym) zmienna ta określa wielkość tabeli kolorów, która wystarcza, aby program wczytujący rysunek mógł pomieścić użyte w rysunku kolory
    biClrImportant = 0;    // Pole określa ile kolorów wystarcza, aby możliwie poprawnie wyświetlić rysunek, zaleca się aby kolory w palecie były uszeregowane według malejącego znaczenia w rysunku, zero oznacza, że cała paleta jest istotna

    fwrite((char*)&bfType, 1, sizeof(bfType), fp);
    fwrite((char*)&bfSize, 1, sizeof(bfSize), fp);
    fwrite((char*)&bfReserved1, 1, sizeof(bfReserved1), fp);
    fwrite((char*)&bfReserved2, 1, sizeof(bfReserved2), fp);
    fwrite((char*)&bfOffBits, 1, sizeof(bfOffBits), fp);

    fwrite((char*)&biSize, 1, sizeof(biSize), fp);
    fwrite((char*)&biWidth, 1, sizeof(biWidth), fp);
    fwrite((char*)&biHeight, 1, sizeof(biHeight), fp);
    fwrite((char*)&biPlanes, 1, sizeof(biPlanes), fp);
    fwrite((char*)&biBitCount, 1, sizeof(biBitCount), fp);
    fwrite((char*)&biCompression, 1, sizeof(biCompression), fp);
    fwrite((char*)&biSizeImage, 1, sizeof(biSizeImage), fp);
    fwrite((char*)&biXPelsPerMeter, 1, sizeof(biXPelsPerMeter), fp);
    fwrite((char*)&biYPelsPerMeter, 1, sizeof(biYPelsPerMeter), fp);
    fwrite((char*)&biClrUsed, 1, sizeof(biClrUsed), fp);
    fwrite((char*)&biClrImportant, 1, sizeof(biClrImportant), fp);

    static unsigned char R;  // Czerwony
    static unsigned char G;  // Zielony
    static unsigned char B;  // Niebieski

    for (int yy = 0; yy < y; yy++)
    {
        for (int xx = 0; xx < x; xx++)
        {
            R = 255;
            G = 255;
            B = 255;

            fwrite((char*)R, 1, sizeof(R), fp);
            fwrite((char*)G, 1, sizeof(G), fp);
            fwrite((char*)B, 1, sizeof(B), fp);
        }
    }
    fclose(fp);

    cout << endl;
    cout << "mozna wylaczyc";
    getch();
}

PS Kompilator Code::Blocks

0

odpal debugger i sprawdź w którym miejscu sie wywala i na czym.

1

Dziecięca zabawa - znajdź różnicę.

    fwrite((char*)&biClrImportant, 1, sizeof(biClrImportant), fp);
           fwrite((char*)R, 1, sizeof(R), fp);
1

Jedna rzecz mi się od razu rzuciła w oczy, bfType. Ta zmienna powinna zawierać ciąg znaków 'B' i 'M', a nie bitwise or ich wartości liczbowych.
unsigned short int bfType = 'B' * 256 + 'M';
albo:
unsigned short int bfType = ('B' << 8) | 'M';

0

Dzięki wam _13th_Dragon, Rev.
Moglibyście mi jedynie wytłumaczyć co zmienia zapis << 8?
I poprawnie działa przy M, czyli ('M' << 8).

1 użytkowników online, w tym zalogowanych: 0, gości: 1