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

18.10.2013, 15:12

C++ | Verweis-Problem | LEICHT verwirrt ... :/

Guten Tag Community,

ich habe bereits das Buch "C++ für Spiele Programmierer" durchgearbeitet (einiges überflogen/nur gelesen).

Anbei findet ihr den gesamten Code und den Fehler:

main.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "Game.h"

Game* g_game = 0; //Das Objekt der Klasse Game

int main(int argc, char* argv[]) {
    g_game = new Game();

    g_game->init("Chapter 1", 100, 100, 640, 480, true);

    while(g_game->getRunning()) {
        g_game->handleEvents();
        g_game->update();
        g_game->render();
    }
    g_game->clean();

    return 0;
}


Game.h

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
#ifndef __Game__
#define __Game__

#include <SDL.h>

class Game {
public:
    Game();
    ~Game();

    bool init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen);
    void render();
    void update();
    void handleEvents();
    void clean();
    //void showError(const char* error_msg);

    bool getRunning() { return m_bRunning; }

private:
    SDL_Window* m_pWindow;
    SDL_Renderer* m_pRenderer;
    bool m_bRunning;
};

#endif /*defined(__Game__)*/


Game.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
75
76
77
#include "Game.h"

bool Game::init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen) {
    // attempt to initialize SDL
    if(SDL_Init(SDL_INIT_EVERYTHING) == 0) {
        //showError("SDL init success\n");

        // init the window
        int flags = 0; //SDL_WINDOW_...
        if(fullscreen) {
            flags = SDL_WINDOW_FULLSCREEN;
        }
        m_pWindow = SDL_CreateWindow(title, xpos, ypos, width, height, flags);

        if(m_pWindow != 0) { // window init success
            //showError("window creation success\n");

            m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, 0);
            if(m_pRenderer != 0) { // renderer init success
                //showError("renderer creation success\n");
                SDL_SetRenderDrawColor(m_pRenderer,255,255,255,255);
            } else {
                //showError("renderer init fail\n");
                return false; // renderer init fail
            }
        } else {
            //showError("window init fail\n");
            return false; // window init fail
        }
    } else {
        //showError("SDL init fail\n");
        return false; // SDL init fail
    }

    //showError("init success\n");
    m_bRunning = true; // everything inited successfully, start the main loop
    return true;
}

void Game::render() {
    SDL_RenderClear(m_pRenderer); // clear the renderer to the draw color
    SDL_RenderPresent(m_pRenderer); // draw to the screen
}

void Game::update() {}

void Game::handleEvents() {
    SDL_Event events;
    if(SDL_PollEvent(&events)) {
        switch (events.type) {
            case SDL_QUIT:
                m_bRunning = false;
            break;

            default:
            
            break;
        }
    }
}

void Game::clean() {
    //showError("cleaning game\n");
    SDL_DestroyWindow(m_pWindow);
    SDL_DestroyRenderer(m_pRenderer);
    SDL_Quit();
}

/*void Game::showError(const char* error_msg) {
    SDL_Window* errorWindow = SDL_CreateWindow(error_msg, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 200, 200, SDL_WINDOW_SHOWN);
    SDL_Renderer* errorRenderer = SDL_CreateRenderer(errorWindow, -1, 0);
    SDL_RenderClear(errorRenderer);
    SDL_RenderPresent(errorRenderer);
    SDL_DestroyWindow(errorWindow);
    SDL_DestroyRenderer(errorRenderer);
    SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, error_msg , SDL_GetError(), nullptr);
}*/


Errors:

(Link)


