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

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

1

09.03.2012, 02:32

char Problem es wird nur 1 Buchstabe übergeben

Hey,
ich habe mal ein wenig an einer kleinen Datenbank rumprobiert und wollte den Namen von meiner Klasse mit einem Namen aus meine main.cpp vergleichen doch wenn ich m_Name[30] als char übergebe wird nur der Anfangsbuchstabe übergeben. Wenn ich aber intern m_Name[30] ausgebe wird der ganze Name gezeigt.

Header

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class CPersonen
{
    private:
        char m_Name[30];
        char m_Nachname[30];
        int m_Anmeldungen;

    public:
        CPersonen ();
        void m_Name_eintragen ();
        void m_Anzeichen ();
        char m_getName () {return m_Name[30];}
};


main.cpp ausschnitt

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Person suchen [User]
            case 2:
            {
                system ("cls");
                /*cout << "_____ Person suchen _____" << endl;
                cout << " Name: ";
                cin.ignore ();
                cin.get (Name, 30);*/

                for (i=vPersonen.begin(); i!=vPersonen.end(); i++)
                {
                    cout << "Person: " << i->m_getName () << endl;
                }
                system ("pause");
            } break;


MFG:
Raiden

idontknow

unregistriert

2

09.03.2012, 03:14

Habe "Wenn ich aber intern m_Name[30] ausgebe wird der ganze Name gezeigt." nicht wirklich kapiert (was du damit meinst).

Auf jedenfall solltest du dir die Zeile nochmal genau ankucken (ist logisch, das da nur EIN Zeichen (EIN char) ausgegeben wird.

C-/C++-Quelltext

1
char m_getName () {return m_Name[30];}


Wenn du mehrere Zeichen ausgeben willst musst du irgendwie mit Strings arbeiten sprich entweder C-Strings (const char*/char*) oder eben C++ Stringklassen (wie std::string). Letzteres wäre empfehlenswert. Musst du aber wissen. Was jetzt nicht heißt, das du Strings verwenden sollst und dein Fehler ignorieren..

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

09.03.2012, 09:09

char m_getName () {return m_Name[30];}


Du siehst ja schon am Rückgabewert, dass das dir nur ein char zurückgibt. Zumal der Zugriff auf den Index '30' eigentlich ausserhalb des gültigen Bereichs von m_Name liegt. Was du tun solltest ist folgendes:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class CPersonen
{
    private:
        std::string m_Name;
        std::string m_Nachname;
        int m_Anmeldungen;

    public:
        CPersonen ();
        void m_Name_eintragen ();
        void m_Anzeichen ();
        const std::string& getName () const { return m_Name; }
};
@D13_Dreinig

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

4

09.03.2012, 13:33

@David_pb es ist doch offensichtlich, dass wir es hier mit einem Anfänger zu tun haben, der die STL definitiv nicht kennt.

@Topic: Ein char ist nur ein Buchstabe, ein char[30] sind 30 buchstaben in einer Liste (also ein string). Wenn du nur einen char übergibst, dann wird eben nur der erste Buchstabe genommen.
Also musst du

C-/C++-Quelltext

1
char* m_getName () {return m_Name;} // OK, ich habe das schon ewig nimemr gemacht

schreiben. Später verwendet man dann lieber std:string, wie David angemerkt hat (diese sind viel flexibler und einfacher zu verwenden)

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »CBenni::O« (09.03.2012, 16:13)


5

09.03.2012, 13:51

return m_Name[30] schickt doch nur das char an Stelle 30, oder etwa nicht? 8|

MfG
Check

idontknow

unregistriert

6

09.03.2012, 13:55

Wurde doch alles schon im Post von David_pb geklärt.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

09.03.2012, 13:58

Schön... Benni macht ein Beispiel und macht's falsch. :D
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

8

09.03.2012, 14:00

schreiben. Später verwendet man dann lieber std:string, wie David angemerkt hat (diese sind viel flexibler und einfacher zu verwenden)

WIeso später? Lieber jetzt sofort. Man muss ja nicht komplett verstehen, was im Hintergrund passiert, das tut er bei cout doch auch nicht. Man kann doch jetzt schonmal std::strings benutzen, sich freuen, das man weniger Fehler hat und später verstehen, was da eigentlich passiert. Wenn man erstmal nur weiß, wie man Strings einliest, ausgibt und hin und her kopiert, reicht das für die meisten Anwendungen doch schon aus.
Lieber dumm fragen, als dumm bleiben!

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

9

09.03.2012, 15:52

WIeso später? Lieber jetzt sofort. Man muss ja nicht komplett verstehen, was im Hintergrund passiert, das tut er bei cout doch auch nicht. Man kann doch jetzt schonmal std::strings benutzen, sich freuen, das man weniger Fehler hat und später verstehen, was da eigentlich passiert. Wenn man erstmal nur weiß, wie man Strings einliest, ausgibt und hin und her kopiert, reicht das für die meisten Anwendungen doch schon aus.

Das ist meiner Ansicht nach falsch. Hier lernt einer C++, da kann man nicht alles auf einmal machen. Ich weiß nicht, ob Raiden das Buch von Heiko liest, da kommt die STL erst gegen Ende dran, in dieser Reihenfolge sollte es auch bleiben. Das ist wie in der ersten Klasse, wo man lernt, dass 5-3 nicht geht, statt dass negative Zahlen eingeführt werden ;) Eins nach dem Anderen. Er ist schon mutig genug, um mit C++ anzufangen, dass angeblich eine sehr steile Lernkurve hat.

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

09.03.2012, 16:28

So lernt man erst den Quatsch, der noch aus C-Zeiten übrig ist. Das Buch von Heiko ist meiner Meinung da sehr schlecht aufgebaut. Genau wie in jedem Anfängerbuch immer das Singleton-Pattern gelehrt wird, welches dort nichts zu suchen hat. Das sind typische Fehler in modernen Büchern, die verboten gehören. C-Strings sind eben C-Strings und keine C++ Strings. Genau genommen sind es sogar nur Arrays von Chars mit einer 0 am Ende. Genau so sollte man sie unter C++ auch betrachten, keinesfalls mehr aber als Strings. Schlechte Beispiele aus Anfängerköpfen rauszubekommen ist viel schwieriger als ihnen von Anfang an die String-Klasse zu geben. Beides verstehen sie äquivalent gut und schlecht, nur bieten C-Strings wesentlich mehr Potential für Fehler und werden von ihnen auch weiterhin verwendet werden, obwohl sie es nicht sollten.
Dass man ihnen nicht immer gleich Boost unter die Nase reiben sollte, das sehe ich ja noch ein. Aber C-Strings... nee... bäh!
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige