Mehrdimensionale Arrays und deren Zeiger bei der Übergabe in Funktionen.
-
Servus,
ich habe ein paar Startschwierigkeiten (letzte C++-Programmierung ist ein paar Jährchen her) mit Arrays und Zeigern.
Folgender Code:class Class_A { public: Class_A(); void CreateASD(long m_Anz_ASD); ~Class_A(); private: struct ASD_Def { long x; long y; double weight; }; long Anz_ASD; ASD_Def *ASD; bool ASD_OK; };
Die ASDs erzeuge ich dann zur Laufzeit so:
void Class_Neuron::CreateASD(long m_Anz_ASD) { ASD = new ASD_Def[Anz_ASD]; Anz_ASD = m_Anz_ASD; ASD_OK = 1; }
Und gebe den Speicher so im Destructor wieder frei:
Class_A::~Class_A() { if (ASD_OK) { delete[] ASD; } }
Soweit glaube ich es zu kapieren.
Jetzt brauche ich von dieser Klasse dynamisch erzeugte Arrays:#pragma once #include "Class_A.h" class Class_A_Cluster { public: Class_A_Cluster(long l_a, long l_b); ~Class_A_Cluster(); private: Class_A *A; long exp_x; //Ausdehnung des Netzes in x - Richtung long exp_y; //Ausdehnung des Netzes in y - Richtung };
#include "stdafx.h" #include "Class_A_Cluster.h" Class_A_Cluster::Class_A_Cluster(long l_a, long l_b) { A = new Class_A[l_a, l_b]; } Class_A_Cluster::~Class_A_Cluster() { delete[] A; }
In meiner Main deklariere ich den Cluster so:
Class_A_Cluster nc1(4,4);
und arbeite in der Class_A_Cluster mit:
A[a, b].SetAP(); (Funktion im Beispiel oben weggelassen).
Ich bin mir aber nicht sicher ob das so richtig ist, vor allem, da ich immer wieder Fehler bekomme, die für mich nach nicht zurückgegebenem Speicher riechen (kann es im Moment leider nicht reproduzieren).
Sieht jemand Fehler?
Gruß,
Aksels
-
Was hat die Frage mit MFC zu tun?
Benutze std::vector, nicht new[]/delete[]!
Class_Neuron::CreateASD
verliert Speicher, wenn sie mehr als einmal aufgerufen wird.
-
@aksels sagte in Mehrdimensionale Arrays und deren Zeiger bei der Übergabe in Funktionen.:
A = new Class_A[l_a, l_b];
Was soll das tun? Schalte die Warnungen deines Compilers ein!
-
@aksels sagte in Mehrdimensionale Arrays und deren Zeiger bei der Übergabe in Funktionen.:
da ich immer wieder Fehler bekomme, die für mich nach nicht zurückgegebenem Speicher riechen
Geht das auch in konkret?
-
@manni66
Class_Neuron::CreateASD Mehrfachaufruf.
Guter Einwand. Fange das jetzt mit der Status-Variablen ASD_OK ab.
-
@manni66 A = new Class_A[l_a, l_b];
Wenn a=4 und b=4 legt soll der Befehl 4*4 =16 Einheiten anlegen.
Merkwürdig, dass der Compiler das frisst, aber bool Varx[4,4] verweigert. Das muss ich so schreiben: Varx[4][4].
Geht das mit dem [l_a,l_b] überhaupt? VisualC++ übersetzt und startet das Programm.....
-
@aksels sagte in Mehrdimensionale Arrays und deren Zeiger bei der Übergabe in Funktionen.:
Geht das mit dem [l_a,l_b] überhaupt?
Es geht, aber es macht selbstverständlich nicht, was du glaubst.
@manni66 sagte in Mehrdimensionale Arrays und deren Zeiger bei der Übergabe in Funktionen.:
Schalte die Warnungen deines Compilers ein!
-
@aksels sagte in Mehrdimensionale Arrays und deren Zeiger bei der Übergabe in Funktionen.:
Guter Einwand. Fange das jetzt mit der Status-Variablen ASD_OK ab.
Ja, das ist Blödsinn.
@manni66 sagte in Mehrdimensionale Arrays und deren Zeiger bei der Übergabe in Funktionen.:
Benutze std::vector, nicht new[]/delete[]!
-
@manni66 MFC
Mit MFC hat das nichts zu tun, aber ich dachte dass dies laut beschriftung auch für Visual C++ fragen sei. Irre ich mich?
-
@aksels sagte in Mehrdimensionale Arrays und deren Zeiger bei der Übergabe in Funktionen.:
für Visual C++ fragen
- die Beschriftung ist Mist
- du hast eine Frage zu C++
-
@manni66 sagte in Mehrdimensionale Arrays und deren Zeiger bei der Übergabe in Funktionen.:
@aksels sagte in Mehrdimensionale Arrays und deren Zeiger bei der Übergabe in Funktionen.:
für Visual C++ fragen
- die Beschriftung ist Mist
- du hast eine Frage zu C++
1)Ich meinte die Beschriftung zu MFC im Forum:
MFC
Fragen zu den MFC (Microsoft Foundation Classes), aber auch zum Visual C++, immer noch die am häufigsten >eingesetzte IDE mit Compiler unter Windows. WinForms haben mit MFC übrigens nichts zu tun.- Wo werden dann C++ Fragen am besten gepostet?
-
@manni66
Hervorragend. Du hast mich in die richtige Richtung verwiesen. Ich erinnere mich wieder.
Lege den Vector nun mit ** an.
std::vector schaue ich mir bei Gelegenheit an. Der Vorteil davon während des Betriebs immer wieder Elemente hinzufügen oder entfernen zu können ist für mich nicht relevant.
Danke schön.
-
@aksels
Der Vorteil von std::vector ist, dass du dich nicht um die Verwaltung der Resourcen kümmern musst (aka RAII). Deine Klassen verletzten die 3er/5er/0er Regel und sind damit fehlerhaft.
-
@aksels sagte in Mehrdimensionale Arrays und deren Zeiger bei der Übergabe in Funktionen.:
1)Ich meinte die Beschriftung zu MFC im Forum:
Ich auch
- Wo werden dann C++ Fragen am besten gepostet?
Im C++ Forum: https://www.c-plusplus.net/forum/category/33/c-alle-iso-standards
=> Neues Thema, nicht Unterkategorien
-
@aksels sagte in Mehrdimensionale Arrays und deren Zeiger bei der Übergabe in Funktionen.:
std::vector schaue ich mir bei Gelegenheit an.
Nein, jetzt! std::vector ist essentiell.
Deine Prioritäten im Leben sollten jetzt sein:
- std::vector angucken
- Demjenigen, der dir diesen new/delete Unsinn beigebracht hat, Saures geben.
-
@seppj sagte in Mehrdimensionale Arrays und deren Zeiger bei der Übergabe in Funktionen.:
Demjenigen, der dir diesen new/delete Unsinn beigebracht hat, Saures geben.
Ja, am besten den aktuellen Standard Draft und die C++ Core Guidelines ausdrucken und damit ordentlich verprügeln!!