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

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

11

09.03.2015, 19:56

Ich glaube es liegt an den Aufrufen deiner InitElement Methode. Ich vermute mal der erste Parameter, der Integer, wird als Array-Index benutzt. Dann überschreibst du leider das vierte Element deines dreielementigen Arrays. Denn der Arrayindex beginnt ja bei Null.

Allerdings verstehe ich nicht wieso du den selbst-verwalteten Array als angenehmer empfindest als den Vector. Ich kann mir nur vorstellen, weil du bislang mit dem Vector wenig bis gar nicht gearbeitet haben könntest.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

12

09.03.2015, 20:16

Ja das stimmt, die erste Zahl ist der Array-Index. Dieser wird jedoch in der Init Funktion dekrementiert.
Das war einfach nur für mich damit es etwas "logischer" ist.

Das ist ja gerade das ding. Ich habe bis jetzt solche angelegenheiten nur mit Vectoren gelöst. Ich wollte mal eine andere Mehtode testen.
Ist wohl schief gegangen =).

Ich baus mal schnell in einen Vector ein und melde mich dann wieder

:thumbup:
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

13

09.03.2015, 20:59

Hmm, es scheint, dass das Problem nicht an meinem Array lag bzw liegt.
ich habe nun alles auf Vectoren umgeschrieben und ich kriege den gleichen Fehler, nun diesmal beim verlassen des Scopes.

Die neue Init Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
{
    CText Element;
    Element.Init(Text, Posi_X, Posi_Y, Size, Color_R, Color_G, Color_B, Bold);
    Elements.push_back(Element);

}


Beim verlassen dieser Funktion kann doch Element geöscht werden, eine Kopie liegt doch jetzt nun im Vector. oder? :hmm:
Jedoch bekomme ich den gleichen Fehler solbald das Element gelöscht wird.

Habe mich mit Haltepunkten durch gearbeitet und es liegt an diesem Übeltäter:

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
void CText::CreateSprite()
{
    TTF_Font * Font = NULL;
    SDL_Surface * Text_Surface = NULL;
    Color = { Color_R, Color_G, Color_B, 255 };
    if (Bold == true)
    {
        Font = TTF_OpenFont("Data/OpenSans-Bold.ttf", Size);
        
    }
    else if (Bold == false)
    {
        Font = TTF_OpenFont("Data/OpenSans-Regular.ttf", Size);
        
    }

    if (Font != NULL)
    {

        Text_Surface = TTF_RenderText_Solid(Font, Text.c_str(), Color);
        Text_Texture = SDL_CreateTextureFromSurface(Text_Element.Get_Renderer(), Text_Surface);
        SDL_QueryTexture(Text_Texture, NULL, NULL, &Text_Rect.w, &Text_Rect.h);

        Text_Rect.x = Posi_X - (Text_Rect.w / 2);
        Text_Rect.y = Posi_Y - (Text_Rect.h / 2);
    
    }
    else
    {
        cout << "Error: Font konnte nicht geladen werden!" << endl;
    }

    TTF_CloseFont(Font);
    Font = NULL;
    SAFE_DELETE(Text_Surface); // <<<<<<<<<---------------
}


Es Liegt wies aussieht am SAFE_DELETE. Falls ich es auskomentiere läuft es das Programm weiter bzw. es Crasht dann an einer anderen Stelle :crazy:
Die Surface wird doch nicht mehr benötigt... die kann doch weg und der Pointer dann auf NULL setzen.


EDIT: Habe gerade im SDL Wiki gelesen das ich die Surface mit SDL_FreeSurface(surface) löschen muss.... verzeihung
EDIT2: Nachdem ich nun alle Destruktoren von SAFE_DELETE befreit habe und die Richtigen SDL Befehle gesetze habe Funzt alles Prima Blume...
Tut mir echt das ich da so schlampig gearbeitet habe und eure Zeit in anspruch genommen habe.....

Mfg Urprimat
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Urprimat« (09.03.2015, 21:13)


14

09.03.2015, 23:17

delete wird dann mit einem 0ptr aufgerufen.
Das ist völlig legal und tut gar nichts.

Danke, behoben.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Werbeanzeige