tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
16
ZUGRIFFE
715
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Hallo,

    ich möchte gerne eine void Funktion als Funktionsparameter übergeben, also:
    Code cpp:
    1
    
    void Funktion(void Parameter());
    Wenn ich jetzt die Funktion aufrufe bekomme ich folgende Fehlermeldung:
    "Error: Das Argument vo Typ ""void"" ist mit dem Parameter vom Typ ""void (*)()"" inkompatibel."
    Ich habe schon alles mögliche ausprobiert, aber der Compiler gibt immer eine andere Fehlermeldung aus.

    Vielen Danke für eure Hilfe.
     

  2. #2
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.516
    Was genau hast du eigentlich damit vor? Willst du einen void-Pointer übergeben oder einen Funktionszeiger? Willst du innerhalb von "Funktion" die Funktion "Parameter" aufrufen, oder was genau ist das Ziel?
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  3. #3
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Ich möchte diese Funktion in einer externen Datei haben. Deshalb dürfen keine Variablen definiert sein und ich muss alles mit Paramter machen.
     

  4. #4
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.516
    Wie, was meinst du mit "externe Datei"? Wenn du eine Funktion in der Source-Datei a.c implementiert hast, hast du sicherlich auch eine a.h. Diese a.h beinhaltet dann den Prototypen von deiner Funktion. Dann kannst du die a.h in der b.c includen und die Funktion in b.c aufrufen.

    Ich verstehe den Sinn hinter deinem Vorhaben nicht.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  5. #5
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Richtig, ich habe auch eine Headerdatei, allerdings möchte ich diese Datei auch in anderen Projekten öffnen können und es wäre auf jeden Fall vorteilhaft. Außerdem arbeite ich mit StdAfx und ich laufe Gefahr, dass sich machne Dateien selbst includieren.
     

  6. #6
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    Aber trotzdem bleibt die Frage, was du jetzt machen willst? Willst du den Rückgabewert der Funktion übergeben? Oder einen Funktionszeiger?
     

  7. #7
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Ich möchte die ganze Funktion übergeben, nicht den Rückgabewert, so dass innerhalb dieser Funktion dann diese Funktion aufgerufen werden kann.
     

  8. #8
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    void paramfunk();
     
    void funk(void(*x)())
    {
        x();
    }
     
    ....
     
    funk(paramfunk);

    Gruß
    üäpöol bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  9. #9
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    Das funktioniert mit einem Zeiger auf die Funktion:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    #include <stdio.h>
     
    void Parameter()    // Definition der ersten Funktion
    {
        printf ("Erfolgreich!\n");
    }
     
    void Funktion (void (*funcptr) ())   // Zweite Funktion. Sie hat einen Zeiger auf eine Funktion als Parameter. void bedeutet, der Rückgabewert der Funktion, auf der der Zeiger zeigt ist void. (*funcptr) ist sein name (unbedingt in Klammern!) und die nächste Klammern sind die Argumente, die die Funktion bekommt (nur die Datentypen, wie bei einer Funktionsdeklaration).
    {
        printf ("Aufrufen der anderen Funktion: ");
     
        (*funcptr) ();    // So wird die Funktion aufgerufen, auf die der Funktionszeiger zeigt
     
        printf ("Exit!\n");
    }
     
    int main()
    {
        void (*ptr) () = Parameter;   // Der Funktionszeiger ptr zeigt auf die Adresse der Funktion Parameter
     
        Funktion (ptr);     // Die Funktion wird mit dem Funktionszeiger aufgerufen
    }
    Geändert von ibafluss (30.12.11 um 11:35 Uhr)
    üäpöol bedankt sich. 

  10. #10
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Leider funktioniert eure Lösung nicht. Ich bekomme folgende Fehlermeldung: "Error: Das Argument vom Typ void(*)() ist it dem Parameter vom Typ void(*(*)())() inkompatibel.". Kann das damit etwas damit zu tu haben, dass ich in C++ programmiere oder ein Win32 Projekt habe?! Eigentlich nicht.

    EDIT:
    Konvertierung des Parameters 6 von 'void (__cdecl *)(void)' in 'void (__cdecl *(__cdecl *)(void))(void)' nicht möglich
    wird auch als Fehlermeldung angezeigt.
    Geändert von üäpöol (31.12.11 um 17:06 Uhr)
     

  11. #11
    Avatar von ComFreek
    ComFreek ComFreek ist offline [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.358
    Blog-Einträge
    4
    Welchen Compiler verwendest du denn? Hast du den Code genau übernommen?

    Mit GCC klappt es wunderbar bei mir, aber auch online auf Codepad.org: http://codepad.org/RP9C0eTv.
     
    mfg ComFreek

    Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
    Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
    [PHP] Überprüfen, ob Website erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  12. #12
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Den Code habe ich so nicht übermommen, aber meinen nach diesrsem Prinzip angepasst.
    Ich verwende den Mircosoft Visual Studio 2010 C++ Express. (Ich programmiere auch in C++), aber C Code macht ja nochts.
     

  13. #13
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.516
    Zeig doch mal deinen Code.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  14. #14
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Na schön, ich kürze das ganze allerdings das Ganze gewaltig, weil ein knapp 2000 Zeilen Code wohl ein bisschen zu viel sind.

    MAIN.CPP
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    #include "StdAfx.h"
    ...
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
         void (*fnc) () = Parameter;
         ...
         case WM_LBUTTOPNDOWN:
              Funktion(fnc);
              ...
    }
    ...

    StdAfx.h
    Code cpp:
    1
    2
    3
    
    ...
    #include "Datei.h"
    ...

    Datei.h
    Code cpp:
    1
    2
    3
    
    ...
    void Funktion(void (*Parameter())());
    ...

    Datei.cpp
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    
    ...
    void Funktion(void (*Parameter())()) {
         ...
         Parameter();
         ....
    }
    ...
    Ich hoffe das ist genügend Code.
    Danke für eure Hilfe.
    Geändert von üäpöol (19.05.12 um 19:01 Uhr) Grund: Wichtiges Detail vergessen
     

  15. #15
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.516
    Hi, also ich würde es so machen:

    Datei.h

    Code c:
    1
    2
    3
    
    typedef void(__cdecl *func)(void);
     
    void Funktion(func);

    Datei.cpp

    Code c:
    1
    2
    3
    4
    5
    6
    
    void Funktion(func f)
    {
      // etlicher code...
      f();
      // weiterer code...
    }

    MAIN.cpp

    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    // Erstmal Prototyp definieren
    void __cdecl Parameter(void);
     
    /// etlicher Code
     
    void __cdecl Parameter(void)
    {
      printf("In der Funktion Parameter\n");
    }
     
    /// weiterer etlicher Code
     
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
         // DIES WIRD NICHT BENÖTIGT!! void (*fnc) () = Parameter;
         ...
         case WM_LBUTTOPNDOWN:
              Funktion(Parameter);
              ...
    }
    üäpöol bedankt sich. 
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

Ähnliche Themen

  1. Funktionsparameter
    Von carlos1976 im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 17.11.10, 11:08
  2. [VB6] Funktionsparameter DLL
    Von Tensi im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 12.11.08, 10:04
  3. Wert aus void() funktion auslesen ?
    Von trollchen im Forum C/C++
    Antworten: 7
    Letzter Beitrag: 07.04.08, 13:54
  4. Funktion void(0)
    Von cmyk-vienna im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 13.04.06, 08:07
  5. Antworten: 4
    Letzter Beitrag: 17.03.05, 14:37

Stichworte