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

28.01.2011, 21:57

Buch Listing 12.0 | Hilfe | Probleme mit Zeigern etc.

So meine lieben Leser/innen.

Ich hoffe ihr könnt mich gleich aufklären.
Ich bin gerade dabei das SDL Spiel zu programmieren und zack, schon habe ich Probleme mit Zeigern und anderen Sachen...
Das Thema bzw. Kapitel Zeiger und Referrenzen (kp ob richtig geschrieben) habe ich zig Mal gelesen und auch verstanden, aber ich finde es sinnlos an manchen Stellen, einen Zeiger ein zu setzen, ich sehe auch keinen Zweck dafür.
Wie in diesem Beispiel:

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

#include "Framework.hpp"

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

    void Load       (const string sFilename);
    void Load       (const string sFilename, int NumFrames,
                    int FrameWidth, int FrameHeight);
    void SetColorKey (int R, int G, int B);
    void SetPos     (float fXPos, float fYPos);
    void Render     ();
    void Render     (float fFrameNumber);
    SDL_Rect GetRect () {return m_Rect;}

  private:
    SDL_Surface *m_pScreen; // Zeiger auf den Screen des Frameworks
    SDL_Surface *m_pImage;  // Das eigentliche Bild des Sprites
    SDL_Rect m_Rect;        // Rect des Sprites
    SDL_Rect m_FrameRect;   // Ausschnitt für Animationsphase
    int m_NumFrames;        // Anzahl der Animationsphasen
    int m_FrameWidth;       // Breite einer Animationsphase
    int m_FrameHeight;      // Höhe einer Animationsphase
    int m_NumFramesX;       // Wie viele Anim-Phasen in X-Richtung?

};

#endif


SDL_Surface *m_pScreen; // Zeiger auf den Screen des Frameworks
SDL_Surface *m_pImage; // Das eigentliche Bild des Sprites

Warum setzt man hier Zeiger an?

Bitte spart euch Kommentare wie "Steht doch alles im BUCH".
Only God can judge me.

2

28.01.2011, 22:44

Hallo denniro.
(...) zig Mal gelesen und auch verstanden, aber ich finde es sinnlos an manchen Stellen, einen Zeiger ein zu setzen (...)
Hm, bist du dir denn dann sicher, dass du Zeiger und Referenzen wirklich verstanden hast?! Aber ich gebe zu, der Sinn ist gerade hier häufig erst zu erkennen, wenn man selbst mit ihnen gearbeitet hat.

Bei der Sprite-Klasse hier musst du mit Zeigern arbeiten:

Bei m_pScreen handelt es sich nämlich um den Zeiger der auf deinen Screen, auf den du ja rendern (also zeichnen) willst, zeigt. In diesem Fall handelt es sich zudem noch um ein Singleton, dieses Objekt (der Screen) gibt es also nur einmal - was ja auch irgendwo Sinn macht. Du kannst also nicht für jedes Sprite einen neuen Screen anlegen, du würdest ja immer wo anderst hin zeichnen, statt immer auf den selben Screen.

Bei m_pImage handelt es sich auch um einen Zeiger, weil die Funktion SDL_LoadBMP() die ja deine Grafik lädt nichts anderes als einen Zeiger auf diese Grafik zurückgibt.

Gruß
SaRu_

3

28.01.2011, 23:51

Hmm.. ok lese mir das Kapitel noch 3 Mal durch.
So Zeiger anzuwenden verstehe ich, aber die Zeilen, welche du mir gerade erklärt hast, diese sind für mich sehr schwer zu verstehen
Vielen Dank ;)
Only God can judge me.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

29.01.2011, 00:11

es bringt nichts wenn du die gleiche erklärung 3 mal liest. schreib einfach eine kleine konsolenanwendung bei der dir die zeiger etwas bringen(z.b. beim übergeben an methoden oder klassen)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

5

29.01.2011, 11:21

Habe gestern aus Langeweile etwas Kleines programmiert:

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <iostream>
#include <string>

using namespace std;

class CAuto
{
public:
    string m_sName;
    int m_Tires;
    int m_Seats;
    int m_Speed;
    bool m_bHeated_Seats;
    bool m_bNavigation;
    bool m_bRadio;
    bool m_bPhone;
    int m_Spare_Tires;

    void Drive(CAuto *pExample)
    {
        cout << 0 << " KM/H" << endl;
        for(int i = 0; i < pExample->m_Speed;i++){ cout << i << " KM/H" << endl;}
        
    }

        void Stop(CAuto *pExample)
    {
        cout << pExample->m_Speed << " KM/H" << endl;
        for(int i = pExample->m_Speed; i!= 0;i--){ cout << i << " KM/H" << endl;}
        
    }

