Eine Funktion in einer Funktion aufrufen



  • Hallo,
    hab ein Problem in einer SDI-Anwendung, das für die meisten hier wahrscheinlich keines ist.
    Ich möchte eine Funktion in einer Funktion aufrufen.
    Bedeutet das ich eine Funktion habe die ich durch einen Klick im Menü starte:
    void CMainFrame::OnMemGetSave()
    Diese Funktion soll eine Datei abspeichern. Dazu muss aber erst eine andere Funktion in einer anderen .cpp-Datei ausgeführt werden. Die Funktion heißt:
    void CSpeicher::ReadWriteEepromManuell(void)

    Ich dachte ich mach es so:
    CSpeicher SPc;
    SPc.ReadWriteEepromManuell();
    Ist das richtig?

    Muss ich noch irgendetwas in die Headerdatei der zu aufrufenden Funktion eintragen? Oder in der Headerdatei bei der "class CSpeicher"?

    Das Programm startet so, allerdings bekomme ich einen Assertion Failed?
    File: winocc.cpp
    Line: 76

    Bin bei jeder Hilfe sehr dankbar.

    Gruß Gabele


  • Mod

    Bei weclhem Aufruf passiert das. Dieser Fehler bedeuetet meistens, dass Du ein Objekt verwednen, willst zu dem kein Control ereugt wurde.
    Beispiel: Wenn Du ein CDialog Objekt hast, heißt dies nicht, dass auch die Control "gerade" existieren oder das Fenster selbst. Erst nach Aufruf von DoModal und Ablauf von OnInitDialog sind die Controls vorhanden!



  • gabele schrieb:

    CSpeicher SPc;
    SPc.ReadWriteEepromManuell();
    Ist das richtig?

    Kommt drauf an. Wenn CSpeicher nur ein Container für diese Methode ist (dann stellt sich allerdings die Frage, warum es diese Klasse überhaupt gibt), dann ist das in Ordnung.

    Die Fehlermeldung scheint aber eher darauf hinzudeuten, dass das eine Fensterklasse ist, die (warum auch immer) diese Methode hat. Von solchen Klassen darfst du nicht einfach so Objekte anlegen und erwarten, dass das funktioniert.



  • Also ich möchte durch einen KLick im Menü eine Datei Speichern. Dafür wird erst einmal der Datei-Speicher-Dialog geöffnet. Danach will ich diese andere Funktion ausführen.
    void CMainFrame::OnMemGetSave()
    {
    CFileDialog fileDlg(FALSE, ".bin", NULL, 0, "Binärdatei (.bin)|.bin|All Files (.)|.||");

    fileDlg.DoModal();
    CString pfad = fileDlg.GetPathName ();
    CSpeicher cSp;
    cSp.ReadWriteEepromManuell();
    ...

    Deswegen ist es eine Fensterklasse, oder? Also kann man das nicht so machen?
    Ich denke nicht das CSpeicher ein Container ist. In CSpeicher werden Daten von einem externen Gerät empfangen.
    Hoffe ihr könnt mir vielleicht doch nochmal helfen, danke!

    Gruß gabele



  • gabele schrieb:

    Deswegen ist es eine Fensterklasse, oder?

    Keine Ahnung. Aus dem gezeigten Code kann man das nicht erkennen. Nur du kennst diese Klasse. Ist das alles, was du mit der Klasse machst? Wie sieht die Definition der Klasse aus?



  • wie ist denn die klassendeklaration von CSpeicher ?
    wenn diese von CDialog oder aehnliches ableitet ist es eine fensterklasse {o;



  • Ja denk schon das CSpeicher von CDialog abgeleitet ist, da die Funktion "void CSpeicher::ReadWriteEepromManuell(void)" in der dialog.cpp-Datei steht und in der dialog.h-Datei folgendes drin steht:
    class CSpeicher : public CDialog
    { ...

    die FUnktion die ich manuell starte steht in der MainFrm.cpp.
    Sorry das ich so schwer von begriff bin.



  • Also da mir so keiner weiter helfen kann, beschreib ich mein Problem nochmal anderst.
    Ich kann in einer Funktion eine andere Funktion aufrufen, wenn diese sich in der gleichen cpp-Datei befindet. Ist die aufzurufende Funktion aber in einer anderen cpp-Datei dann bekomme ich einen Assertion Failed (wie im ersten Beitrag beschrieben).
    Eiegentlich dürfte das doch nicht so schwierig sein, oder?
    Wäre sehr nett, wenn mir jemand helfen könnte.

    Gruß Gabele



  • gabele schrieb:

    Also da mir so keiner weiter helfen kann, beschreib ich mein Problem nochmal anderst.

    http://www.duden.de/suche/index.php?begriff=anderst&bereich=mixed&pneu=

    gabele schrieb:

    Eiegentlich dürfte das doch nicht so schwierig sein, oder?

    Das Problem ist, dass du da keine Funktion hast, sondern eine Methode einer Dialogklasse. Und da diese Methode offenbar versucht, auf die Steuerelemente des Dialogs zuzugreifen, kannst du nicht einfach eine Instanz dieser Klasse erzeugen und die Methode aufrufen, sondern musst entweder den Dialog ordentlich darstellen oder die Funktionalität vom UI entkoppeln.



  • HI,
    also erst mal merci MFK, dank dir weiß ich jetzt das ich die ganze Zeit das Falsche gesucht hab. Aber leider versteh ich nicht alles was du mir sagen willst.
    Was meinst du mit, die Funktionalität vom UI entkoppeln?
    Mit Dialog darstellen meinst du den Programmiercode posten, oder?

    Gruß gabele



  • Zeig bitte mal die relevanten Teile der Definition von CSpeicher und CSpeicher::ReadWriteEepromManuell.



  • und ich möchte eben diese Methode aus einer anderen cpp-Datei starten.
    Ich mach das so:
    CSpeicher cSp;
    cSp.ReadWriteEepromManuell();
    und sobald er das aufruft, kommt der Assertion Failed.
    Danke für deine Hilfe!



  • Siehst du die Aufrufe von GetDlgItem?

    Du greifst in der Methode auf die Steuerelemente IDC_EDIT1 und IDC_LIST1 zu. Wie soll das funktionieren, wenn der Dialog nicht angezeigt wird?

    Soll der Dialog denn an dieser Stelle angezeigt werden?

    P.S.: Und benutzt bitte cpp-Tags, wenn du Code postest.



  • achso ja klar! Jetzt hab ich´s hinbekommen.
    Vielen Dank!

    Gruß gabele


Anmelden zum Antworten