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

Diuke87

Frischling

  • »Diuke87« ist der Autor dieses Themas

Beiträge: 2

Wohnort: Berlin

Beruf: Auszubildender

  • Private Nachricht senden

1

21.08.2010, 09:36

Problem*Namensverwaltung in einer Liste

Hallo, zum ersten ich bin ganz neu hier und habe auch keine Erfahrung was Foren betrifft, verzeiht wenn ich irgendwelche Formen nicht einhalte xD

Ich habe eine klitzekleine Liste programmiert in C++(sie ist wirklich sehr klein und besitzt auch keine Löschfunktion ,keine Such oder Sortierfunktion, einfach nur
eine Funktion zum einfügren von Daten und zum ausgeben. Mein Problem ist in der "do-while" Schleife in der main Funktion. Wer das Programm ausführen mag ,wird
feststellen,dass die Liste immer nur den zuletzt gespeicherten Namen ausgibt bzw auch vorher nur den zuletzt geschriebenen Namen speichert. meine Frage WIESo?? ist das so? was muss ich ändern das er auch den aktuellen Namen speichert bzw ausgibt,bei den Altersdaten macht er das ja auch.

Ich wäre sehr Dankbar über jede Hilfe. Programmiere C++ auch erst seit ein paar Monaten bzw. versuche es. Ich denke für euch ist das ein Leichtes :P

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
#include <iostream>

using namespace std;

struct Mitarbeiter
{
                        Mitarbeiter();
    const char          *name;
    unsigned short int  age;
    unsigned int        index;

    Mitarbeiter         *next;
}*Start=NULL;

Mitarbeiter::Mitarbeiter()
{
    index = 0;
}
void Insert(const char *name,int age)
{
    Mitarbeiter *pNew   = new Mitarbeiter;
    pNew->name          = name;
    pNew->age           = age;

    pNew->next          = Start;
    Start               = pNew;
}

void Show()
{
    Mitarbeiter *pMitarbeiter = Start;

    while(pMitarbeiter != NULL)
    {
        cout<<"["<<pMitarbeiter->index<<"]: "<<pMitarbeiter->name<<" "<<pMitarbeiter->age<<endl;
        pMitarbeiter->index++;
        pMitarbeiter = pMitarbeiter->next;
    }
}

int main(int argc,char argv[])
{
    int     eingabe;
    char    name[20];
    int     alter;

    do
    {
        cout<<"Neuer Mitarbeiter?((0)ja/(-1)nein): "; cin>>eingabe;

        if(eingabe == 0)
        {
        cout<<"Name: "; cin>>name;
        cout<<"Alter: "; cin>>alter;
        Insert(name,alter);
        }
        Show();
    }while(eingabe != -1);
    return 0;
}
Irren ist menschlich.
Aber wer richtigen Mist bauen will,
braucht einen Computer !!! 8)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

21.08.2010, 09:53

zeile 26 darf nur beim ersten element ausgeführt werden.

edit: willkommen im forum

edit2: ausserdem sollte Mitarbeiter *next; im konstruktor auf null gesetzt werden sonst gibt’s speicherverletzungen.

edit3: du übergibst immer den gleichen zeiger auf den speicher des namens. vielleicht solltest du std::String verwenden oder wenigstens im konstruktor von Mitarbeiter speicher reservieren und den inhalt kopieren.(nicht vergessen wieder zu deleten)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (21.08.2010, 10:00)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

21.08.2010, 09:59

NachoMan? Wieso Zeile 26? Er fügt bei seiner Liste immer vorne an. Das ist völlig ok so. Speicherverletzungen gibt es auch keine in seinem Program.

Das Problem sind die Namen. Du lässt in Zeile 53 den Namen in einen festen Array eingeben, der in Zeile 44 definiert wird und übergibst an den neuen Mitarbeiter nur den Pointer auf diesen Array. Beim nächsten Schleifendurchlauf überschreibst du dann den Inhalt wieder. Und damit ändert sich auch der Name aller bisherigen Mitarbeiter, weil die ja alle den gleichen Array referenziert bekommen haben. Jeder Mitarbeiter braucht also seinen eigenen Array / eigenen Speicher für seinen Namen. Auch ist Referenzierung einer lokalen Variablen keine schöne Sache. Ich würde einfach in der Insert-Methode 'nen dynamischen Speicher anfordern und den Namen kopieren. Fertig.
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]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

