problem mit meiner struktur



  • @MFK: danke für die antwort.

    for (i=0;i<2;i++)
    	{
    		MyTest.DecLayOR();
    		MyData.SetDat(i,MyTest);
    	}
    

    ich habe die main-funktion wie oben geändert. müsste ich dann noch eine funktion delete in 'cInDat' einfügen, um den zuvor geschaffenen speicherplatz wieder frei zu machen?

    DANKE.
    STICK.



  • Erstens: Wieso gibt dein GetINT() einen double zurück?

    Zweitens: An deiner Stelle würde ich die struct zu einer vollwertigen Klasse ausbauen - inklusive Konstruktor (anstelle der DecLayOR()-Methode), Cpy-Ctor und Destruktor (da gehört dann das delete[] rein).



  • @CStoll: danke für die hinweise.

    - die 'DecLayOR()-Methode' kann leider nicht in den Konstruktor, da der wert '2' (zeile 15) erst zuvor aus einer datei ausgelesen werden muss. danach wollte ich dann die 'DecLayOR()-Methode' aufrufen.
    - der hinweis mit dem delete[] im Destruktor ist gut, DANKE!

    STICK.

    p.s.:

    Erstens: Wieso gibt dein GetINT() einen double zurück?

    -> war ein versehen, da ich den code aus meiner original-datei herauskopiert und modifiziert habe.



  • stick_thai schrieb:

    @CStoll: danke für die hinweise.

    - die 'DecLayOR()-Methode' kann leider nicht in den Konstruktor, da der wert '2' (zeile 15) erst zuvor aus einer datei ausgelesen werden muss. danach wollte ich dann die 'DecLayOR()-Methode' aufrufen.

    Randfrage: Wie kommt der Wert dann in deine Methode rein?

    - der hinweis mit dem delete[] im Destruktor ist gut, DANKE!

    Aber dann solltest du auch darauf achten, daß dir niemand den Speicher weglöscht (sprich: Die Klasse braucht auch einen Copy-Ctor und operator=, der neuen Speicher anlegt und den Inhalt von itsINT kopiert).



  • so kommt der wert in die methode:

    class cInDat
    {
    	public:
    		cInDat::cInDat()
    		{
    			Bord = 0;
    		}
    		cInDat::~cInDat()
    		{}
    		void	SetINT (int i, int zahl)
    		{
    			itsINT[i] = zahl;
    		}
    		void	SetBord (int i)
    		{
    			Bord = i;			
    		}
    		double	GetINT (int i) const
    		{
    			return itsINT[i];
    		}
    		void	DecLayOR ()
    		{
    			if (0 != Bord)
    			{
    				int i;
    				itsINT = new int [Bord];
    				for (i=0;i<Bord;i++)
    					itsINT[i] = -1;
    			}
    		}
    	private:
    		int		Bord;
    		int		*itsINT;
    };
    

    Aber dann solltest du auch darauf achten, daß dir niemand den Speicher weglöscht

    das muss ich mir erstmal irgendwo durchlesen, denn das verstehe ich so nicht.

    STICK.



  • Warum benutzt du statt diesem unhandlichen int-Zeiger nicht einfach vector<int>?



  • an MFK:
    einen einfachen vector kann ich deshalb nicht nehmen, weil mein beispiel in wirklichkeit nicht ein eindimensionales array ist, sondern wie du unten siehst, 4-dimensional.

    int  itsINT[4];
    		int ****itsLayINT;
    

    ich wüsste nicht, wie dies mit einem vector umzusetzen geht.

    vielleicht hast du nen tipp?
    STICK.



  • an MFK:
    einen einfachen vector kann ich deshalb nicht nehmen, weil mein beispiel in wirklichkeit nicht ein eindimensionales array ist, sondern wie du unten siehst, 4-dimensional.

    int  itsINT[4];
    		cCoo ****itsLayINT;
    

    ich wüsste nicht, wie dies mit einem vector umzusetzen geht.

    vielleicht hast du nen tipp?
    STICK.



  • Du kannst auch mehrdimensionale vector'en aufbauen - vector<vector<int> > oder noch größer.

    (und wenn das Feld "rechteckig" sein soll, könntest du auch einen eindimensionalen vector<> verwenden und den Index passend umrechnen)

    Aber dann solltest du auch darauf achten, daß dir niemand den Speicher weglöscht

    das muss ich mir erstmal irgendwo durchlesen, denn das verstehe ich so nicht.

    Im Klartext: die Standard-Zuweisungen, die dir dein Compiler spendiert, kopieren flach (also nur die Zeigeradresse). Damit verwenden nach der Zuweisung Original und Kopie die selben Daten (das führt erstens zu Problemen, wenn sie sich gegenseitig beeinflussen und zweitens zu Zugriffsfehlern, wenn beide versuchen, den selben Block freizugeben - letzteres ist schwerwiegender).
    Aus dem Grund mußt du, wenn du mit dynamischem Speicher hantierst, meistens den Copy-Ctor (cInDat(const cInDat& other);) und Zuweisungs-Operator (cInDat& operator=(const cInDat& other);) selber definieren, damit sie eine tiefe Kopie ihres Inhalts durchführen können.



  • an CStoll:

    und wenn ich anstelle des zeigers einen vector benutze, dann kann ich mir Copy-Ctor und Zuweisungs-Operator sparen und meine klasse wird etwas einfacher, richtig?

    STICK.


Anmelden zum Antworten