Необработанное исключение в Allegro 5.10

Ошибка необработанного исключения при запуске программы

Ниже приведен исходный код моей программы, ошибки компиляции нет, но когда я запускаю ее, я получаю исключение Runtime error, как на прикрепленном изображении.

Цитата

Исключение первого шанса по адресу 0x00000000 в all5.1.exe: 0xC0000005: место выполнения нарушения прав доступа 0x00000000. Необработанное исключение по адресу 0x778F1A91 в файле all5.1.exe: 0xC0000005: место выполнения нарушения прав доступа 0x00000000.

Цитата

#include <conio.h>
#include <allegro5\allegro.h>
#include <allegro5\allegro_native_dialog.h>
#include <allegro5\allegro_font.h>
#include <allegro5\allegro_ttf.h>
#include <allegro5\allegro_image.h>
#include <allegro5\allegro_primitives.h>

const int SCREEN_H = 690;
const int SCREEN_W = 1350;

class background
{
private: int advt_x = 1000, advt_y = SCREEN_H - 100, nw_m_x = 1350;       //data cannot be accessed from outside the class
public: ALLEGRO_FONT *size_20 = al_load_font("digital-7.ttf", 20, 2);     //loading font file for advt() and nw_title()
public: ALLEGRO_FONT *size_15 = al_load_font("digital-7.ttf", 15, 1);     //loading font file for nw_marquee()




public: void bground()
{
            ALLEGRO_BITMAP *bgr = al_load_bitmap("bground.jpg");    //loading the background vertex image
            if (bgr == NULL) //checking whether the image loaded successfully or not
            {
                al_show_native_message_box(NULL, "Error", NULL, "Fatal error: Backgroung Missing from disk!!!", NULL, NULL); //if image didn't loaded then print the error message
            }
            al_draw_bitmap(bgr, 0, 0, NULL);                        //printing the background image
}

public: void studio()
{
            ALLEGRO_BITMAP *anch = al_load_bitmap("anchor.jpg");
            if (anch == NULL) //checking whether the image loaded successfully or not
            {
                al_show_native_message_box(NULL, "Error", NULL, "Fatal error: Anchor Missing from disk!!!", NULL, NULL); //if image didn't loaded then print the error message
            }
            al_draw_bitmap(anch, SCREEN_W-300, SCREEN_H-500, NULL);                        //printing the anchor image
}
public: void news_info()
{
            ALLEGRO_BITMAP *nwinfo = al_load_bitmap("news_image.jpg");
            if (nwinfo == NULL) //checking whether the image loaded successfully or not
            {
                al_show_native_message_box(NULL, "Error", NULL, "Fatal error: News Media Missing from disk!!!", NULL, NULL); //if image didn't loaded then print the error message
            }
            al_draw_bitmap(nwinfo, 0, 200, NULL);                        //printing the News Media
}
public: void ch_logo()
{
            ALLEGRO_BITMAP *chlogo = al_load_bitmap("logo_header.jpg");
            if (chlogo == NULL) //checking whether the image loaded successfully or not
            {
                al_show_native_message_box(NULL, "Error", NULL, "Fatal error: News Media Missing from disk!!!", NULL, NULL); //if image didn't loaded then print the error message
            }
            al_draw_bitmap(chlogo, SCREEN_W-110, 0, NULL);                        //printing the News Media

}
public: void nw_title()
{
            al_draw_rectangle(0, 0, SCREEN_W-110, 72, al_map_rgb(0, 255, 0), 1.0);
            al_draw_text(size_20, al_map_rgb(128, 50, 30), 0, 0, 0, "Violence in a Restaurant over the payment of Bill amounting INR 260.");         //printing text
}
public: void nw_marquee()
{
            int nw_m_text_len = al_get_text_width(size_15, "All news headlines will be displayed in marquee here.");
            if (nw_m_x == (0 - nw_m_text_len))
            {
                nw_m_x = 1000;
            }
            al_draw_filled_rectangle(0, SCREEN_H-190, SCREEN_W, SCREEN_H-100, al_map_rgb(0, 255, 0));
            al_draw_text(size_15, al_map_rgb(128, 50, 30), nw_m_x, SCREEN_H - 140, 0, "All news headlines will be displayed in marquee here.");
            nw_m_x--;
}
public: void advt()
{
            al_draw_filled_rectangle(0, SCREEN_H-99, SCREEN_W, SCREEN_H, al_map_rgb(90, 110, 0));
            al_draw_text(size_20, al_map_rgb(128, 50, 30), advt_x, SCREEN_H-50, 0, "Ads will be shown here.");
            advt_x--;
}
   }bg;