21.08.2010, 10:04

ups sry. erschien mir etwas unlogisch beim durchlaufen beim ersten element zu starten.
beim nächsten mal sollte ich genauer lesen. dann wärs auch früher aufgefallen, dass was mit dem string nicht stimmt^^.
@Diuke: darfst du std::string von der schule aus nicht benutzen oder willst du den umgang mit c-strings lernen?

Zitat

Ich würde einfach in der Insert-Methode 'nen dynamischen Speicher anfordern und den Namen kopieren. Fertig.

das ist aber sehr unübersichtlich. speicher reserviert man, wenns geht im konstruktor und gibt ihn im dazugehörigen destruktor wieder frei...
ein gutes beispiel dafür, dass man daten private halten sollte -> eine setName methode könnte passenden speicher reservieren.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (21.08.2010, 10:10)


Diuke87

Frischling

  • »Diuke87« ist der Autor dieses Themas

Beiträge: 2

Wohnort: Berlin

Beruf: Auszubildender

  • Private Nachricht senden

5

21.08.2010, 11:01

Vielen Dank erstmal :P hat geklappt hab im Konstruktor den speicher für den char allokiert und in der do while schleife immer ein Mitarbeiterspeicher auch neu allokiert.
Aber eine Frage noch, Was meint ihr mit std::string? Ich benutze using namespace std; das ich iostream ohne das ".h" benutzen kann. Ich weiss nähmlich nicht wie ich das
anders handhaben sollte^^. Denn ich hatte mal Visual C++ 6.0 benutzt da ging das ohne using namespace std und "iostream.h".

Evt. könntet ihr mir noch sagen was ihr damit meintet :) wäre sehr nett.

Dankeschön
Irren ist menschlich.
Aber wer richtigen Mist bauen will,
braucht einen Computer !!! 8)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

21.08.2010, 11:20

std::string
da kannst du dir auch gleich std::list, std::vector usw. ansehen.
hat euch euer lehrer wahrscheinlich nicht gezeigt weil ihr erstmal lernen sollt ohne auszukommen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

21.08.2010, 11:20

Also da würfelst du gerade einiges durcheinander.
"iostream.h" ist eine Header-Datei. "iostream" ist ein namespace. "std" ist auch ein namespace. Die Verwendung von "using namespace std;" ist eine Erleichterung bei der Verwendung von Datentypen, bzw. ihrer Namen. Statt "std::string" braucht man nur noch "string" zu schreiben. Das ".h" wegzulassen hat damit gar nichts zu tun, da wie gesagt das eine ein Header und das andere ein Namespace ist. Dazu belies dich noch mal im Detail.

std::string ist eine Klasse für Zeichenketten aka Strings. Sollte man als C++ Programmierer dringend kennen, denn char* oder char[] aus C sind seit C++ nicht mehr wirklich 'modern'.
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]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

21.08.2010, 11:24

da muss ich dir widersprechen. iostream ist auch eine headerdatei. man lässt das .h bei der standardbibliothek(für c++) nur weg.
ich glaub das hat den grund darin dass man die C bibliotheken auch einbinden kann -> <string.h>
die c++ stringbibliothek bindet man mit <string> ein.
man könnte sonst nicht zwischen c++ und c bibliotheken unterscheiden.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

9

21.08.2010, 11:31

Beide haben recht. Aber Nachoman es ist nicht unbedingt das gleiche wenn du die Version mit und ohne .h zu verwenden.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

21.08.2010, 11:44

das passiert wenn man seinen satz editiert und nicht nochmal drüber liest...^^ aber solang man es versteht.
hab ich behauptet es wär das gleiche?

edit: natürlich hab ich nur BlueCobolds aussage, iostream sei ein namespace, wiedersprochen. der rest stimmt.

gerade als anfänger sollte man using namespace nicht verwenden. kA wieso das in allen einführenden büchern benutzt wird. schreib lieber ein paar mal std::. dann wird dir auch klarer wie man namespaces benutzt und welche funktionen und klassen in std liegen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (21.08.2010, 11:57)


Werbeanzeige