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

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

21

01.09.2005, 21:46

... dann nimm erstmal string, ich schau mir nochmal morgen deine klasse an ok ;)

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

22

01.09.2005, 21:59

Zeig deinen derzeitigen Code doch nochmal her.
Vermutlich veränderst du irgendwo den Wert des Char-Zeigers und nicht seinen Inhalt.

mfg Philipp

23

01.09.2005, 22:31

hallo phil,
also hier nochmal der code

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
108
109
110
111
// Cspaceship.cpp


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

using namespace std;

Cspaceship::Cspaceship()
{
    m_energy=0;
    m_velocity=0;
    this->SetName("prototyp");
}

Cspaceship::Cspaceship(char *name,const int energy,const int velocity)
{
    m_name=new char;
    m_energy=energy;
    m_velocity=velocity;
    m_name = name;
}

Cspaceship::~Cspaceship()
{
     if (m_name!=NULL)
     {
           delete[] m_name;
           m_name=NULL;
      }
}

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];
    m_name=new char[strlen(chartemp)+1];
    cout << "Namen eintragen: ";
    cin >> (chartemp);
    strcpy(m_name,chartemp);
}

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 von »"Phil_GDM"«

Zeig deinen derzeitigen Code doch nochmal her.
Vermutlich veränderst du irgendwo den Wert des Char-Zeigers und nicht seinen Inhalt.

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

24

01.09.2005, 23:15

Zitat von »"mann73"«

hallo phil,
also hier nochmal der code

C-/C++-Quelltext

1
2
3
4
5
6
void Cspaceship::SetName(char *name)
{
    cout << (name) << endl;
    m_name=name;
    //cout << (m_name) << endl;

}



Hier liegt der Fehler:
char* name ist ebenso eine temporär angelegte Variable. Das heißt nach dem Verlassen der Funktion zeigt name u. somit m_name ins Nirvana. Wenn du m_name = name schreiben willst, dann musst du die Funktion so definieren

C-/C++-Quelltext

1
2
3
4
void Cspaceship::SetName(char** name)
{
  m_name = *name;
}


oder du machst es so

C-/C++-Quelltext

1
2
3
4
void Cspaceship::SetName(char* name)
{
  strcpy(m_name, name);
}

mfg Philipp

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

25

01.09.2005, 23:39

Hier noch eine etwas genauere Erklärung des Problems (hab grad Zeit ;) ):

Wenn du einer Funktion einen int übergibst, dann kann dieser innerhalb dieser Funktion verändert werden usw. . Wird die Funktion verlassen, hat der Übergabeparamter wieder seinen alten Wert, da in der Funktion nur mit einer Kopie davon gearbeitet wurde.

Willst du den Inhalt des int's ändern, übergibst du der Funktion einen Zeiger auf den Int. Vom Zeiger selbst wird widerum eine Kopie angefertigt. Doch diese Kopie zeigt immer noch auf den int. Dadurch kannst du den Wert des ints mittels dieser Zeigerkopie verändern.

Mit m_name = name hast du m_name den Wert von der Kopie des Zeigers auf den String gegeben. Nach dem Verlassen der Funktion existiert die Kopie des Zeigers aber nicht mehr => m_name = NIRVANA ;).
Deshalb musst du der Funktion einen Zeiger auf den Zeiger übergeben. Denn damit gibst du durch m_name = *m_name der Variable m_name den "wirklichen" Wert des Zeigers und nicht den seiner Kopie.

Ich hoffe dass das verständlich ist.

mfg Philipp

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

26

02.09.2005, 04:34

Ja Phil hat Recht.

Ich versteh auch überhaupt nicht was die zweite überladene Funktion SetName soll. Weil du ja was ausgibst?

Quellcode

1
void Cspaceship::SetName(char *name)


Wie gesagt entweder der Doppelzeiger oder einfach strcpy. Man kann Strings nicht einfach zuweisen ;), außer du benutzt das string Objekt.

27

02.09.2005, 07:51

hallo phil,
das klingt soweit alles logisch. trotzdem stürzt mir das prog ab. sowohl mit strcpy als auch mit dem doppelzeiger. hab beides mal ausprobiert.

@koschka: ob das prog sinnvoll ist sei dahingestellt... ich wollte mit den zeigern ein wenig rumprobieren, da mir das probleme gemacht hat. und ganz so einfach scheints ja nicht zu sein ;)

vielen dank trotzdem nochmal fuer eure eifrige hilfe :huhu:
gruss
manne

Zitat von »"Phil_GDM"«

Hier noch eine etwas genauere Erklärung des Problems (hab grad Zeit ;) ):

