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

Typ

Frischling

  • »Typ« ist der Autor dieses Themas
  • Private Nachricht senden

1

24.02.2016, 18:09

Selbstgeschriebenes SDL Programm stürzt immer ab

Hallo, ich habe ein Programm geschrieben, bei dem, wenn man aufs 'X' drückt, um das Fenster zu schließen, ein weiteres Fenster geöffnet werden soll. Ich habe eine Klasse, die sich um das Rendern der Texturen kümmert, eine main-Methode, die sich um die Hauptfunktionen des Programms kümmert, also auf Benutzereingaben reagiert, und eine Klasse namens CWindow, die die einzelnen Fenster verwalten soll, also neue Fenster erstellen usw.
Wenn ich jetzt das Programm starte, wird das erste Fenster ganz normal angezeigt. Wenn ich dann aufs 'x' drücke öffnet sich wie gewünscht ein weiteres Fenster. Jetzt will ich eigentlich, dass sich wieder ein weiteres Fenster öffnet, wenn ich aufs 'X' von einem der beiden Fenster drücke. Es tut sich dann allerdings gar nichts.
Der Code für CWindow und Main folgt:

Die Klasse CWindow:

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
#include <SDL2\SDL.h>
#include "Window.hpp"
#include "Texture.h"

#include <string>
#include <iostream>
#include <cstdlib>
#include <time.h>

// KONSTRUKTOR
CWindow::CWindow(std::string file)
{
    // SDL initialisieren //
    SDL_Init(SDL_INIT_EVERYTHING)
    atexit(SDL_Quit);

        // Fenster erstellen
    SDL_Window* window = SDL_CreateWindow("Bastard Popup", 20, 30, 1300, 700, SDL_WINDOW_SHOWN);
    
        // Renderer initialisieren
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    
    // Startbildschirm anzeigen
    Draw(renderer, file);
}

// Überprüfen, ob 'X' gedrückt wurde, also ob der User das Fenster schließen will
bool CWindow::xWurdeGedrueckt()
{
    if (SDL_PollEvent(&event))
    {
        if (event.type == SDL_QUIT)
        {
            return true;
        }
        return false;
    }
    return false;
}


Und die Main-Methode:

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
#include "Texture.h"
#include "Window.hpp"

#include <iostream>
#include <SDL2\SDL.h>

#undef main


int main()
{
    // VARIABLEN
    int actualNumber = 1;                   // Aktuelle Anzahl an Fenstern
    const int FensterMax = 5;       // Maximal Anzahl an Fenstern

    //Neuen Speicher für Fenster reservieren 
    CWindow *Fenster[FensterMax];

    // Neues Fenster anlegen (Startfenster)
    Fenster[0] = new CWindow("Anfang.bmp");

    bool running = true;

    while (running)
    {
                 for(int i = 0; i < actualNumber; i++)
                 {
                  if (Fenster[i]->xWurdeGedrueckt())   // Wenn 'X' im Fenster gedrueckt wurde
                  {
                        Fenster[actualNumber] = new CWindow("Slogan.bmp"); // Neues Fenster öffnen
                  }
                 }
    }
}


Ich glaube, dass der Fehler eigentlich ganz offensichtlich ist, aber ich find ihn einfach nicht. Ich wäre wirklich sehr dankbar, wenn mir jemand dabei helfen könnte.

Mfg
Typ

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

2

24.02.2016, 18:42

Ich wuerde actualNumber auch erhoehen wenn du ein neues Fenster erstellst ;)

Typ

Frischling

  • »Typ« ist der Autor dieses Themas
  • Private Nachricht senden

3

24.02.2016, 19:22

Hab ich, ich habs nur anscheinend irgendwie hier aus versehen rausgelöscht. Das Programm funktioniert trotzdem nicht.
Inzwischen hab ich herausgefunden, dass das irgendwie an der Erstellung des neuen Fensters liegen muss, denn wenn ich statt das neue Fenster zu erstellen einfach in der Konsole einen Text ausgebe, sobald man aufs X drückt, funktioniert das!

Trotzdem danke fuer deine Antwort!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

24.02.2016, 19:30

Die ersten beiden Zeilen in diesem Fenster-Konstruktor machen mir schon irgendwie Sorgen...
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Typ

Frischling

  • »Typ« ist der Autor dieses Themas
  • Private Nachricht senden

5

24.02.2016, 19:46

BlueCobold, Wieso? atexit(SDL_QUIT) kann ich eigentlich wirklich weglassen, da dass ja nur benutzt wird, wenn ich das Fenster schließe, was ja nicht passieren soll.

Wie würdest du die SDL initialisieren? Bisher hatte ich damit eigentlich keine Probleme.

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

6

24.02.2016, 19:48

Das Problem ist, dass du dies fuer jedes Fenster machst. Du solltest SDL_Init nur ein mal aufrufen und dann mehrfach SDL_CreateWindow

Typ

Frischling

  • »Typ« ist der Autor dieses Themas
  • Private Nachricht senden

7

24.02.2016, 19:55

Stimmt Danke,
hilft aber leider immer noch nicht ;( :cursing:

Ich glaube das Programm bleibt irgendwie in Zeile 30 der main Methode hängen, bzw. dann irgendwo im Konstruktor von CWindow. Weil das Programm reagiert ganz normal darauf, wenn ich eine Ausgabe in der Konsole mach, sobald ich aber wieder ein neues Fenster erstellen lass, bleibt das Programm wieder stecken.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

24.02.2016, 21:58

Debugger nutzen. F9, F5, F10, F11
Und dann weißt Du, wo es Probleme gibt. Das Warum musst Du Dir dann überlegen.
Nach meinem Verständnis sind die von mir genannten Stellen aber problematisch. Du schließt das Fenster ja. Du verhinderst das ja nicht, du öffnest nur ein neues Fenster.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

24.02.2016, 22:44

Es wundert mich, dass das überhaupt kompiliert wird, denn in Zeile 14 fehlt das Semikolon ...

Typ

Frischling

  • »Typ« ist der Autor dieses Themas
  • Private Nachricht senden

10

25.02.2016, 17:23

Hallo,
ja stimmt, aber wie gesagt, kann sein, dass ich es aus versehen weggelöscht habe, beim echten Code ist es vorhanden.

@BlueCobold: Ich hätte bisher immer gedacht, dass das 'X' auch nur ein Button ist, der normalerweise eben die Funktion hat, das Fenster zu schließen... Da dass anscheinend nicht so ist, wie kann ich mein Vorhaben dann realisieren?

Danke an euch
Typ

Werbeanzeige