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 subscriptIch 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*
