Wyświetlanie tekstu za pomocą allegro – program się wysypuje

Odpowiedz Nowy wątek
2018-04-24 21:45

Rejestracja: 3 lata temu

Ostatnio: 4 dni temu

0

Witam niedawno zacząłem się uczyć bibliotekę allegro 5 i mam problem z wyświetleniem tekstu:

#include <iostream>
#include <windows.h>
#include <time.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_image.h>

using namespace std;

int czas = 0;

int main() {
al_init();
al_init_image_addon();
al_init_font_addon();

ALLEGRO_DISPLAY * okno = al_create_display(500, 500);

ALLEGRO_BITMAP * wall = al_load_bitmap("media/wall.png");

ALLEGRO_BITMAP * balon = al_load_bitmap("media/balloon.png");

ALLEGRO_FONT *font8 = al_create_builtin_font();

al_set_window_title(okno, "TEST");

return1:

al_draw_bitmap (wall,0,0,0);

al_draw_textf(font8, al_map_rgb(255, 255, 0), 250, 250, 0, "HELLO");

al_flip_display();

czas++;

if (czas >= 500) {
    al_draw_bitmap (balon,0,0,0);
    al_flip_display();
    czas = 2500;
    while (czas > 0) {
        czas--;
    }
}

goto return1;

}

Po uruchomieniu kodu, program od razu się wysypuje, a jeżeli usunę linijkę :

al_draw_textf(font8, al_map_rgb(255, 255, 0), 250, 250, 0, "HELLO");

To program działa poprawnie. Wiecie co robię źle i jak to naprawić?

Dokładny błąd to:

Process returned -1073741819 (0xC0000005)
edytowany 4x, ostatnio: furious programming, 2018-04-24 21:58

Pozostało 580 znaków

kq
2018-04-24 21:52
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 5 godzin temu

Lokalizacja: Szczecin

2

0xC0000005 to naruszenie dostępu, pewnie gdzieś masz zapis do błędnego adresu lub odczyt z takiego.

Sprawdź czy font8 nie jest nullem.

Btw, wtf z tym goto? Czemu nie użyjesz pętli?


Pozostało 580 znaków

2018-04-24 21:55

Rejestracja: 3 lata temu

Ostatnio: 4 dni temu

0

W taki sposób? Bo wywala to samo co wcześniej?

if (font8 != NULL) {

    al_draw_textf(font8, al_map_rgb(255, 255, 0), 250, 250, 0, "HELLO");

}

Ja używam goto z przyzwyczajenia

edytowany 1x, ostatnio: iks de, 2018-04-24 21:58

Pozostało 580 znaków

2018-04-24 22:26

Rejestracja: 3 lata temu

Ostatnio: 3 tygodnie temu

3

Z naruszeniem ochrony pamięci jest tak, że nie musi być związane jego występowanie bezpośrednio z linijką, której usunięcie powoduje zniknięcie błędu...
https://pl.wikipedia.org/wiki/Heisenbug
Może więc być gdzieś indziej, wcześniej -- wszystko tam robisz dobrze...?

PS. goto to słabe przyzwyczajenie. :)

Pozostało 580 znaków

2018-04-24 22:48

Rejestracja: 3 lata temu

Ostatnio: 4 dni temu

0

Chyba dobrze robię ale będę jeszcze szukał i próbował rozwiązać ten problem.

Zrobiłem taki kod:

#include <iostream>
#include <windows.h>
#include <time.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_image.h>

using namespace std;

int czas = 0;

int klik = 0;

