Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

16.07.2012, 21:11

[Allegro, C++] Zugriffsverletzung bei create_bitmap

Hallo Community,

Ich habe seit einigen Tagen das Problem das meine Allegro Programme Zugriffsverletzungen bei
load_bitmap, create_bitmap, acquire_screen und release screen sowie bei blit(...) und draw_sprite(...) melden.

Ich arbeite mit Visual Studio 10 und Allegro 4.2

Der folgendende Codeausschnitt umfasst meine Initialisierung von allegro und dem aufruf des Fehlers bei create_bitmap.



main.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
#include <Windows.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine, int nCmdShow)
{
    alleg_main()
}




Allegro_main.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <allegro.h>

int alleg_main()
{


    allegro_init();



    if(install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL)) 
    {
        return 2;
        }

    if(install_timer())
    {
        return 3;
    }

    if(install_keyboard())
    {
        return 4;
    }

    if(install_mouse() == NULL)
    {
        return 5;
    }



    int cdepth[4] =  {32, 16, 15, 16};

    int modes[4]  =  {GFX_AUTODETECT_FULLSCREEN, 
                    GFX_AUTODETECT_FULLSCREEN, 
                      GFX_AUTODETECT_FULLSCREEN, 
                      GFX_AUTODETECT_WINDOWED   };


    for (int a = 0; a < 4; a++)
    {
        if(Windowed == true)
            a = 4;

        set_color_depth(cdepth[a]);

        if(set_gfx_mode(modes[a], 600, 400, 0, 0) == 0)
            return 0;

        if(a == 4)
            return 1;
    }




        BITMAP *bitmap;

    ->   bitmap = create_bitmap(screen->w,screen->h);

        clear_to_color(bitmap, makecol(255,0,0));

    if(bitmap == NULL)
        return 0;

    acquire_screen();

    blit(bitmap, screen,0,0,0,0,screen->w,screen->h);

    release_screen();

    return 0;
}


Die Funktionen sind natürlich über eine entsprechende .h datei verknüpft

Bei create_bitmap liefert das Programm dann eine

Unbehandelte Ausnahme bei 0x001d1d3f in Allegro.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000004.

Danke schonmal im voraus

lg. Ghexor

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

16.07.2012, 21:21

Vielleicht ist "screen" ja Null?
(dürfte der Fall sein, wenn die Initialisierung nicht klappt)

Dein gesamter Code sieht generell ziemlich seltsam aus.
Ich habe das Gefühl, dass du einige wichtige Konzepte, wie z.B. Arrays, noch nicht wirklich verinnerlicht hast (s.u.) und würde dir daher raten, erstmal ein paar einfachere Sachen zu machen als direkt mit Spielen loszulegen.

Warum prüfst du bei install_keyboard auf != 0 und bei install_mouse auf == 0?

Was ist das für eine komische for-Schleife?
Da macht die Hälfte der Anweisungen keinen Sinn und müsste eigentlich noch zu mehr Fehlern führen (zumindest im Fenstermodus, weil dann a=4 ist, das Array aber nur bis 3 geht).

Überhaupt würde ich heute keinem mehr Allegro empfehlen, wo es SDL und SFML gibt ...

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

3

16.07.2012, 22:21

Zitat

Überhaupt würde ich heute keinem mehr Allegro empfehlen, wo es SDL und SFML gibt ...

Erzähl mal wieso?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

4

16.07.2012, 23:16

Hallo David

Danke erstmal für die schnelle Antwort

bei den Arrays hatte ich vergessen das das erste Objekt ja mit Null aufgerufen werden muss

Das der Code ein bisschen komisch aussieht kommt daher, das ich die wichtigsten Ausschnitte aus dem Gesamten rauskopiert habe um die übersichtlichkeit zu wahren

zu allegro muss ich sagen dass ich mir neben c++ für spieleprogrammierer und deinem buch
(welches ich mir wohl zu früh geholt habe wie ich feststellen musste - bei matritzen hats dann bei mir aufgehört...)
noch spieleprogrammierung von lennard steinke gekauft habe, welcher in den beispielen allegro benutzt

Ich werde das mit den Initialisierungen nochmal überarbeiten... morgen

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Ghexor« (16.07.2012, 23:22)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

5

16.07.2012, 23:38


[...] spieleprogrammierung von lennard steinke gekauft habe, welcher in den beispielen allegro benutzt [...]


War auch mein erstes Buch, war großartig. :)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

17.07.2012, 10:17

Zitat

Überhaupt würde ich heute keinem mehr Allegro empfehlen, wo es SDL und SFML gibt ...

Erzähl mal wieso?

Weil es aus der "Steinzeit" kommt, wo es noch keine Hardwarebeschleunigung gab und demnach eine Menge Konstruktionen und Ballast mitbringt, den niemand mehr braucht.
Zweitens finde ich es design-technisch ziemlich mies, allein schon wegen der ganzen globalen Variablen.

Saik0

Treue Seele

Beiträge: 171

Beruf: Anwendungsentwickler

  • Private Nachricht senden

7

17.07.2012, 14:12

Ich arbeite mit Visual Studio 10 und Allegro 4.2

Ich würde dir empfehlen, dass du demnächst auf Allegro 5 umsteigen solltest. Die Api hat sich um einiges verändert und ist wesentlich komfortabler geworden.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

8

17.07.2012, 14:51

Ich arbeite mit Visual Studio 10 und Allegro 4.2

Ich würde dir empfehlen, dass du demnächst auf Allegro 5 umsteigen solltest. Die Api hat sich um einiges verändert und ist wesentlich komfortabler geworden.

Wenn er mit dem Buch lernt, sollte er vllt. erstmal bei 4.2 bleiben um den ganzen Sinn zu verstehen. Danach kann er leicht auf Version 5 umsteigen, jedenfalls leichter als mit dem Buch Version 4.2 beigebracht zu bekommen und dann immer frustrierend zu suchen, wie das in Allegro 5 geht.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Saik0

Treue Seele

Beiträge: 171

Beruf: Anwendungsentwickler

  • Private Nachricht senden

9

18.07.2012, 13:30

Wenn er mit dem Buch lernt, sollte er vllt. erstmal bei 4.2 bleiben um den ganzen Sinn zu verstehen.

Stimmt, er sollte es lieber so machen. Manchmal vergesse ich, dass das ne Sache der Programmiererfahrung ist. Das Buch ist jedenfalls sein Geld wert ^^

10

18.07.2012, 14:04

Nach meiner schrecklichen Erfahrung, würde ich von Allegro 5 abraten. Zumindest auf meinem Laptop wo anscheinend kein Hardwarerendering unterstützt wird hatte ich eine Framerate von 2(!) wo ich mit der SDL oder SFML eine um die 70 hatte (SDL schneidet hier besser ab als SFML). Also ne 2er Framerate, das sind zwei Bilder pro Sekunde bei einem geladenen Hintergrundbild 800 x 600. Wie gesagt das gilt für Allegro 5.

Werbeanzeige

Ähnliche Themen