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

31.08.2005, 13:21

prob mit char* und eingaben

hallo,
habe ein problem mit char in kombination mit zeigern. wenn ich einen namen über cin einlesen lasse und den wert an m_name weitergebe, dann funktioniert die ausgabe zuerst problemlos. aber sobald ich aus der methode raus bin bringt die ausgabe mit cout nur noch wirre zeichen...
woran liegt das? muss irgendwas mit der addressierung zu tun haben. aber ich komm nicht auf den fehler. hab hier mal die wesentlichen teile des progs reinkopiert. ::SetName() ist überladen die version mit den parametern hab ich hier nicht reinkopiert, da die funktion richtig funktioniert. wäre super wenn mir da jemand helfen koennte.
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
...
// in Cspaceship.hpp


class CSpaceship
{
...

private: ...

protected:
       char *pm_name;
public: ...
        //hier sind die unteren methoden deklariert...




// in Cspaceship.cpp


void Cspaceship::SetName()
{
    char chartemp[256];
    cout << "Namen eintragen: ";
    cin >> (chartemp);
    m_name=(&chartemp[0]);
    cout <<  (m_name) << endl;// funktioniert.. als ausgabe kommt wirklich auch der eingegebene text.

    cout <<  (this->GetName()) << endl; // funktioniert auch

}

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

// in hauptprog.cpp


int main()
{
...
       CSpaceship *einRaumschiff;
       einRaumschiff=new CSpaceship;
       einRaumschiff->SetName("hurleburle"); //funktioniert; die methode //ist ok und es wird auch der text danach richtig ausgegeben.

       cout << einRaumschiff->GetName() << endl; //funktioniert;

      
       einRaumschiff->SetName(); // 

// hier gibts dann probleme nach dem aufrufen von SetName();

       cout << einRaumschiff->GetName() << endl; // funktioniert nicht

}

[\cpp]

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

2

31.08.2005, 14:12

:ohoh:

Quellcode

1
m_name=(&chartemp[0]);


hier ist der Fehler, wie du ja auch vermutest hast. Erstens hast du keine Varibale namens m_name deklariert, sondern pm_name und zweitens zeigt m_name auf den ersten Buchstaben deines Strings.

Beutze einfach den Befehl strcpy dazu. Bei dir müsste es dann heissen, strcpy(mp_name, chartemp);

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

3

31.08.2005, 14:36

dass es der erste buchstabe ist, ist nicht schlimm, allerdings dass die membervariable nicht deklariert ist..

weil &chartemp[0] ist das gleiche wie chartemp.. beides die adresse vom anfang des strings

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

31.08.2005, 15:16

Ich denke, das mit der Membervariable, ist nur ein Tippfehler, schließlich hat mann73 ja keine Probleme mit Compiler-Fehlern...
Aber m_name zeigt halt nach der Initialisierung mit (&chartemp[0]) bzw. einfach nur chartemp auf den Speicherbereich von chartemp. Nach dem Beenden der Funktion ist chartemp nicht mehr gültig. m_name zeigt also auf einen "ungültigen" Speicherbereich.
Die Lösung des Problems hat koschka schon angesprochen: strcpy.

5

31.08.2005, 16:59

hallo, vielen dank fuer die schnelle antwort

mp_name war nur ein tippfehler im forum. hab das mit strcpy probiert. allerdings führt das dann zum Absturz des programms direkt nach der eingabe, also bei strcpy(m_name,chartemp). das hilft also auch nicht wirklich. nur warum weiss ich jetzt natuerlich auch nicht. vielleicht hat ja noch jemand eine gute idee.
gruss
manne

Zitat von »"Steven77"«

Ich denke, das mit der Membervariable, ist nur ein Tippfehler, schließlich hat mann73 ja keine Probleme mit Compiler-Fehlern...
Aber m_name zeigt halt nach der Initialisierung mit (&chartemp[0]) bzw. einfach nur chartemp auf den Speicherbereich von chartemp. Nach dem Beenden der Funktion ist chartemp nicht mehr gültig. m_name zeigt also auf einen "ungültigen" Speicherbereich.
Die Lösung des Problems hat koschka schon angesprochen: strcpy.

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

6

31.08.2005, 17:35

C-/C++-Quelltext

1
std::basic_string<char>
wird Dir helfen ;)

bassdscho

Alter Hase

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

7

01.09.2005, 00:13

Warum machst du es nicht ienfach so?

C-/C++-Quelltext

1
2
3
4
5
6
7
void Cspaceship::SetName()
{
    cout << "Namen eintragen: ";
    cin >> (m_name);
    cout <<  (m_name) << endl;// funktioniert.. als ausgabe kommt wirklich auch der eingegebene text.

    cout <<  (this->GetName()) << endl; // funktioniert auch

}


Dann musst du nicht hin und her kopieren, das spart Zeit.
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

8

01.09.2005, 08:28

hallo bassdscho,
wenn ich das so mache, dann schmiert das programm direkt bei der abfrage komplett ab.
gruss
manne

Zitat von »"bassdscho"«

Warum machst du es nicht ienfach so?

C-/C++-Quelltext

1
2
3
4
5
6
7
void Cspaceship::SetName()
{
    cout << "Namen eintragen: ";
    cin >> (m_name);
    cout <<  (m_name) << endl;// funktioniert.. als ausgabe kommt wirklich auch der eingegebene text.

    cout <<  (this->GetName()) << endl; // funktioniert auch

}


Dann musst du nicht hin und her kopieren, das spart Zeit.

9

01.09.2005, 08:39

hallo patrick,
habs in der msdn nachgeschaut aber nicht ganz kapiert wie man damit umgeht. koenntest du mir vielleicht kurz an nem code beispiel zeigen, wie das genau anwende? danke dir!
gruss
manne

Zitat von »"Patrick"«

C-/C++-Quelltext

1
std::basic_string<char>
wird Dir helfen ;)

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

10

01.09.2005, 08:58

du benutzt das so:

Quellcode

1
2
std::basic_string<char> hello = "hello";
cin >> hello;


du kannst auch schreiben

Quellcode

1
2
std::string hello = "hello";
cin >> hello;


müsste eigentlich das gleiche sein, Patrich ist nur ein Template Fanatiker ;), musst du wissen :P. Und string ist durch Templates realisiert.

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.

Werbeanzeige