Wenn du einer Funktion einen int übergibst, dann kann dieser innerhalb dieser Funktion verändert werden usw. . Wird die Funktion verlassen, hat der Übergabeparamter wieder seinen alten Wert, da in der Funktion nur mit einer Kopie davon gearbeitet wurde.

Willst du den Inhalt des int's ändern, übergibst du der Funktion einen Zeiger auf den Int. Vom Zeiger selbst wird widerum eine Kopie angefertigt. Doch diese Kopie zeigt immer noch auf den int. Dadurch kannst du den Wert des ints mittels dieser Zeigerkopie verändern.

Mit m_name = name hast du m_name den Wert von der Kopie des Zeigers auf den String gegeben. Nach dem Verlassen der Funktion existiert die Kopie des Zeigers aber nicht mehr => m_name = NIRVANA ;).
Deshalb musst du der Funktion einen Zeiger auf den Zeiger übergeben. Denn damit gibst du durch m_name = *m_name der Variable m_name den "wirklichen" Wert des Zeigers und nicht den seiner Kopie.

Ich hoffe dass das verständlich ist.
:huhu:

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

28

02.09.2005, 09:01

So ich hab mir das programm mal vorgenommen und hab auch einige Fehler gefunden. Ich poste dir mal das funktionierende Programm. Fehler sind mit Erläuterung als Komentare vorhanden ;). Nach meinem Testen funzt es ;).

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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Cspaceship.cpp


#include <iostream>
using namespace std;

class Cspaceship
{
private:
        int m_energy;
        int m_velocity;

protected:
        char *m_name;
       
public:
        Cspaceship();
        Cspaceship(char *name, int energy, int velocity);
        ~Cspaceship();              //Destructor vergessen

        virtual void ShowData();
       
        void SetName();
        void SetName(char *name);
       
        char *GetName();
};      // ; vergessen zu koperen ;)


Cspaceship::Cspaceship()
{
    m_energy=0;
    m_velocity=0;

    // m_name auf NULL setzen vergessen!

    m_name = NULL;
    this->SetName("prototyp");
}

Cspaceship::Cspaceship(char *name,const int energy,const int velocity)
{
    // Speciher allozieren, da wir hier den Konstructor haben kann m_name

    // vorher nicht verwendet wurden sein!

    m_name = new char [strlen(name) + 1];
    m_energy=energy;
    m_velocity=velocity;
}

Cspaceship::~Cspaceship()
{
     if (m_name!=NULL)
     {
        delete[] m_name;
        m_name=NULL;
     }
}

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];

    // Hier das gleiche, wenn du 2 mal den Namen veränderst, forderst du immer neuen Speicher an,

    // das ist falsch den der aslte muss erst freigegeben werden, deshalb:


    // Speicher löschen

    if(m_name != NULL)
        delete[] m_name;

    // Erst den neuen Namen abfragen, damit dui dessen Länge auch ermittel kannst ;)

    cout << "Namen eintragen: ";
    cin >> (chartemp);
    
    m_name=new char[strlen(chartemp)+1];

    // Daten nun kopieren

    strcpy(m_name, chartemp);
}

// Diese Methode funktionierte nicht...

void Cspaceship::SetName(char *name)
{
    // Es ist klar das das nicht geht.... da evtl auch hier kein Speicher definiert wurde.

    // Deiser wird ja nur bei Set oder dem zweiten Konstuctor angefordert.

    // Deswegen:


    // Speicher löschen

    if(m_name != NULL)
        delete[] m_name;
        
    // Speicher alloziieren

    m_name = new char [strlen(name) + 1];

    // Daten kopieren -> fertsch ;)

    strcpy(m_name, name);
}

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

int main()
{
    const int iNshuttles=3;
    Cspaceship *pshuttleList;
    pshuttleList = new Cspaceship[iNshuttles];
    pshuttleList[0].SetName("hello");

    
    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;
    // Auf NULL setzen ist hier zewcklos, da das Programm eh terminiert wird.


    return 0; // nicht vergessen ;)

}

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

29

02.09.2005, 09:30

Jau, jetzt fehlt nur noch einmal strcpy in dem einen Konstruktor ;) :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
Cspaceship::Cspaceship(char *name,const int energy,const int velocity)
{
    // Speciher allozieren, da wir hier den Konstructor haben kann m_name

    // vorher nicht verwendet wurden sein!

    m_name = new char [strlen(name) + 1];
    m_energy=energy;
    m_velocity=velocity;
} 

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

30

02.09.2005, 12:33

oh ja vergessen, sry :huhu:

Werbeanzeige