Probleme mit Pointern



  • Hallo!
    Wir fangen grade in der Schule mit Pointern an und haben eine Aufgabe bekommen, die ich nicht zum laufen kriege.
    Wir sollen ein 2 dimensionales Array einlesen und dann mithilfe einer funktion jedes Feld um 2 erhöhen.
    meine Funktion sieht wie folgt aus:

    void erhoehe(double *p_matrix, int zeilen, int spalten)
    {
        int x;
        for(int i=0; i<zeilen; i++)
        {
            for(x=0; x<spalten; x++)
            {
                    p_matrix[i][x] += 2;//<---hier liegt der Fehler
            }
        }    
    }
    

    Die Funktion selbst rufe ich so auf:

    double matrix[3][3];
        double *p_matrix = &matrix[0][0];
        int x;
    
        cout<<"Bitte geben sie hier die Werte ein (Nur Double erlaubt!): "<<endl;
        for(int i=0; i<3; i++)
        {
            for(x=0; x<3; x++)
            {
                cout<<"matrix["<<i<<"]["<<x<<"] = ";
                cin>>matrix[i][x];
            }
        }
    
        erhoehe(p_matrix, 3, 3);
    

    Und das ist der Fehler:

    invalid types `double[int]' for array subscript
    

    Ich weiß wirklich nicht woran das liegt.
    es wäre wirklich nett wenn mir jemand sagen könnte warum das nicht so funktioniert und wie ich es besser machen soll.

    mfg



  • es muss

    void erhoehe(double **p_matrix, int zeilen, int spalten)
    

    heißen, (2 Mal '*', d.h. doppelpointer). Und das
    "double *p_matrix = &matrix[0][0];"
    kannst du dir sparen. Das ist an der Stelle unnötig.

    btw: dein Code ist C++ und du bist im ANSI C Forum



  • supertux schrieb:

    es muss

    void erhoehe(double **p_matrix, int zeilen, int spalten)
    

    heißen, (2 Mal '*', d.h. doppelpointer).

    Ermm, nö. Das würde bei einem double[3][3] auch nicht hinhauen. Vielmehr müsste es so aussehen:

    void erhoehe(double p_matrix[][3], int zeilen, int spalten)
    // oder äquivalent
    void erhoehe(double (*p_matrix)[3], int zeilen, int spalten)
    


  • Dann hat die Spaltenangabe ja keinen Sinn oO

    Edit:
    Hier mal die genaue Aufgabe auf dem Blatt:
    Schreibe ein Programm, welches eine 3*3 Matrix einliest, in einer Funktion "void erhoehe (double *p_matrix, int zeilen, int spalten)" jedes Element um 2 erhöht und die neue Matrix wieder ausgibt!

    Edit2:
    Alle hier vorgeschlagenen Lösungen funktionieren leider nicht...

    24 E:\C++\Schule\Erhoehe\main.cpp cannot convert `double*' to `double (*)[3]' for argument `1' to `void erhoehe(double (*)[3], int, int)'
    


  • Hi Bruder !

    void InKrEmEnTor( double* matrix, int m, int n )
    {
    	int i, j;
    
    	for ( i=0; i<m; i++ )
    		for ( j=0; j<n; j++ )
    			matrix[i*n+j] += 2.0;
    }
    int main()
    {
        double matrix[3][3] = {0};
    	InKrEmEnTor( matrix[0], 3, 3 );
    	return 0;
    }
    

    Das Einlesen kriegst du selber hin, ne ?
    Alternativ kannst du in der for Schleife auch die Zeigerschreibweise benutzern: (matrix + in + j ) += 2.0;

    Du kompilierst überigens im C++ Modus, weil deine Datei die C++ Erweiterung hat (*.cpp)
    Da läuft dann einiges anders, z.B. musst du da malloc casten usw....
    Für C Programme muttu main.c haben.



  • Big Brother schrieb:

    void InKrEmEnTor( double* matrix, int m, int n )
    {
    int i, j;

    for ( i=0; i<m; i++ )
    for ( j=0; j<n; j++ )
    matrix[i*n+j] += 2.0;
    }
    [/cpp]

    lass es doch eindimensional, z.b.:

    void InKrEmEnTor (double* matrix, int m, int n)
    {
       int i = m * n;
       while (i--)
          matrix[i] += 2.0;
    }
    

    🙂



  • 1D-freak schrieb:

    void InKrEmEnTor (double* matrix, int m, int n)
    {
       int i = m * n;
       while (i--)
          matrix[i] += 2.0;
    }
    

    🙂

    👍

    Aber so weiß er jetzt wenigstens, wie man flexibel die einzelnen Matrixelemente adressieren kann, ohne einen Parameter-Index in einer Funktion 'festzubrennen'.



  • Ah danke!
    Hättet mir ja auch einfach sagen können, dass man es dann als 1-dimensionales Array behandeln sollte weil die Feldaddressen hintereinander liegen ^^
    Dank euch hab ich mal wieder was gelernt!

    mfg



  • Tim schrieb:

    Ermm, nö. Das würde bei einem double[3][3] auch nicht hinhauen.

    hmm, stimmt tatsächlich, sowas ist mir noch nie über den Weg gelaufen (musste nie mit Matrizen oder sowas richtig programmieren). Im borad fehlt ein *schähm-mich-smily* 😉


Anmelden zum Antworten