int main() {
al_init();
al_init_image_addon();
al_init_font_addon();

ALLEGRO_DISPLAY * okno = al_create_display(500, 500);

ALLEGRO_BITMAP * wall = al_load_bitmap("media/wall.png");

ALLEGRO_BITMAP * balon = al_load_bitmap("media/balloon.png");

ALLEGRO_FONT *font8 = al_create_builtin_font();

al_set_window_title(okno, "TEST");

//al_draw_bitmap (wall,0,0,0);

while (true) {

cout <<klik<<endl;

if (okno == NULL) {
    cout <<"okno"<<endl;
    exit(0);
}

if (balon == NULL) {
    cout <<"balon"<<endl;
    exit(0);
}

if (wall == NULL) {
    cout <<"wall"<<endl;
    exit(0);
}

if (font8 == NULL) {
    cout <<"font8"<<endl;
    exit(0);
}

cout <<"11111111111"<<endl;

al_draw_textf(font8, al_map_rgb(255, 255, 0), 250, 250, 0, "HELLO");

cout <<"2222222222"<<endl;

al_flip_display();

cout <<"3333333333"<<endl;
czas++;
klik++;

cout <<"4444444444"<<endl;
if (czas >= 500) {
    al_draw_bitmap (balon,0,0,0);
    al_flip_display();
    czas = 2500;
    while (czas > 0) {
        czas--;
    }
}
cout <<"55555555"<<endl;

}

cout <<"6666666666"<<endl;
}

A rezultat jest taki ze program się wysypał na tej linijce gdzie wyświetla się tekst.

0
11111111111
2222222222
3333333333
4444444444
55555555
1
11111111111
2222222222
3333333333
4444444444
55555555
2
11111111111
2222222222
3333333333
4444444444
55555555
3
11111111111
2222222222
3333333333
4444444444
55555555
4
11111111111
2222222222
3333333333
4444444444
55555555
5
11111111111
2222222222
3333333333
4444444444
55555555
6
11111111111
2222222222
3333333333
4444444444
55555555
7
11111111111

Process returned -1073741819 (0xC0000005)
edytowany 1x, ostatnio: iks de, 2018-04-24 22:55

Pozostało 580 znaków

2018-04-24 23:01

Rejestracja: 3 lata temu

Ostatnio: 3 tygodnie temu

0

A co, gdy zamiast al_create_builtin_font załadujesz font z pliku?

PS. Ale wysypał się dopiero po siedmiu obrotach pętli?

edytowany 1x, ostatnio: koszalek-opalek, 2018-04-24 23:03

Pozostało 580 znaków

2018-04-24 23:09

Rejestracja: 3 lata temu

Ostatnio: 4 dni temu

0

A jak to zrobić bo niedawno zacząłem przygodę z allegro.

Z użyciem tej funkcji? `al_load_font``

Wysypał się po 7 obrocie

edytowany 1x, ostatnio: iks de, 2018-04-24 23:09

Pozostało 580 znaków

2018-04-24 23:14

Rejestracja: 3 lata temu

Ostatnio: 3 tygodnie temu

0

Coś takiego na przykład: ALLEGRO_FONT *font = al_load_ttf_font("times.ttf", 72,0) -- ale skoro się wywala po 7. obrocie, to chyba patrz mój pierwszy post -- problem leży gdzie indziej...
PS. Zawsze to po 7. obrocie pętli?

Pozostało 580 znaków

2018-04-24 23:18

Rejestracja: 3 lata temu

Ostatnio: 4 dni temu

0

Zrobiłem tak jak napisałeś z użyciem tej czcionki i wywaliło identycznie to samo co wcześniej.
Zawsze wywala po 7 obrocie pętli.

Pozostało 580 znaków

kq
2018-04-24 23:31
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 5 godzin temu

Lokalizacja: Szczecin

0

Nie znam allegro, ale nie powinieneś tam gdzieś al_set_target_bitmap wywołać przed rysowaniem?


Pozostało 580 znaków

2018-04-25 07:32

Rejestracja: 3 lata temu

Ostatnio: 4 dni temu

0

W żadnym przykładowym projekcie z allegro nie ma użytej funkcji al_set_target_bitmap

Pozostało 580 znaków

Odpowiedz

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