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

06.02.2008, 15:52

Problem mit Iterator und Funktionsaufruf

Ja, ich muss schon wieder etwas fragen :(

Ich bekomme immer folgende Fehlermeldung: no matching function for call to `CPlayer::Init(std::_List_iterator<CJoystick>&)'

CPlayer besitzt aber eine Funktion Init(CJoystick Joystick)?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CGame::Init ()
{
    // Joysticks laden

    InitJoysticks();
    
    // Neuen Spieler initialisieren

    m_pPlayer = new CPlayer;
    // Spieler mit Joystick initialisieren, wenn vorhanden

    list<CJoystick>::iterator It = m_JoystickList.begin ();
    if(It != m_JoystickList.end())
        m_pPlayer->Init(It);     // <---- Hier is der Fehler

    else
        m_pPlayer->Init ();
    m_pPlayer->Reset ();
...


Hier noch ein Ausschnitt der Player.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
class CPlayer
{
    public:
        CPlayer(void);
        void Init   ();
        void Init   (CJoystick Joystick);
        void Quit   ();
        void Render ();
        void Update ();
        void Reset  ();
        list <CShot> *GetShotList () { return &m_ShotList; }


Ich hatte es schonmal ohne Fehler hinbekommen...mit Pointern, aber da hats mir beim starten des Spiels dann den Stack zerschossen :)
Daher versuche ich das ganze erst mal ohne übermäßigen Pointereinsatz (von der Idee sollte ja später ein Pointer pro initialisiertem Joystick reichen, die jeweils einem Spieler zugewiesen werden).

Hoffe ihr könnt mir helfen.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

06.02.2008, 16:06

Du hast vergessen den Iterator zu dereferenzieren.

C-/C++-Quelltext

1
m_pPlayer->Init(*It);
@D13_Dreinig

3

06.02.2008, 16:23

Doh!

So einfach kanns gehn

Leider zerknallts mir auch hier wieder den Stack nach dem Start

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Exception: STATUS_ACCESS_VIOLATION at eip=00403991
eax=00000178 ebx=00000000 ecx=00CB6B28 edx=00000000 esi=611021A0 edi=00413D80
ebp=0022CB68 esp=0022CB60 program=C:\Dokumente und Einstellungen\Marc\Eigene Dateien\Programmieren\C++\SDL Game\Debug\SDLGame.exe, pid 5496, thread main
cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023
Stack trace:
Frame     Function  Args
0022CB68  00403991  (00000000, 43BC0000, 44020000, 00402FAD)
0022CB88  00402EBF  (10062538, 00413D80, 0022CC68, 00403F15)
0022CB98  004021A3  (0022CC20, 00000320, 00000258, 00000010)
0022CC68  00403F15  (00000001, 10050168, 10050090, 77DADB0D)
0022CD98  61006198  (00000000, 0022CDD0, 61005510, 0022CDD0)
61005510  61004416  (0000009C, A02404C7, E8611021, FFFFFF48)
2093416 [main] SDLGame 5496 _cygtls::handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
2118052 [main] SDLGame 5496 _cygtls::handle_exceptions: Error while dumping state (probably corrupted stack)
aber das ist ein anderes Thema.

Danke

4

06.02.2008, 23:49

Copykonstrutkor implemetiert ? (für CJoystick?) Du kopierst da auf jedenfall dein Objekt einmal unnötig ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

5

07.02.2008, 11:50

Zitat von »"Deviloper"«

Copykonstrutkor implemetiert ? (für CJoystick?) Du kopierst da auf jedenfall dein Objekt einmal unnötig ...

Wieso unnötig kopiert? Einen Kopierkonstruktor habe ich nicht verwendet.

Dofter

Treue Seele

Beiträge: 159

Wohnort: im wunderbaren EBERMANNSTADT

Beruf: Schüler^^

  • Private Nachricht senden

6

07.02.2008, 12:18

void Init (CJoystick Joystick);
eine Frage dazu.
Wird in CPlayer der Joystik des Spielers gespeichert?
Falls ja, is es glaub ich der Fall, dass du dann nicht den "eigentlichen" Joystik speicherst, da ja in Methoden Kopien der Originale vervendet werden. also entweder doch Zeiger oder Referenzen.
"Wo kämen wir hin, wenn alle sagten, wo kämen wir hin, und keiner ginge,
um zu sehen, wohin wir kämen, wenn wir gingen"

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

07.02.2008, 12:21

C-/C++-Quelltext

1
void Init    (CJoystick Joystick); 


Hier wird eine Kopie von deinem übergebenen Objekt erzeugt. Beim verlassen der Funktion wird das Objekt zerstört (der Destruktor von Joystick aufgerufen). Hast du keinen Kopierkonstruktor so wird eine "flache" Kopie des Objekts erzeugt. Das heißt, die Zeiger werden kopiert, aber nicht der Speicher auf den gezeigt wird. Beim Zerstören der temporären Kopie wird der Speicher evtl freigegeben und dein Objekt verfügt nach dem Funktionsaufruf über ein paar Danglingpointer (d.h. Zeiger die auf einen ungültigen Speicherbereich zeigen).

Zum einen solltest du, mit einem Kopierkonstruktor, dafür sorgen das dein Objekt vollständig kopiert wird. Zum anderen kannst du die Übergabe durch eine konstante Referenz beschleunigen:

C-/C++-Quelltext

1
void Init ( const CJoystick& Joystick ); 
@D13_Dreinig

8

07.02.2008, 13:05

Also wenn ich den Kopierkonsttruktor so einsetze wie im Buch auf S. 369 beschrieben

C-/C++-Quelltext

1
2
3
4
5
6
7
/* Kopierkonstruktor
 */
CJoystick::CJoystick(const CJoystick &rhs)
{
    m_pJoystick = NULL; // <- Kein new, da es sich um ein SDL_Joystick-Struct handelt. Oder ist das falsch?

    *m_pJoystick = *(rhs.m_pJoystick); // <- Fehler

}// Kopierkonstruktor

erhalte ich die Fehlermeldung invalid use of undefined type `struct _SDL_Joystick'.

Mein CJoystick hält nichts weiter wie einen Pointer auf ein SDL_Joystick-Struct. Init und Quit dienen lediglich dem öffnen und dem schließen des Ports. Und bisher gabs auch keine Probleme bei der Nutzung des Joysticks, also der Pointer scheint nicht kaputt zu sein.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

07.02.2008, 18:00

Dein Code dereferenziert einen 0 Pointer. Was spricht deiner Meinung nach gegen struct + new?
@D13_Dreinig

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

10

07.02.2008, 18:41

Du rufst da auch keinen Kopierkonstruktor auf. Ich kenne zwar die betreffende Stelle im Buch nicht, aber ich würde mal davon ausgehen, dass eher sowas gemeint ist:

C-/C++-Quelltext

1
Klasse Objekt = Objekt2;


Der Kopierkonstruktor mithilfe von = wird nur aufgerufen, wenn das Objekt gerade neu erstellt wird, ansonsten handelt es sich um den Zuweisungsoperator =. Und das ist in deinem Fall, wie David angedeutet hat, nicht möglich, da du versuchst, einem nicht existenten Objekt ein anderes Objekt zuzuweisen.

Werbeanzeige