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

11

27.08.2010, 18:37

Hallo,

man gibt auch beim Zuweisungsoperator einen this-Zeiger zurück um somit verkettete Zuweisungen zu ermöglichen.

Also zum Beipsiel:

C-/C++-Quelltext

1
2
// Verkettete Zuweisung
Klasse1 = Klasse2 = Klasse3;



Wenn du einen solchen Funktionsaufruft im Zuweisungsoperator hast, dann solltest du die Referenz ohne const übergeben.

Gruß
SaRu_

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »SaRu« (27.08.2010, 18:48)


12

27.08.2010, 19:02

Hey,

hab das const jz weggelassen und ich kann es kompilieren.
Wieso es ohne const sein muss verstehe ich aber nicht.
Ich ändere den Wert, der übergeben wird, ja nicht ... ich ändere nur den Wert, der links vom "=" steht, also die Instanz, aus der ich den Operator aufrufe?

Naja, jedenfalls behebt das mein eigendliches Problem mit der Zugriffsverletzung immer noch nicht.
Ich kriege immer noch eine Zugriffsverletzung beim setzte des Colour - Keys :(
(Siehe meinen erster Post)

Gruß,
Ombalat

13

27.08.2010, 19:31

Hey,

die SDL Wiki verrät dir über den Rückgabewert der Funktion SDL_SetColorKey() folgendes: "Returns 0 on success, or -1 if the surface is not valid; call SDL_GetError() for more information."
Bitte mach das auch mal.

C-/C++-Quelltext

1
2
3
4
5
6
// Funktionsaufruf ggf. mit Fehlermeldung
if(pSpriteIntro_Text->SetColorKey(205, 179, 139) < 0)
{
    // Fehlermeldung
    cout << "Fehler: " << SDL_GetError() << endl;
}



Das solltest du versuchen nach Möglichkeit immer zu machen.

Im Übrigen heißt die Funktion SDL_SetColorKey() und nicht SDL_SetColourKey(). Kein britisches Englisch. ;)

Gruß
SaRu_

14

27.08.2010, 20:27

Hallo noch mal,

Hey,

die SDL Wiki verrät dir über den Rückgabewert der Funktion SDL_SetColorKey() folgendes: "Returns 0 on success, or -1 if the surface is not valid; call SDL_GetError() for more information."
Bitte mach das auch mal.

C-/C++-Quelltext

1
2
3
4
5
6
// Funktionsaufruf ggf. mit Fehlermeldung
if(pSpriteIntro_Text->SetColorKey(205, 179, 139) < 0)
{
    // Fehlermeldung
    cout << "Fehler: " << SDL_GetError() << endl;
}



Das solltest du versuchen nach Möglichkeit immer zu machen.

Im Übrigen heißt die Funktion SDL_SetColorKey() und nicht SDL_SetColourKey(). Kein britisches Englisch. ;)

Gruß
SaRu_


Hab ich schon gemacht - Bekomme aber keine Fehlermeldung, es passiert einfach gar nix, ausser eben die Zugriffsverletzung

C-/C++-Quelltext

1
2
3
4
5
6
//Funktion zum definieren des Colour - Keys
void CSprite::SetColourKey(int R, int G, int B)
{
    if(SDL_SetColorKey(m_pImage,SDL_SRCCOLORKEY,SDL_MapRGB(m_pImage->format,R,G,B)) < 0)
        cout << "Fehler beim setzten des Colour - Keys!\nFehler: " << SDL_GetError() << endl;
}


PS: Das mit Colour ist in der Funktion von mir ;)
Der tatsächliche Aufruf stimmt schon


Liebe Grüße
Ombalat

15

27.08.2010, 20:45

Das mit Colour ist in der Funktion von mir ;)
Das dacht ich mir schon, hab nur vorsichtshalber das erwähnt, nich das du versehentlich die SDL Funktion auch so geschrieben hast. Aber dann würde ja der Kompiler meckern.... naja egal!

Also deine SetColourKey Funktion ist in Ordnung - wobei du das wahrscheinlich schon selbst wusstest. ^^

Kannst du mal den Funktionsaufruf direkt nach dem anlegen des Objekts tätigen?

C-/C++-Quelltext

1
2
CSprite *pSpriteIntro_Text = new CSprite; 
         pSpriteIntro_Text -> SetColourKey(205,179,139);



Gruß
SaRu_

16

27.08.2010, 22:12

Guten Abend,


Kannst du mal den Funktionsaufruf direkt nach dem anlegen des Objekts tätigen?

C-/C++-Quelltext

1
2
    CSprite *pSpriteIntro_Text = new CSprite; 
         pSpriteIntro_Text -> SetColourKey(205,179,139);



ja, das kann ich ...
Wenn ich die Funktion Weg lasse und die Datei direkt lade (und in dem fall ohne auswahl nach einer ID, was aber kein problem darstellen sollte), funktioniert es einwandfrei:

C-/C++-Quelltext

