Importer:Error:WasEmpty



  • Hallo ihr Lieben,

    in meinen Hausaufgaben stehe ich gerade vor folgendem Problem:

    Erstmal die Aufgabenstellung:
    "Überladen Sie operator[] der Matrix-Klasse gemäß double* operator[](int i), so dass die jeweilige Zeile v[i] der Matrix in Form eines Arrays (Zeiger!) zurückgegeb en wird. Auf dieses kann dann wiederum mit einem Index zugegrien werden; insgesamt liefert der Aufruf von m[i][j] dann ein einzelnes Element in Zeile i, Spalte j der Matrix m."

    In der Variante, die keinen Compilierungsfehler produziert, erscheint beim Ausführen des Programms "Speicherzugriffsfehler (Speicherabzug geschrieben)".

    Hier noch mein derzeitiger Code (sinnvoll gekürzt):

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    class Matrix
    {
    	private:
        	double v[3][3];
      	public:
        	Matrix()
        	{
          		for (int i = 0; i < 3; ++i)
    		{	
    			for (int j = 0; j < 3; ++j)
    				v[i][j] = 0;
    		}
        	}
        	Matrix(const double aIn[3][3])
        	{
          		for (int i = 0; i < 3; ++i)
    		{	
    			for (int j = 0; j < 3; ++j)
    				v[i][j] = aIn[i][j];
    		}
        	}
    	double* operator[](const int i)
    	{
    		double *a[3];
    		for (int j = 0; j < 3; ++j)
    			*a[j] = v[i][j];
    		//return a;
    	}
    
    int main()
    {
    
    		const double a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
        		Matrix m(a);
        		cout  << m[1][1] << m[2][1] << m[3][1] << endl; // muesste "1 4 7" ausspucken
    }
    

    In einer anderen Variante wird der Speicherort der Variable angegeben (0x98236)
    Könnt ihr vielleicht meinen Denk-/Programmierfehler finden?

    Vielen Dank!

    Grüße,
    Basti

    PS: Ich arbeite momentan mit Ubuntu 12.04 LTS und GCC.


  • Mod

    Arrays fangen bei 0 an.

    edit: Und noch viel mehr. Du gibst gar nichts aus operator[] zurück. Und die auskommentierte Rückgabe gibt einen Zeiger auf eine (nicht mehr existierende) lokale Variable zurück.



  • SeppJ schrieb:

    Arrays fangen bei 0 an.

    edit: Und noch viel mehr. Du gibst gar nichts aus operator[] zurueck. Und die auskommentierte Rueckgabe gibt einen Zeiger auf eine (nicht mehr existierende) lokale Variable zurueck.

    Genau, und deshalb:

    double* operator[](const int i)
        {
            return &v[i][0];
        }
    

    - osdt



  • @ SeppJ
    Ersteres ist richtig und habe ich natürlich sofort geändert.
    Die Speicherüberlaufmeldung kam aber trotzdem noch.

    @osdt
    Dein Code macht genau das was ich will, obwohl ich überrascht bin, da ja &v[i][0] da steht und ich aber manchmal auch gern das zweite Element hätte. Dieses kommt aber wie gefordert, deshalb DANKE, auch wenn ich nicht verstehe, wieso das klappt.

    Grüße,
    Basti

    PS: Wieso funktioniert die Vorschaufunktion nicht? Da erscheint nur erneut dieses (Schreib-)Fenster, der Text ist weg und nur mit zurück wieder zu holen.


  • Mod

    Holzbasti schrieb:

    PS: Wieso funktioniert die Vorschaufunktion nicht? Da erscheint nur erneut dieses (Schreib-)Fenster, der Text ist weg und nur mit zurück wieder zu holen.

    Es gab neulich ein Notfallupdate der Forensoftware. Einiges funktioniert noch nicht wie gewohnt.


Log in to reply