Funktionszeiger - Problem



  • Hallo,

    bin Anfänger und erhalte bei der folgenden Zeile die Fehlermeldung:
    Konvertierung nicht möglich:

    m_ergebnis=integral(m_von, m_bis, m_formel);

    Kann mir jemand eine Tipp geben ?
    Schon mal herzlichen Dank

    oswald 🙄

    // IntegralDlg.cpp: Implementierungsdatei
    //
    [/code]
    #include "stdafx.h"
    #include "MATHEMATIK.h"
    #include "IntegralDlg.h"
    #include "iostream.h"
    #include "math.h"
    #ifdef DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE
    _;
    #endif
    _CRTIMP int __cdecl system(const char *);
    /////////////////////////////////////////////////////////////////////////////
    // Dialogfeld CIntegralDlg

    double integral (double a, double b, double (*f)(double) )
    {

    double c, simp_alt, simp_neu=0;
    int n = 8;
    do
    {

    simp_alt= simp_neu;
    double h = (b-a)/n;
    simp_neu=f(a)+f(b);
    c=2;
    for (int i = 1; i < n; i++)
    simp_neu += (c =6. - c)* f(a+i*h);
    simp_neu *= h/3;
    n *=2;
    }
    while (fabs(simp_neu - simp_alt) >= 1e-6 || n <= 1024);
    return simp_neu;
    }

    CIntegralDlg::CIntegralDlg(CWnd* pParent /=NULL/)
    : CDialog(CIntegralDlg::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CIntegralDlg)
    m_bis = 0.0;
    m_von = 0.0;
    m_ergebnis = 0.0;
    m_formel = _T("");
    //}}AFX_DATA_INIT
    }

    void CIntegralDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CIntegralDlg)
    DDX_Text(pDX, IDC_BIS, m_bis);
    DDX_Text(pDX, IDC_VON, m_von);
    DDX_Text(pDX, IDC_ERGEBNIS, m_ergebnis);
    DDX_Text(pDX, IDC_FORMEL, m_formel);
    //}}AFX_DATA_MAP
    }

    BEGIN_MESSAGE_MAP(CIntegralDlg, CDialog)
    //{{AFX_MSG_MAP(CIntegralDlg)
    ON_BN_CLICKED(IDC_BERECHNEN, OnBerechnen)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    /////////////////////////////////////////////////////////////////////////////
    // Behandlungsroutinen für Nachrichten CIntegralDlg

    void CIntegralDlg::OnBerechnen()
    {
    // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen

    UpdateData(true);

    m_ergebnis=integral(m_von, m_bis, m_formel);
    UpdateData(false);
    }
    [/code]



  • Die Typen sind falsch.
    die Funktion

    double integral (double a, double b, double (*f)(double) )
    

    erwartet einen Zeiger auf eine Funktion die double liefert und double übergeben bekommt.
    Du übergibst aber die Membervariable m_Formel die offensichtlich ein String ist, kann ja nicht funktionieren.
    Mußt schon erklären was du mit

    double (*f)(double)
    

    machen willst.



  • Danke für den Hinweis.
    Die Membervariable wird in der Tat als String übergeben. Der Inhalt dieses Strings soll die zu integrierende Funktion darstellen, z.B. x*x-2*x;

    Auch wenn also schreibe
    double integral(double,a, double b, double (*f)(CString))
    bekomme ich die gleiche Meldung, daß eine Konvertierung nicht möglivh ist.

    Ich möchte eine beliebige Funktion zur num. Integration weitergeben.
    Es wäre kein Problem, wenn ich
    zunächst wie z.B. folgt schreiben würde:

    [/code="C++"]
    typedef double (*formel)(double);

    double formula(double x)
    {
    if (x == 0)
    return 1;
    else
    return sin(x)/);
    }

    double integral(double a, double b, formel f)
    {
    usw.
    }

    und dann

    m_ergebnis = integral(m_von,m_bis,formula);
    [/code]

    Allerdings müsste ich dann für jede Funktion neu kompilieren und das will ich nicht.

    Ich hoffe, daß mein Problem jetzt klar dargestellt ist.
    Vieleicht muss ich völlig anders programmieren ?

    oswald



  • Ooooh, ich glaube du hast Zeiger auf C++-Unterprogramme(Funktionen/Methoden) mit Zeiger auf einen String der den Text einer math. Formel enthält verwechselt. Um einen String der eine Formel enthält in deinem Programm zu interpretieren benötigst du einen Parser. Such mal in der FAQ und in den Tutorials nach Funktionszeiger.



  • Hallo chefe,
    herzlichen Dank für diesen wertvollen Hinweis!
    Ich kenne eine Parserfunktion nur aus C++.net, wo sie sehr einfach anzuwenden
    ist. In VC++ scheint mir das 'parsen' schon ein höherer Schwierigkeitsgrad zu sein.
    Ich schaue jetzt zunächst mal im Internet nach, ob ich eine verwertbare Routine
    finden kann. Ansonsten muss ich mein Projekt wohl aufgeben.

    Nochmals danke.

    oswald (wer immer strebend sich bemüht......)


Anmelden zum Antworten