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.


  • Mod

    Liest du auch mal deinen eigenen Code? Beispielsweise die Zeile 4?



  • Ja grad selbst gemerkt 🙂


Anmelden zum Antworten