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

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

1

18.01.2009, 00:04

Ausgabe von Listen "Inhalt" ist nicht korrekt.

Guten Abend,
ich habe echt lange daran überlegt bis ich mich entschlossen habe mein Porblem zu posten.

Also das Problem.

Es geht um ein Kundenkartei-System.

Zur Ein/-Ausgabe der Daten habe ich folgende Funktionen.



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void CKunde::m_GreatEintrag ()
{
    int Anzahl=1;
    CKunde *Temp=NULL ;
    
    
    Temp = new CKunde [Anzahl+1];
    Temp[Anzahl].m_InfoEintrag (); 
    lKundenDaten.push_back (Temp); 

    cout<<"Testausgabe Listegroesse"<<lKundenDaten.size () <<endl;
    system("pause");
    

            
}





C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
void CKunde::m_ZeigeDaten ()
{
    
        cout<<"Name: "<<m_sName<<endl;
        cout<<"Alter: "<<m_sAlter<<endl;
        cout<<"Adresse: "<<m_sAdresse<<endl;
        cout<<"Ort: "<<m_sOrt<<endl;
        cout<<"Telefon"<<m_sTelefon<<endl;
    
}






C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
void CKunde::m_Show ()
{

    list<CKunde*>::iterator i;

    for(i=lKundenDaten.begin ();i != lKundenDaten.end ();i++)
    {
        (*i)->m_ZeigeDaten ();

    }


Nun meine erste Frage: Im ersten Codeblock erzeuge ich ja Instanzen der Klasse CKunde aber das an der stelle wo die Funktion definiert wird.
Spricht da was dagegen?


Funktioniert ja bis dahin alles super.
Nun will ich mir die Daten wieder ausgeben.
Das geht ja alles über die m_Show Funktion.

Hier der Funktionsaufruf in der main.cpp.

C-/C++-Quelltext

1
2
3
4
5
6
7
case (2):
    {
      
        Kunde.m_Show ();


    }break;


Jetzt mag ich mir denken das er mir (nehmen wir an ich habe 3 Kunden eingetragen) mit diese nacheinander ausgibt.
Stattdessen gibt er mit einfach nur den leeren "Rumpf" aus und das auch nur einmal egal wie viele Einträge ich erstelle.


(Link)



Ein Denkfehler? das Programm an sich geht ja.
Hab ich was durcheinander gebracht?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

18.01.2009, 00:18

Re: Ausgabe von Listen "Inhalt" ist nicht korrekt.

Also dieser Code ist ja schrecklich.
Du reservierst Speicher, den du nicht mehr freigibst. Auch noch gleich ein ganzes Array, von dem du dann nur ein einziges Element initialisierst. Damit machst du aber nix, sondern packst ein anderes davon in deine Liste.
Ich versteh hier garnix, sorry.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

18.01.2009, 00:18

Also das hier ist sicher einmal völliger Mist. ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
    int Anzahl=1;
    CKunde *Temp=NULL ;
   
   
    Temp = new CKunde [Anzahl+1];
    Temp[Anzahl].m_InfoEintrag ();
    lKundenDaten.push_back (Temp); 


Du erstellst ein Array von Kunden und rufst lediglich auf das zweite Element eine Funktion auf. (welche, wie ich mal annehmen irgendwas befüllt).

Und dann pusht du den Zeiger auf das erste Element in einen Container.
(das zweite Element bleibt geht aber verloren).

Das hier sollte reichen:

C-/C++-Quelltext

1
2
3
    CKunde *Temp = new CKunde;
    Temp->m_InfoEintrag ();
    lKundenDaten.push_back (Temp); 


EDIT:
Im dtor nicht vergessen den Speicher wieder freizugeben!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

18.01.2009, 00:24

Was soll eigentlich "m_GreatEintrag" heißen?

Zur Info: "great" heißt "groß" / "großartig".
Du meinst wohl "create".
Deutsch und englisch zu mixen ist eine ganz schlechte Idee.
Und "m_"-Präfix bei Methoden?!

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

5

18.01.2009, 00:28

Hmmm ja. :oops: Irgendwie hatte ich da was ganz anderes im Kopf gehabt. Aber jetzt wo ich es sehe erscheint es mir doch logischer.

Jetzt geht es jedenfalls.
Zu dem Speicher wieder freigeben.
Keine Angst.Kommt noch alles. Wollt jetzt nur erstmal ein ganz simples Grundgerüst schaffen.

Danke erstmal.

Anonymous

unregistriert

6

18.01.2009, 08:08

Erschaffer
Der ganze reservierte Speicher gammelt solange auf dem Arbeitsspeicher (RAM) rum, bis du ihn wieder freigibst. Da du dein Programm wohl kompilierst und im Debugsmodus ausführst liegt es nahe, das VS die Freigabe von selber unternimmt. Also, egal was du mit new machst, den Speicher immer freigeben! New&delete sind wie Windows&Fehler (-;. Auch wenn's vorerst zum Test ist, immer deleten...

7

18.01.2009, 10:05

Zitat von »"Coders-Square"«

Erschaffer
Der ganze reservierte Speicher gammelt solange auf dem Arbeitsspeicher (RAM) rum, bis du ihn wieder freigibst. Da du dein Programm wohl kompilierst und im Debugsmodus ausführst liegt es nahe, das VS die Freigabe von selber unternimmt.

Eigentlich ist es die Aufgabe des Betriebssystems, den Speicher nach beenden des Programmes wieder freizugeben. Demnach sollte alles wieder freigegeben sein, sobald du dein Programm beendest.
Selber freigeben sollte man natürlich auch, sonst hat man irgendwann zur Laufzeit keinen Speicher mehr. Nettes Beispiel wäre hier GTA4 von dem ich gehört habe, es läuft mit der Zeit immer schlechter und stürzt nach einer halben Stunde komplett ab, sowas kann einem durch memory leaks sehr leicht passieren.
Lieber dumm fragen, als dumm bleiben!

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

8

18.01.2009, 22:41

Aus der Speicherdiskussion halte ich mich jetz mal raus. Andere frage? Gibt es einen speziellen Grund, deine Kunden explizit auf dem Heap (also mit new + delete) anzulegen? Mach dir lieber eine Liste wie folgt:

C-/C++-Quelltext

1
2
3
4
5
6
std::list<CKunde> lKundenDaten;

// Und einen neuen Kunden kannst du dann mit dem hier erzeugen:

CKunde tmp;
tmp.m_InfoEintrag();
lKundenDaten.push_back(tmp);


PS: m_ setzt man idr. vor varaiblen, um z.b. konflikte mit gleichnamigen Parameternamen auszuschließen. (Eine klasse hat einen std::string m_Name; mit der methode setName(const std::string &name)) kannst du bequem ein m_Name = name; ausführen. Wenn der member auch name hieße, also ohne präfix müsstest du über this gehen.) Bei Methodennamen macht das weniger sinn. Es ist natürlich deine Entscheidung, wie du deinen Stil entwickelst...
Und: Reserviere Speicher nur mit new, wenn du ihn auch tatsächlich auf dem heap bracuhst. und benutze dann wenigstens smart ptrs in deiner liste, dass sollte das ganze einfacher machen. dazu gammelt hier irgendwo auch ein Tutorial von David_pb rum.

Socke

Anonymous

unregistriert

9

18.01.2009, 23:04

Zitat von »"Errschaffer"«

Zu dem Speicher wieder freigeben.
Keine Angst.Kommt noch alles. Wollt jetzt nur erstmal ein ganz simples Grundgerüst schaffen.
Tipp: Bei Parties immer Just in Time aufräumen, denn alles am Ende bietet die Möglichkeit etwas wichtiges zu übersehen.

Hättest du so vor hmn gut 10 Jahren angefangen zu coden, so bei Windows 98 und hättest gesagt: "Ach, das Speicher freigeben, implementiere ich mal wenn ich Zeit habe" wärest du nicht weit gekommen: Nach 2x-3x Programm starten, könntest du dein ganzes System neustarten.

Entweder macht man es richtig oder gar nicht, es gibt kein "Später".

Ich muss David übrigends recht geben: Grauenvoller Code mit vielen wirren Parts.

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

10

20.01.2009, 15:24

Okay danke für die Tipps. Werd absofort immer den Speicher gleich wieder freigeben.

Werbeanzeige