    void ShowDetails(CAuto *pExample)
    {
    cout << "Name: " << pExample->m_sName << endl;

    cout << "Tires: " << pExample->m_Tires << endl;

    cout << "Seats: " << pExample->m_Seats << endl;

    cout << "Speed: " << pExample->m_Speed << " KM/H" << endl;

    if(pExample->m_bHeated_Seats == true)
    {cout << "Heated Seats: " << "enable" << endl;}
    else
    {cout << "Heated Seats: " << "not enable" << endl;}

    if(pExample->m_bNavigation == true)
    {cout << "Navigation: " << "enable" << endl;}
    else
    {cout << "Navigation: " << "not enable" << endl;}

    if(pExample->m_bRadio == true)
    {cout << "Radio: " << "enable" << endl;}
    else
    {cout << "Radio: " << "not enable" << endl;}

    if(pExample->m_bPhone == true)
    {cout << "Phone: " << "enable" << endl;}
    else
    {cout << "Phone: " << "not enable" << endl;}

    if(pExample->m_Spare_Tires == true)
    {cout << "Spare Tires: " << "enable" << endl;}
    else
    {cout << "Spare Tires: " << "not enable" << endl;}
    };


};

int main()
{
CAuto Car;
CAuto *pCar = &Car;

pCar->m_sName = "Mercedes E220";
pCar->m_Tires = 4;
pCar->m_Seats = 4;
pCar->m_Speed = 260;
pCar->m_bHeated_Seats = true;
pCar->m_bNavigation = true;
pCar->m_bRadio = true;
pCar->m_bPhone = true;
pCar->m_Spare_Tires = false;

pCar->ShowDetails(pCar);
//pCar->Drive(pCar);
//pCar->Stop(pCar);
system("pause");
};


Ein Auto wird erstellt, dabei wird angegeben, welche Eigenschaften es hat etc.
Am Ende gibt es die Funktion ShowDetails() wieder.
Only God can judge me.

6

29.01.2011, 11:28

Wobei es sich hier anbieten würde, bei der Funktion ShowDetails(), eine konstante Referenz, statt einem Zeiger zu übergeben. Auch wenn beides natürlich funktioniert. Wann Referenz und wann Zeiger, dazu findest du auch einen kleinen zusammenfassenden Abschnitt im Buch auf Seite 174.

Außerdem noch etwas wichtiges: Wenn du ein Objekt auf dem Heap anlegst (also das Schlüsselwort new benutzt) dann musst du dieses Objekt auch wieder freigeben. Am Besten sobald zu es nicht mehr brauchst, spätestens wenn das Programm beendet wird. Also solltest du diese Zeil noch am Ende zu deinem Quellcode hinzufügen:

C-/C++-Quelltext

1
delete(pCar);


Weniger wichtige Hinweise: system("Pause"); ist nicht plattformunabhänig und so weiter... kurz: man benutzt es nicht. Statt dessen könntest du ein std::cin.ignore(); an dessen Stelle setzen. Außerdem hast du ein return vergessen. Das ist bei der main-Funktion, als einzige Ausnahme, nicht so schlimm... das macht der Compiler in diesem Fall von alleine. Du solltest es dir allerdings angewöhnen, bei allen anderen Funktionen mit Rückgabewert musst du es selbst hinzufügen. Außerdem kannst du bei der Main-Funktion so auch bestimmen, wann und vor allem mit welchem Rückgabewert dein Programm beendet werden soll.

Gruß
SaRu_

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »SaRu« (29.01.2011, 11:33)


7

29.01.2011, 11:40

Danke für die schnelle Antwort!
Also für das Ende so eine Reihenfolge:

C-/C++-Quelltext

1
2
3
std::cin.ignore();
return 0;
delete(pCar);

???

Das mit der konstanten Referrenz lese ich nochmal ;)
Only God can judge me.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

8

29.01.2011, 12:02

Das delete sollte vor das return. Sonst wird es nämlich nicht ausgeführt.

9

29.01.2011, 12:22

Achso ok vielen Dank ;)
Only God can judge me.

10

29.01.2011, 12:32

Ehm eine Frage habe ich noch dazu:

Zitat

Wobei es sich hier anbieten würde, bei der Funktion ShowDetails(), eine konstante Referenz, statt einem Zeiger zu übergeben. Auch wenn beides natürlich funktioniert. Wann Referenz und wann Zeiger, dazu findest du auch einen kleinen zusammenfassenden Abschnitt im Buch auf Seite 174.

Im Buch steht das man Referenzen sofort initialisieren muss, auf was soll ich sie denn dann initialisieren?
Eine neue Variable erstellen oder wie xD ??
Only God can judge me.

Werbeanzeige