int main()
{

ALLEGRO_DISPLAY *display = NULL;
if (!al_init())
{
    al_show_native_message_box(NULL, "Init error", NULL, "Allegro failed to initialise!!! Program is exiting.", NULL, NULL);
    return -1;
}
display = al_create_display(1350, 690);

al_set_window_position(display, 0, 0);
al_set_window_title(display, "New Window");

al_init_font_addon();       
al_init_image_addon(); 
al_init_primitives_addon(); 
bg.bground();
bg.studio();
bg.ch_logo();
bg.news_info();
while (1 == 1)
{
    bg.nw_title();
    bg.advt();
    bg.nw_marquee();
    al_flip_display();         //print from backBuffer to screen and makes things visible
    al_rest(3.0);
    al_destroy_display(display);
}

_getch();
return 0;
}

person Mohit Mishra    schedule 16.05.2016    source источник
comment
Похоже, что один или несколько ваших ресурсов загружаются неправильно, например, вы проверяете NULL на растровых изображениях, но не на двух шрифтах. То, что я обработал исключение по этому низкому адресу, означает, что. Однако я не уверен. Шаг за шагом отлаживайте отладчик, пока не произойдет исключение, чтобы увидеть, какой файл неуместен.   -  person rlam12    schedule 16.05.2016
comment
отладчик останавливается на }bg; это объект моего класса bground.   -  person Mohit Mishra    schedule 17.05.2016
comment
Попробуйте загрузить 2 шрифта в конструктор для этого класса. Похоже, что конструктор по умолчанию не инициализирует их. Всякий раз, когда вы создаете класс, старайтесь всегда создавать для него хотя бы один конструктор. Особенно, когда динамические элементы, такие как эти шрифты, необходимо загрузить с диска.   -  person rlam12    schedule 17.05.2016
comment
я помещаю свои коды загрузки шрифта в конструктор. и поместите конструктор в начало класса. Я также создал деструктор и поместил его в конец класса. но все равно VS выдает ту же ошибку.   -  person Mohit Mishra    schedule 17.05.2016
comment
Хорошо, когда я вернусь домой с работы, я попытаюсь воспроизвести проблему и, возможно, вернусь с ответом, это займет около 5 часов.   -  person rlam12    schedule 17.05.2016
comment
background () { size_20 = al_load_font (цифровой-7.ttf, 20, 2); //на этот раз отладчик останавливается здесь, выдавая ошибку. size_15 = al_load_font(цифровой-7.ttf, 15, 1); // загрузка файла шрифта для nw_marquee() }   -  person Mohit Mishra    schedule 17.05.2016


Ответы (2)


Нашел ошибку, сразу после инициализации надстройки шрифта нужно инициализировать надстройку ttf с al_init_ttf_addon(). Что происходит, так это то, что надстройка шрифта сама по себе не знает, как читать разные форматы. Таким образом, при попытке загрузить шрифты * .ttf он молча терпел неудачу.

person rlam12    schedule 18.05.2016
comment
Вы добавили конструкторы в основную программу? - person Mohit Mishra; 18.05.2016
comment
он все еще не работает, выдавая те же ошибки, пробовал как с конструкторами, так и без конструкторов. - person Mohit Mishra; 18.05.2016

Ваш код - беспорядок. Форматирование плохое, и есть довольно много безудержных утечек памяти.

Каждый раз, когда вы вызываете одну из своих функций void, вы загружаете растровое изображение, но никогда не уничтожаете его с помощью al_destroy_bitmap. Это означает, что каждый раз происходит утечка целых ALLEGRO_BITMAP. В конце концов у вас закончится память, и он вернет NULL.

rlam правильно называет al_init_font_addon после al_init. Если вы используете шрифты ttf, вам также необходимо вызвать al_init_ttf_addon.

Еще следует опасаться глобальных объектов, которые загружают ресурсы аллегро в конструктор. Они будут загружены до вызова al_init, поэтому они не будут выполняться.

person BugSquasher    schedule 22.03.2019