Fehler bei der Übergabe von mehrdimensionalen Arrays
-
Hallo ich schon wieder

Auf meinen kleinen Schritten in C++ schaffe ich es immer wieder, Fehler zu produzieren und brauche eure Hilfe.Ich habe ein kleines Programm geschrieben für das Adams-Bashforth-Verfahren.
Es klappt bis jetzt alles super. Jedoch will ich nun bei dem Aufruf des Verfahrens die Ordnung übergeben (Die Schritte, die er mitnimmt bei der Berechnung) und so eine Adams-Funktion für die verschiedenen Ordnung schreiben.Die ersten 4 Schritte werden mit den Runge-Kutta-Verfahren gemacht und dann geht es mit dem Adams los.
Jedoch in Zeile 8, bei Aufruf der AdamsOrder-Funktion, zeigt er mir diesen Fehler an:
Fehler: cannot convert 'double ()[(<anonymous> + 1)]' to 'double ()[0]' for argument '2' to 'double AdamsOrder(anm::adams, double (*)[0], unsigned int)'
x->at(b)=adamsxv.getM_y0(b)+ AdamsOrder(adamsxv,SpeicherMKVA,b);
^Ist die Übergabe des Arrays-SpeicherMKVA in Zeile 38 so in Ordnung?
Vielleicht kann einer mir ja helfen. Und wer Verbesserungsvorschläge hat. Immer her damit. Ich bin wissbegierig.
Vorsicht Code!
for(int i=4; i<n; ++i) // Adams-Bashforth-Algorithmus { bewegungsDGL(M, MinvK, f, x, a); for(unsigned int b=0; b<adamsva.getM_size() ; b++) { adamsxv.setM_k1(b,adamsxv.getM_h()*v->at(b)); x->at(b)=adamsxv.getM_y0(b)+ AdamsOrder(adamsxv,SpeicherMKVA,b); // Hier zeigt er mit den Fehler an. adamsxv.setM_y0(b,x->at(b)); SpeicherMKXV[4][b]=SpeicherMKXV[3][b]; // Verschiebung der gespeicherten Steigungswerte SpeicherMKXV[3][b]=SpeicherMKXV[2][b]; SpeicherMKXV[2][b]=SpeicherMKXV[1][b]; SpeicherMKXV[0][b]=adamsxv.getM_k1(b); // Specherung des aktuellen Werts } for(unsigned int b=0; b<adamsva.getM_size() ; b++) { adamsva.setM_k1(b,adamsva.getM_h()*a->at(b)); v->at(b)=adamsva.getM_y0(b)+(1901.*adamsva.getM_k1(b)-2774.*SpeicherMKVA[0][b]+2616.*SpeicherMKVA[1][b]-1274.*SpeicherMKVA[2][b]+251.*SpeicherMKVA[3][b])/720.; adamsva.setM_y0(b,v->at(b)); SpeicherMKVA[4][b]=SpeicherMKVA[3][b]; // Verschiebung der gespeicherten Steigungswerte SpeicherMKVA[3][b]=SpeicherMKVA[2][b]; SpeicherMKVA[2][b]=SpeicherMKVA[1][b]; SpeicherMKVA[0][b]=adamsxv.getM_k1(b); // Specherung des aktuellen Werts } myfile <<0.0<<" "<<x->at(fn)<<" "<<v->at(fn)<<" "<<a->at(fn)<<"\n"; } solve.endTiming(); myfile << "solved in "<<solve.getDuration()<< " sec\n"; myfile.close(); cout << "solved in "<<solve.getDuration()<< " sec\n"; } double AdamsOrder(adams o, double **SpeicherMKVA, unsigned int j) { int Order=5; switch ( Order ) { case '1': return o.getM_k1(j); case '2': return (3.*o.getM_k1(j)-SpeicherMKVA[0][j])/2.; case '3': return (23.*o.getM_k1(j)-16.*SpeicherMKVA[0][j]+5.*SpeicherMKVA[1][j])/12.; case '4': return (55.*o.getM_k1(j)-59.*SpeicherMKVA[0][j]+37.*SpeicherMKVA[1][j]-9.*SpeicherMKVA[2][j])/24.; case '5': return +1901./720.*o.getM_k1(j)-1387./360.*SpeicherMKVA[0][j]+109./30.*SpeicherMKVA[1][j]-637./360.*SpeicherMKVA[2][j]+251./720.*SpeicherMKVA[3][j]; default: return 0; } }
-
Wie ist denn SpeicherMKVA definiert?
Ein 2D-Array zerfällt nicht (bei der angabe des Namens) in einen Doppelzeiger.
-
In https://www.c-plusplus.net/forum/330844 gabs ein ähnliches Problem (Zweidimensionales char-Array an Funktion übergeben)
-
SpeicherMKVA wird so definiert: double SpeicherMKVA[n][j]
Danke,i ch werde mir es mal später durchlesen.
-
hmm ich hab jetzt den Code wie du gesagt hast umgeschrieben.
double AdamsOrder(adams o, double SpeicherMKVA[][2], unsigned int j){... }AdamsOrder(adamsxv,SpeicherMKXV,b);Jedoch zeigt er mir immernoch beim Aufruf der Funktion die gleiche Fehlermeldung wie Oben. Ein anderer Code den ich zum probieren benutzt hab klappt da einwandfrei.
void function(int feld[][DIM2], int dim1) { int i, j; for(i = 0; i < dim1; i++) { for(j = 0; j < DIM2; j++) { printf("%d; ", feld[i][j]); } printf("\n"); } printf("\n"); } int main(void) { int val[DIM1][DIM2]; int i, j; for(i = 0; i < DIM1; i++) for(j = 0; j < DIM2; j++) val[i][j] = i+j; function(val, DIM1); return EXIT_SUCCESS; }
-
binhbob schrieb:
SpeicherMKVA wird so definiert: double SpeicherMKVA[n][j]
lol
Gefragt war, wie die Definition aussieht. Was soll n,j sein?
Laufzeitkonstanten?
Compilezeitkonstanten?
Variablen?Lies dir die Fragen durch, bevor du unsinnige Antworten gibst die nur wieder neue Fragen aufwerfen.
-
Irgendwie ist mir das zu blöd. https://www.c-plusplus.net/forum/304133
-
Danke für eure Hilfe ich habe es nun gelöst bekommen.
Das Problem war, dass die "Dimension" der Spalte unterschiedlich war.
-
Liest du auch mal deinen eigenen Code? Beispielsweise die Zeile 4?
-
Ja grad selbst gemerkt
