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

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)
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?

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

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. :)

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)
0

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

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

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

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?

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.

0

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

0

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

0

Hej, puściłem Twój program (w ostatniej wersji, z while zamiast goto :)) u mnie pod GCC, nie ma żadnych problemów, działa w nieskończoność. Jedyna zmiana to usunięcie linijki #include <windows.h> (bo u mnie Linux). Aczkolwiek i pod Windowsem ta linijka nie jest chyba potrzebna.

Wersje oprogramowania u mnie:
liballegro.so.5.0.10
gcc (Debian 4.9.2-10+deb8u1) 4.9.2

0

A debugowanie kodu w moim przypadku coś pomoże?

1
iks de napisał(a):

A debugowanie kodu w moim przypadku coś pomoże?

Nie zaszkodzi. :)

0

Jak próbuje debugować zmienną font8 to wszystko się zaczyna wieszać :D

0

Przykro mi, ja już nie mam pomysłu... :(

A sprawdzałeś w jakimś innym środowisku, systemie operacyjnym, komputerze...?

0

Nie, zaraz sprawdzę.

Jeszcze uruchomiłem bezpośrednio plik exe i to się ukazało czego nie było przy uruchamianiu tej gry w codeblocks:
http://wrzutka.zset.pl/di/XTX5/wyskac.png

Mogę jeszcze wysłać log allegro

0
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"); // Przed if z cout

W dock al_create_builtin_font(); widze coś takiego

Returns NULL on an error.
The font memory must be freed the same way as for any other font, using al_destroy_font(3).

Zrób tak


al_draw_bitmap (wall,0,0,0);
 if (!font8)
{
std::cout << "Nok";
} else
{
std::cout << "ok";
al_draw_textf(font8, al_map_rgb(255, 255, 0), 250, 250, 0, "HELLO"); 
}

Zobacz też jakimi ewentualnie errorami rzuca ta funkcja.

0

Przerobiłem kod na taki:

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

using namespace std;

int czas = 0;

int klik = 0;

int main() {
al_init();
al_init_image_addon();
al_init_font_addon();
al_init_ttf_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();

//ALLEGRO_FONT *font8 = al_load_ttf_font("courbd.ttf", 72,0);

al_set_window_title(okno, "TEST");

al_draw_bitmap (wall,0,0,0);

while (true) {

cout <<klik<<endl;

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

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

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

if (!font8) {
    cout <<"font8"<<endl;
    exit(0);
}else {
    cout << "ok";
    al_draw_textf(font8, al_map_rgb(255, 255, 0), 250, 250, 0, "HELLO");
}

cout <<"11111111111"<<endl;

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;
}

I nadal to samo umieszczam jeszcze tekst z kosoli:

0
ok11111111111
2222222222
3333333333
4444444444
55555555
1
ok11111111111
2222222222
3333333333
4444444444
55555555
2
ok11111111111
2222222222
3333333333
4444444444
55555555
3
ok11111111111
2222222222
3333333333
4444444444
55555555
4
ok11111111111
2222222222
3333333333
4444444444
55555555
5
ok11111111111
2222222222
3333333333
4444444444
55555555
6
ok11111111111
2222222222
3333333333
4444444444
55555555
7
ok
Process returned -1073741819 (0xC0000005)   execution time : 5.930 s
Press any key to continue.
0

https://www.easypaste.org/file/Z8bpVgOk/Nowy.folder.2.rar?lang=pl
Link do tej paczki.
Testowałem ten program na windows 7 i 10 ale wynik jest ten sam.

0

U mnie działa, zarówno na linuksie (testowałem z asan i ubsan) jak i windowsie z mingw. Może po prostu masz niekompatybilną wersję libki, czy coś?

0

Może po prostu masz niekompatybilną wersję libki, czy coś?

O właśnie o to miałem pytać, bo na lin działa. Skąd masz dll allegro? Sam budowałeś czy z neta pobierałeś coś? Zbuduj sam i wtedy dorzucaj.

https://wiki.allegro.cc/index.php?title=Building_Allegro_5.1_(rev_15032)_Windows_7

Aczkolwiek przyznam że najłątwiej będzie to robić na linuksie. Pobierzesz z repo allegro.

0

Ja mam wersje allegro 5.0.10.

Znalazłem allegro 5.2.4.0 którą najlepiej pobrać?

https://github.com/liballeg/allegro5/releases/5.2.4.0/

0

Tę zgodną z Twoim kompilatorem.

0

Nie wiem czy dobrą wybrałem więc wybrałem mingw

38.1 MB allegro-x86_64-w64-mingw32-gcc-7.2.0-posix-seh-static-5.2.4.1.zip

I jeszcze nie wiem czy dobrze ją dodałem do codeblocks bo po rozpakowaniu
pliki z bin wkleiłem do folderu bin codeblocksa i tak samo zrobiłem dla folderów include i lib

0

musisz wiedzieć jaką masz wersję mingw u siebie, i pobrać odpowiednią paczkę lub tak jak ci podesłałem(link do github) z źródeł samemu zbudować.

Albo postawić linuxa na maszynie wirtualnej czy jako drugi system i zainstalować z repo albo nawet samemu tam zbudować(cmake, make).

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