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

01.09.2005, 09:53

Hallo Koschka,
hier nochmal der ganze code. nicht relevante methoden hab ich entfernt um es nicht zu unübersichtlich zu haben.

gruss
manne

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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Cspaceship.cpp


#include <iostream>
#include "Cspaceship.hpp"

using namespace std;

Cspaceship::Cspaceship()
{
    cout << "Konstruktor1 wird aufgerufen und Standartwerte werden initialisiert!" << endl;
    m_energy=0;
    m_velocity=0;
    this->SetName("prototyp");
}

Cspaceship::Cspaceship(char *name,const int energy,const int velocity)
{
    cout << "Konstruktor2 (mit Parameterliste) wird aufgerufen und Werte uebergeben!" << endl;
    m_energy=energy;
    m_velocity=velocity;
    m_name = name;
}

void Cspaceship::ShowData()
{
    cout << endl;
    cout << "Shuttle \t : " << (m_name) << endl;
    cout << "Energy \t\t : " << m_energy << endl;
    cout << "Velocity \t : " << m_velocity << endl;
    cout << endl;
}

void Cspaceship::SetName()
{
    char chartemp[256];
    cout << "Namen eintragen: ";
    cin >> (chartemp);
    m_name=(&chartemp[0]);
    //m_name=chartemp;

    //strcpy(m_name,chartemp);


    cout << "m_name innerhalb von Cspaceship::SetName() \n direkt nach der Zuweisung: " << (m_name) << endl;
    cout << "m_name innerhalb von Cspaceship::SetName() \n mittels ::GetName() direkt nach der Zuweisung: " << (this->GetName()) << endl;
}

void Cspaceship::SetName(char *name)
{
    cout << (name) << endl;
    m_name=name;
    //cout << (m_name) << endl;

}

char *Cspaceship::GetName()
{
    return (m_name);
}

//++++++++++++++++++++++++++++++++++

// Cspaceship.hpp

//++++++++++++++++++++++++++++++++++

class Cspaceship
{
private:
        int m_energy;
        int m_velocity;

protected:
        char *m_name;
        
public:
        Cspaceship();
        Cspaceship(char *name, int energy, int velocity);
        virtual void ShowData();
        
        void SetName();
        void SetName(char *name);
        
        char *GetName();
}

//++++++++++++++++++++++++++++++++++

// mainprog.cpp

//++++++++++++++++++++++++++++++++++

#include <iostream>
#include "Cspaceship.hpp"
#include "CMinenleger.hpp"
using namespace std;

int main()
{
    const int iNshuttles=1;
    Cspaceship *pshuttleList = NULL;
    pshuttleList = new Cspaceship[iNshuttles];

    for (int i=0;i<iNshuttles;i++)
    {
        pshuttleList[i].SetName();
        cout << endl;
        cout << "m_name innerhalb von main() nach der Zuweisung: " << pshuttleList[i].GetName() << endl;
        //cout << (pshuttleList[i].GetName()) << endl;


        pshuttleList[i].SetName("hurleburle");
        pshuttleList[i].ShowData();
        }
    delete[] pshuttleList;
    pshuttleList=NULL;
}



Zitat


Aber das wird dein Problem nicht beheben (k vielleicht stürzt das Programm nicht mehr ab). Der Fehler muss woanders legen, poste mal bitte nochmal den gesamten Code. Besonders der der Ausgabe.
[/cpp]

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

12

01.09.2005, 11:49

Wenn Du strcpy verwendest, musst Du noch Speicher für m_name reservieren. Vielleicht in der Art so (Funktion "SetName" ohne Parameter):

C-/C++-Quelltext

1
2
m_name = new char[ strlen(chartemp) + 1 ];
strcpy( m_name, chartemp );

In der Variante mit Parametern (sowie im Konstruktor mit Parametern) solltest Du auch besser eigenen Speicher für m_name reservieren und dann die Daten per strcpy kopieren. Theoretisch ist das nicht unbedingt notwendig, wenn konstante Strings, also "hard-gecodete" Strings, übergeben werden, weil die permanent im Speicher stehen und es zu keiner Speicherverletzung kommt (glaube ich :angel: ). Allerdings müsstest Du dann irgendein Flag setzen, was Auskunft darüber gibt, ob Speicher für m_name explizit reserviert wurde (was zu raten ist), oder nicht, da Du diesen ja auch wieder "deleten" müsstest.
Die std::string-Geschichte ist aber eigentlich sehr einfach, obwohl ich persönlich das auch immer am liebsten mit char* etc. mache. ;)

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

