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

Paulm

Frischling

  • »Paulm« ist der Autor dieses Themas

Beiträge: 69

Wohnort: Baden-Württemberg

Beruf: Schüler

  • Private Nachricht senden

1

11.02.2015, 18:23

SDL | SDL_Renderer rendert nicht sobald Initialisierung in externe Funktion ausgelagert

Hallo,

Ich versuche nun schon eine Weile mithilfe von SDL einfache Geometrische Objekte zu rendern.
Solange der komplette Code in einer Main.cpp ist läuft alles ohne Probleme, doch sobald ich mir eine eigene Initialisierungsfunktion schreibe um den Renderer und das Window zu Initialisieren funktioniert es nicht mehr.

Hier mein Quelltext:

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
#include "Init.h"

int main(int argc, char *argv[])
{
    SDL_Window *window = NULL;
    SDL_Renderer *renderer = NULL;

    if (b_Init(window, renderer) == false)
    {
        std::cout << "Initialisation Error" << std::endl;
    }

    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
    SDL_RenderClear(renderer);
    SDL_RenderPresent(renderer);
    SDL_Delay(5000);

    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}


Init.h

C-/C++-Quelltext

1
2
3
4
5
#include <SDL.h>
#include <iostream>

//Initializes SDL
bool b_Init(SDL_Window*, SDL_Rendere


Init.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
#include "Init.h"

bool b_Init(SDL_Window *window, SDL_Renderer *renderer)
{
    bool success = true;

    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        std::cout << "Video Initialisation Error: " << SDL_GetError() << std::endl;
        success = false;
    }
    else
    {
        window = SDL_CreateWindow("SDL_Project", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_SHOWN);
        if (window == NULL)
        {
            std::cout << "Window Creation Error: " << SDL_GetError() << std::endl;
            success = false;
        }
        else
        {
            renderer = SDL_CreateRenderer(window, 0, SDL_RENDERER_ACCELERATED);
        }
    }
    return success;
}



Da das Initialiseren an sich ohne Fehler abläuft verstehe ich nicht wieso es dem Renderer nicht möglich ist die Grafik anzuzeigen.

Gruß Paul

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Paulm« (11.02.2015, 18:46)


2

11.02.2015, 18:34

Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

3

11.02.2015, 18:35

Irgendwas an deiner Init Funktion und deren Aufruf sieht sehr komisch aus. :P Hast du da was vergessen?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Paulm

Frischling

  • »Paulm« ist der Autor dieses Themas

Beiträge: 69

Wohnort: Baden-Württemberg

Beruf: Schüler

  • Private Nachricht senden

4

11.02.2015, 18:45


Da es sich um ein anderes Problem handelt dachte ich ein neuer Thread wäre angebracht :/

Irgendwas an deiner Init Funktion und deren Aufruf sieht sehr komisch aus. :P Hast du da was vergessen?

Ja das tut mir Leid aber auch wenn ich sie mit b_Init(window, renderer) aufrufe passiert nichts ...

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

5

11.02.2015, 19:02

Versuch es mal mit Zeigern auf Zeigern. ;)
Ansonsten mach es wie im LazyFoo Tutorial.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Paulm

Frischling

  • »Paulm« ist der Autor dieses Themas

Beiträge: 69

Wohnort: Baden-Württemberg

Beruf: Schüler

  • Private Nachricht senden

6

11.02.2015, 19:11

Mit den vorgeschlagenen Zeigern auf Zeigern geht es :)
Ich werde mich trotzdem nochmal auf den Lazyfoo-Seiten umsehn

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

7

11.02.2015, 19:12

Er benutzt globale Zeiger, was nicht so schön ist. Viel wichtiger ist, das du verstehst, warum das nun funktioniert. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Paulm

Frischling

  • »Paulm« ist der Autor dieses Themas

Beiträge: 69

Wohnort: Baden-Württemberg

Beruf: Schüler

  • Private Nachricht senden

8

11.02.2015, 19:19

Ja Ich würde auch lieber bei globalen variablen bleiben.
Es ist mir nicht ganz klar da ich vorher ja eigentlich eine Adresse übergeben habe auf der in Init ein Renderer erzeugt wurde...
Doch vielleicht liegt es daran dass der Renderer so nur mit dem Pointer in der Funktion identifiziert wird, da dieser ja eine andere Adresse wie der in meiner main funktion hat.
Und nun übergebe ich einfach die Adresse meines Zeigers von main so dass der Renderer auch an dieser Adresse erzeugt wird.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

9

11.02.2015, 19:51

Geht schon in die richtige Richtung. :) Du kannst das ganze ja mal in einem minimalen Beispiel mit einem null Zeiger und einem bereits initialisierten durchspielen und dir im Debugger auch mal die Adressen anschauen. Das wird es sehr schnell klar. Und von globalen Variablen würde ich persönlich abraten. ;)
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

10

11.02.2015, 20:20

Ich würde eher Referenzen auf Zeiger nehmen statt Zeiger auf Zeiger.

Werbeanzeige