1. Die Warnung verstehe ich nur teilweise, bzw. weiß nicht wie ich dies lösen kann - ist vorerst auch unwichtig. (Werde ich sicher was im Internet zu finden)
2. Scheint als würde der Verweis nicht funktionieren. OK, aber wieso ? ?(
3. Ich vermute, dass dieser Fehler mit dem 2. zusammenhängt.

Kann mir Jemand n Tipp geben ?
Muss ja nicht direkt die Lösung sein (wäre natürlich auch schön). Ohne Erklärung werd ich beim nächsten Mal (, falls der Fehler nochmal auftreten sollte,) nicht selbst lösen können.

Hinzuzufügen ist, dass ich seit ca 5 Jahren programmiere, jedoch der totale C++-Noob bin.
Studiere Angewandte Informatik, etc blabla, nur damit Ihr wisst, dass ich nicht son Kneub bin, der auf Spiele-Programmierungs-Hype ist :whistling: .

Hoffe nur, dass der Fehler nicht zu einleuchten und einfach zu lösen ist, sonst komm ich mir später doch vor wie'n Kneub 8|

Danke schonmal für die Tipps, etc.

P.S.:
Total vergessen, zu erwähnen, dass ich den Code von einem Tutorial habe, deswegen die englischen Kommentare.
Ebenso seht ihr, dass ich versucht habe die SDL_Errors über eine Methode "auszulagern".
Zu erst dachte ich, dass dort der Fehler liegt.
Nach dem Auskommentieren ist der Fehler jedoch immernoch vorhanden.
MfG Ismoh

Zwischen Wichtigem und Unwichtigem zu unterscheiden, bildet das Geheimnis jeden Erfolgs. - Cyril Northcote Parkinson (1909-93), brit. Historiker u. Publizist

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

18.10.2013, 15:21

Das Problem ist, dass die SDL Library, die du da zu linken versuchst, wohl für eine statische Runtime Library gebaut wurde, während deine Anwendung die dynamische Runtime Library verwendet, oder umgekert. Eine Anwendung und alle von ihr (statisch) gelinkten Libraries müssen die selbe Runtime verwenden.

3

18.10.2013, 15:47

Das hilft mir leider noch nicht weiter.
Kannst du das etwas ausführen ?
MfG Ismoh

Zwischen Wichtigem und Unwichtigem zu unterscheiden, bildet das Geheimnis jeden Erfolgs. - Cyril Northcote Parkinson (1909-93), brit. Historiker u. Publizist

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

18.10.2013, 15:55

Welcher Teil ist dir genau unklar?

5

18.10.2013, 15:59

Wie finde ich heraus welcher Teil eine statische oder dynamische Runtime verwendet ?
Und wie kann ich dies ändern ?

Was ich mir nun Frage ist: Wieso klappt es bei dem Jenigen, der das Tutorial gemacht hat ?
MfG Ismoh

Zwischen Wichtigem und Unwichtigem zu unterscheiden, bildet das Geheimnis jeden Erfolgs. - Cyril Northcote Parkinson (1909-93), brit. Historiker u. Publizist

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

18.10.2013, 16:08

Wie finde ich heraus welcher Teil eine statische oder dynamische Runtime verwendet ?
Und wie kann ich dies ändern ?

In den Project Properties unter C/C++ > Code Generation > Runtime Library

Multi-threaded (Debug) DLL entspricht der dynamischen und Multi-threaded (Debug) der statischen Runtime Library. Standardmäßig sollte die dynamische Runtime verwendet werden.

Was ich mir nun Frage ist: Wieso klappt es bei dem Jenigen, der das Tutorial gemacht hat ?

Vermutlich, weil der eine passende Library verwendet hat... ;)

7

18.10.2013, 21:58

Ich bin nun jede Laufzeitbibliothek durchgegangen, jedoch tritt der Fehler immer noch auf.

Anbei die Möglichkeiten:

(Link)


Weißt du/ihr weiter ?
Quellcode soweit in Ordnung ?
MfG Ismoh

Zwischen Wichtigem und Unwichtigem zu unterscheiden, bildet das Geheimnis jeden Erfolgs. - Cyril Northcote Parkinson (1909-93), brit. Historiker u. Publizist

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

18.10.2013, 22:03

Dot hat deinen Screenshot wohl nicht richtig angeguckt.
Dein einziger Fehler ist, dass du den Konstruktor von CGame nicht definiert hast.
Den Destruktor übrigens auch nicht, aber du löschst dein Objekt gar nicht, darum kommt deswegen kein Fehler.

9

18.10.2013, 22:18

ok.

berichtige mich, bitte:

In Game.h steht der Funktionkopf vom Konstruktor und Dekonstruktor .?!
Und mir fehlt in Game.cpp der Funktionsrumpf .?!
d.h.:
Game.cpp

C-/C++-Quelltext

1
2
Game::Game() {}
Game::~Game() {}

muss hinzugefügt werden?!

Ist das soweit richtig ?


EDIT:
und ggf:

C-/C++-Quelltext

1
Game::Game() { init(); }

In main.cpp wird die Init-Funktion bereits aufgerufen, somit ist das Quatsch.

Danke für eure Hilfe. Es klappt nun alles :)
MfG Ismoh

Zwischen Wichtigem und Unwichtigem zu unterscheiden, bildet das Geheimnis jeden Erfolgs. - Cyril Northcote Parkinson (1909-93), brit. Historiker u. Publizist

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

18.10.2013, 22:56

Stimmt, sry, ich hab übersehen dass das ja nur eine Warnung war. Dennoch würde ich empfehlen, diese zu beheben... ;)

Werbeanzeige