Array von Funktionspointern auf eine Funktion deklarieren, die selbst aus einem Array besteht?



  • Moin,
    in so kurzer Zeit schon mein 2. Thread. Diesmal die Frage (denn habe bei google noch nix adaequates gefunden):

    Ich habe ein multidim. Funktionspointerarray

    double (*Christoffelp[4][4][4])(double, double, double, double, double, double);
    

    welches auf die Funktion

    double Christoffel_schw(double x, double y, double z, double r, double a, double M){
    

    zeigen soll, wobei die Funktion lediglich ein Array deklariert, naemlich:

    double Schw[4][4][4]=List(List(List(0,0,0,0),List(...
    

    also ein ebenfalls multidim. Array.
    Warum ich das mache ist ganz einfach: ich habe viele verschiedene solche grossen Arrays und waehle zu Beginn eins aus, schreibe dann aber alle Funktionen allgemein, s.d. ich stets nur mit dem Pointer arbeiten moechte!
    Nur leider gelingt es mir nicht.
    Wie funktioniert das also mit der Zuweisung?
    Und ja, das Trivialste habe ich bereits probiert:

    Christoffelp[0][0][0]= Christoffel_schw;
    

    logischerweise erhalte ich so in Christoffelp[0][0][0] das letzte Element in der Deklaration von Christoffel_schw. was also tun?



  • Renscher schrieb:

    Ich habe ein multidim. Funktionspointerarray

    double (*Christoffelp[4][4][4])(double, double, double, double, double, double);
    

    Ok, klar soweit.

    Renscher schrieb:

    welches auf die Funktion

    double Christoffel_schw(double x, double y, double z, double r, double a, double M){
    

    zeigen soll,

    Ein Array kann nicht auf eine Funktion zeigen. Willst Du die 4*4*4 Zeiger Deines Arrays so initialisieren, dass sie alle auf Christoffel_schw zeigen?

    Renscher schrieb:

    wobei die Funktion lediglich ein Array deklariert, naemlich:

    double Schw[4][4][4]=List(List(List(0,0,0,0),List(...
    

    also ein ebenfalls multidim. Array.

    Das verstehe ich nicht. Was genau meinst Du?

    Renscher schrieb:

    Warum ich das mache ist ganz einfach: ich habe viele verschiedene solche grossen Arrays und waehle zu Beginn eins aus, schreibe dann aber alle Funktionen allgemein, s.d. ich stets nur mit dem Pointer arbeiten moechte!
    Nur leider gelingt es mir nicht.

    Versuch das nochmal mit anderen Worten zu erklären. Mir ist nicht klar, was Du willst.

    kk



  • Ich verstehe nicht, was dein Problem ist. Bei mir funktioniert es problemlos:

    #include <iostream>
    using namespace std;
    
    double (*Christoffelp[4][4][4])(double, double, double, double, double, double);
    double Christoffel_schw(double x, double y, double z, double r, double a, double M)
    {
        return 1337;
    }
    
    int main(])
    {
        Christoffelp[0][0][0] = &Christoffel_schw;
        cout << Christoffelp[0][0][0](0, 1, 2, 3, 4, 5);
    	return 0;
    }
    

    Welchen Compiler benutzt du denn?

    MFG



  • K, dachte mir, dass das nicht so leicht zu verstehen war. Deswegen habe ichs wohl auch nicht bei Google gefunden, weil ich mir nicht klar bin, was ich eigentlich realisieren will. Also:

    @rant: Dein Beispiel funktioniert natuerlich, da du nur 1 explizites element zuweist und das testest. Verwendest du fuer deine Ausgabe hingegen:

    Christoffelp[0][0][0]= Christoffel_schw;
      for(int i=0;i<4;i++){ //tests the Christoffelsymbols
        for(int j=0;j<4;j++){
          for(int k=0;k<4;k++){
    	std::cout <<  Christoffelp[i][j][k](2.,2.,2.,sqrt(12.),0,3) << std::endl;
         }
       }
     }
    

    So funktioniert dies natuerlich nicht, da ja das 1. element zugewiesen ist Christoffelp[0][0][0], jedoch die anderen nicht, auf die ich ja zugreifen will.

    @Kruemelkacker (nice nick);

    krümelkacker schrieb:

    Ein Array kann nicht auf eine Funktion zeigen. Willst Du die 4*4*4 Zeiger Deines Arrays so initialisieren, dass sie alle auf Christoffel_schw zeigen?

    Genau da liegt der Hase im Pfeffer. Ich moechte eigentlich, dass der Funktionspointer auf die Funktion Christoffel_schw zeigt, aber mein eigentliches Ziel ist, dass z.B. Christoffelp[0][1][2]() auf Schw[0][1][2] zeigt etc! Damit haette ich in dem Pointer naemlich die Matrixelement von Schw verlinkt. Das Problem ist, dass bei jeder Iteration die Argumente von Christoffelp (also, x,y,z,...) veraendert werden. D.h. dieser Zugriff geschieht sehr oft. Ich hoffe, es ist klar, warum ich nicht explizit schleifen anlegen will, um alle Elemente immer einzeln zuzuweisen.
    Jetzt klarer?

    Edit: Also nochmal kurz: double Christoffel_schw() ist eine Funktion in der nur eine 4*4*4 matrix initialisiert wird, naemlich: Schw[][][] ! Mit dem Array von Funktionspointern Christoffelp[0][1][2]() moechte ich gerne auf die in Christoffel_schw() deklarierten Elemente von Schw[][][] zugreifen, aber wie?



  • Renscher schrieb:

    Genau da liegt der Hase im Pfeffer. Ich moechte eigentlich, dass der Funktionspointer auf die Funktion Christoffel_schw zeigt, aber mein eigentliches Ziel ist, dass z.B. Christoffelp[0][1][2]() auf Schw[0][1][2] zeigt etc! Damit haette ich in dem Pointer naemlich die Matrixelement von Schw verlinkt. Das Problem ist, dass bei jeder Iteration die Argumente von Christoffelp (also, x,y,z,...) veraendert werden. D.h. dieser Zugriff geschieht sehr oft. Ich hoffe, es ist klar, warum ich nicht explizit schleifen anlegen will, um alle Elemente immer einzeln zuzuweisen.
    Jetzt klarer?

    Edit: Also nochmal kurz: double Christoffel_schw() ist eine Funktion in der nur eine 4*4*4 matrix initialisiert wird, naemlich: Schw[][][] ! Mit dem Array von Funktionspointern Christoffelp[0][1][2]() moechte ich gerne auf die in Christoffel_schw() deklarierten Elemente von Schw[][][] zugreifen, aber wie?

    Das geht gar nicht. Woher soll denn die Funktion wissen, in welchen Element der Matrix der Pointer gespeichert war, über den Du die Funktion aufgerufen hast?

    Außerdem was versprichst Du Dir den von so einer verqueren Logik?

    mfg Martin



  • Renscher schrieb:

    Genau da liegt der Hase im Pfeffer. Ich moechte eigentlich, dass der Funktionspointer auf die Funktion Christoffel_schw zeigt, aber mein eigentliches Ziel ist, dass z.B. Christoffelp[0][1][2]() auf Schw[0][1][2] zeigt etc!

    Christoffelp[0][1][2] ist vom Typ double(*)(double,...,double) .
    Schw[0][1][2] ist vom Typ double .
    &Schw[0][1][2] ist vom Typ double* .
    Diese Zeigertypen passen also nicht zusammen.

    Renscher schrieb:

    Jetzt klarer?

    Etwas. Ich seh' nur den Sinn darin nicht.

    Renscher schrieb:

    Edit: Also nochmal kurz: double Christoffel_schw() ist eine Funktion in der nur eine 4*4*4 matrix initialisiert wird, naemlich: Schw[][][] ! Mit dem Array von Funktionspointern Christoffelp[0][1][2]() moechte ich gerne auf die in Christoffel_schw() deklarierten Elemente von Schw[][][] zugreifen, aber wie?

    Zeig doch mal die Definition der Funktion Christoffel_schw.



  • Is kompliziert, geb ich zu!
    Was waere denn ne leichtere Variante?
    Also ich moechte halt meinen Quellcode so schreiben, dass ich mittendrin immer ne Funktion aufrufe, Christoffelp[0][1][2](x,y,z,a,b). Die bekommt bei jedem Durchlauf neue Werte x,y,z,a,b und ich brauche immer alle Matrixelemente neu berechnet.
    Das Problem ist, dass ich eben nicht nur eine Matrixmoeglichkeit habe, sondern der Benutzer am Anfang die Matrix auswaehlt, mit der Gerechnet werden soll. Deswegen wollte ich das ueber diese komplizierte Zuordnung machen. Wie geht es denn leichter?

    Edit:

    Hier meine Definition:

    double Christoffel_schw(double x, double y, double z, double r, double a, double M){
    double Schw[4][4][4]=List(List(List(0,0,0,0),List(0,(-2*M*pow(r,2)*(pow(r,3) + 2*M*(1 + pow(r,2))*pow(y,2))*(pow(r,3) + 2*M*(1 + pow(r,2))*pow(z,2)))/
          (pow(r,10) - 16*pow(M,4)*pow(1 + pow(r,2),3)*pow(x,2)*pow(y,2)*pow(z,2) + 2*M*pow(r,9)*(-1 + pow(x,2) + pow(y,2) + pow(z,2)) + 
            8*pow(M,3)*r*pow(1 + pow(r,2),2)*(-2*pow(x,2)*pow(y,2)*pow(z,2) + 
               pow(r,2)*(-(pow(x,2)*pow(y,2)) + (-pow(..))...,...,...),List(...),List(...)),List(..),List(..),List(..))
    

    Es handelt sich hierbei um die Christoffelsymbole unter SChwarzschildloesung in numerisch angepassten coordinaten!

    Edit2:
    Da nun keiner weiter einen anderen Vorschlag hatte, habe ich mich fuer eine andere Loesung entschieden, in der ich die 4*4*4 Matrix an eine Unterfunktion uebergebe und dabei, ueber dei Adresse dieser Matrix, die Funktionswerte bleibend aendere. Trotzdem vielen dank fuer die Hilfe! 🙂


Anmelden zum Antworten