13

01.09.2005, 12:31

richtig, oh man das hab ich obven vergessen, sry. Ja nimm string oder verwende new und delete und dein Problem wird behoben sein, denk ich zumindest.

14

01.09.2005, 12:54

hallo, danke fuer den tip. also mittlerweile wird alles richtig ausgegeben und scheint soweit auch alles fehlerfrei zu laufen....
:huhu: :)

Zitat von »"Steven77"«

Wenn Du strcpy verwendest, musst Du noch Speicher für m_name reservieren. Vielleicht in der Art so (Funktion "SetName" ohne Parameter):

C-/C++-Quelltext

1
2
m_name = new char[ strlen(chartemp) + 1 ];
strcpy( m_name, chartemp );

In der Variante mit Parametern (sowie im Konstruktor mit Parametern) solltest Du auch besser eigenen Speicher für m_name reservieren und dann die Daten per strcpy kopieren. Theoretisch ist das nicht unbedingt notwendig, wenn konstante Strings, also "hard-gecodete" Strings, übergeben werden, weil die permanent im Speicher stehen und es zu keiner Speicherverletzung kommt (glaube ich :angel: ). Allerdings müsstest Du dann irgendein Flag setzen, was Auskunft darüber gibt, ob Speicher für m_name explizit reserviert wurde (was zu raten ist), oder nicht, da Du diesen ja auch wieder "deleten" müsstest.
Die std::string-Geschichte ist aber eigentlich sehr einfach, obwohl ich persönlich das auch immer am liebsten mit char* etc. mache. ;)

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

15

01.09.2005, 13:05

denk aber daran: du alloziierst Speicher, diesen musst du wieder freigeben. das macht man in deinem Fall mit delete[] m_name;

16

01.09.2005, 15:45

hallo,
ich versteh ja, dass das wichtig ist, aber wenn ich das mache (habe den eintrag in den destruktor gepackt), dann bekomme ich einen assertion-failure beim ausführen des programms (sobald

C-/C++-Quelltext

1
delete[] m_name;
aufgerufen wird).
so langsam verzweifel ich wirklich an dem adressen-und speicherkram...:crying: grad dachte ich, ich haetts geblickt. was ist da denn noch falsch? ???
gruss
manne

Zitat von »"koschka"«

denk aber daran: du alloziierst Speicher, diesen musst du wieder freigeben. das macht man in deinem Fall mit delete[] m_name;

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

17

01.09.2005, 20:39

ja das ist eben ein Problem. Wenn du die Klasse benutzt (ohne die Set Name Methode), wird kein Speicher alloziiert. Was soll er dann freigeben? stz den Zeiger einfach auf NULL (im Konstructor). und prüf im Destructor ob er immernoch NULL ist, wenn nicht, löschen!

18

01.09.2005, 21:02

hallo,
genau das mach ich. troztdem meldet er immer einen assertion failure sobald m_name freigegeben werden soll. also

C-/C++-Quelltext

1
2
3
4
5
if (m_name!=NULL)
{
    delete[] m_name;
    m_name=NULL;
}

...das haut nicht hin.

gruss
manne

Zitat von »"koschka"«

ja das ist eben ein Problem. Wenn du die Klasse benutzt (ohne die Set Name Methode), wird kein Speicher alloziiert. Was soll er dann freigeben? stz den Zeiger einfach auf NULL (im Konstructor). und prüf im Destructor ob er immernoch NULL ist, wenn nicht, löschen!

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

19

01.09.2005, 21:09

hast du auch im Konstrukto m_name auf NULL gesetzt?

Quellcode

1
2
3
4
CTolleKlasse::CTolleKlasse()
{
m_name =NULL;
}

20

01.09.2005, 21:41

ja, hab icg gmacht... geht trotzdem nich.
gruss

Zitat von »"koschka"«

hast du auch im Konstrukto m_name auf NULL gesetzt?

Quellcode

1
2
3
4
CTolleKlasse::CTolleKlasse()
{
m_name =NULL;
}

Werbeanzeige