1
2
3
4
   CSprite *pSpriteIntro_Text = new CSprite;       
   //pSpriteIntro_Text = LoadStorry(ID_Storry); //Storry Datei laden
    pSpriteIntro_Text -> Load("Data/Emphasis/Storry/Storry_2.Emphasis");
    pSpriteIntro_Text -> SetColourKey(205,179,139);


Da bekomme ich dann auch kein Problem wegen einer Zugriffsverletzung beim setzten des Colo(u)r - Keys

Schönen Abend,
Ombalat

EDIT:
Ich habe jetzt eine mögliche lösung gefunden!
Habe aber 2 fragen dazu:
.) Wieso funktioniert es so, und nicht so wie vorher?
.) Was passiert jetzt nach dem return mit meiner Variable? Ich finde, das riecht verdammt nach nen Memory - Leak!

Ich habe die Lade - Funktion jetzt einfach mal mit nem Pointer versucht .. und siehe da, er funktioniert ?!
Hier der geänderte Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
//Funktion zum Laden der Storry
CSprite * CGame::LoadStorry(const int &ID_Storry)
{
    CSprite *pTempSprite = new CSprite; //Temporäres CSprite für den Text
    if(ID_Storry == 1)
        pTempSprite->Load("Data/Emphasis/Storry/Storry_1.Emphasis");
    else if(ID_Storry == 2)
        pTempSprite->Load("Data/Emphasis/Storry/Storry_2.Emphasis");
    
    return pTempSprite;
}

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Ombalat« (27.08.2010, 22:27)


17

27.08.2010, 22:48

.) Wieso funktioniert es so, und nicht so wie vorher?
.) Was passiert jetzt nach dem return mit meiner Variable? Ich finde, das riecht verdammt nach nen Memory - Leak!
Guten Abend Ombalat,

zu 1.
Wie sah die Funktion denn vorher aus? So wie sie jetzt ist, passt alles. Allerdings brauchst du bei einem Integer als Übergabewert deiner Funktion keine Referenz verwenden. Ein const int reicht völlig aus. Schließlich braucht ein Integer auf einem 32bit System nur 2 bytes.

zu 2.
Ja in der Tat schaffst du hier ein Memory-Leak. Du erzeugst das temporäre Sprite nämlich auf dem Heap und musst es demnach mit delete wieder freigeben. Oder alternativ - was sich hier wohl eindeutig eher anbietet - du erzeugst das Sprite einfach auf dem Stack, dann wird es am Ende der Funktion freigegeben ohne, dass du etwas weiteres tun musst.

C-/C++-Quelltext

1
2
3
CSprite SpriteIntro_Text;
SpriteIntro_text.Load(...);
...


Gruß
SaRu_

18

27.08.2010, 23:58

Oke, vielen dank,

Nur hab ich es vorher ja am Stack erzeugt ... nur dass es mim stack nciht geklappt hat ... hier nochmal ne gegenüberstellung

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
Mit Heap (funkt):

//Funktion zum Laden der Storry
CSprite * CGame::LoadStorry(const int &ID_Storry)
{
    CSprite *pTempSprite = new CSprite; //Temporäres CSprite für den Text
    if(ID_Storry == 1)
        pTempSprite->Load("Data/Emphasis/Storry/Storry_1.Emphasis");
    else if(ID_Storry == 2)
        pTempSprite->Load("Data/Emphasis/Storry/Storry_2.Emphasis");
    
    return pTempSprite;
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
Mit Stackt (funkt nicht):

CSprite * CGame::LoadStorry(const int &ID_Storry)
{
    CSprite TempSprite; //Temporäres CSprite für den Text
    if(ID_Storry == 1)
        TempSprite.Load("Data/Emphasis/Storry/Storry_1.Emphasis");
    else if(ID_Storry == 2)
        TempSprite.Load("Data/Emphasis/Storry/Storry_2.Emphasis");
    
    return &TempSprite;
}


Deswegen versteh ich ja nicht, wieso die 2. variante nicht funktioniert ...

Gute Nacht,
Ombalat

19

28.08.2010, 00:32

Hallo Ombalat,

deine zweite Variante (mit Stack) kann nicht funktionieren, da du einen Pointer auf dieses Sprite zurückgibst, der mit dem Funktionsende ungültig wird - weil ja das Sprite am Ende der Funktion gelöscht wird.
Daher kommt die Zugriffsverletzung.

Du hast das Sprite ja selbst mit "Temporäres Sprite" kommentiert. Dann soll es ja auch nur temporär - also innerhalb der Funktion - zur Verfügung stehen. Danach kannst du nicht mehr drauf zugreifen.
Also entweder du gibst keinen Zeiger, sondern das Objekt selbst zurück oder aber du legst das Sprite auf dem Heap an - dann aber nach Möglichkeit nicht in der Funktion selbst sondern im Konstruktor von CGame und rufst hier nur die Funktion Load() auf.


Gruß
SaRu_

Stazer

Alter Hase

Beiträge: 468

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

20

28.08.2010, 00:44

Schreibt mein Story nicht mit einem r?

MfG Stazer

Werbeanzeige