Dereferenzierung einer Funktion



  • Hallo Leute,

    ich habe ein Programm bestehend aus Klasse "mcDSA" und "ARM". In der Klasse "mcDSA" ist die Funktion "OnPDOReeiveD" definiert als:

    "virtual void OnPDOReceived(uint32 cob_id, uint8 len, uint8* data)(
    ...
    }"

    wobei "uint 32", "uint8" mittels "typedef" als eigenständige Typen definiert sind.
    Die Klasse "mcDSA" ist über die "#include"-Anweisung in die Klasse "ARM" eingebunden.
    In der Klasse "ARM" möchte ich nun über einen Zeiger "p_Controller" die Funktion dereferenzieren:

    "p_Controller ->OnPDOReceived(0x3762,8,&data);"

    Hierbei liefert der Compiler nach dem Debuggen den Fehler: "error C2065 data nicht deklarierter Bezeichner".
    Was mache ich verkehrt? Vielen Dank für eure Hilfe!



  • Man kann Zeiger dereferenzieren, Funktionen ruft man auf. Und du hast, wie die Fehlermeldung sagt, keine Variable data definiert, deren Adresse du mittels &data zu nehmen versuchst.



  • Hi,
    du brauchst wohl ein uint8-Array, das die Daten enthält. Hast du kein Daten-Array?



  • Ein Daten-Array habe ich nicht. Über den CAN-Bus sollen die erhaltenen Daten auch in dieses Array reingeschrieben werden



  • C++Pete schrieb:

    Ein Daten-Array habe ich nicht.

    Dann musst Du Dir wohl eins definieren.

    uint8 data[8]={};
    

    Logisch, oder? 😉

    Weitermachen!



  • Dann definiere dir dafür ein Array:

    uint8 data[8];
    

    Du solltest aber schon die Grundlagen von C++ beherrschen, bevor du dich an die Nutzung externer Libraries machst...



  • Warum gerade ein uint8 array?



  • Der Autor hat vorn paar Wochen schonmal nen Thread eröffnet, ähnliche Frage und sowas alles. hier

    Irgendwie stimmt da was nicht oO

    edit:

    C++Pete schrieb:

    "p_Controller ->OnPDOReceived(0x3762,8,&data);"

    Hierbei liefert der Compiler nach dem Debuggen den Fehler: "error C2065 data nicht deklarierter Bezeichner".

    Das geht ja schonmal gar nicht. Der Debugger läuft mit dem Programm. Der Compiler erstellt das Programm. Ergo: Ohne Programm kein Debuggen, und keine Debugfehlermeldung beim Compilen.



  • Das war nicht meine Frage 🙂



  • ein uint8 array weil die funktion einen zeiger auf einen uint8 verlangt. ist doch logisch



  • C++Pete schrieb:

    , uint8* data)(
    ...
    }



  • Wenn ich vor der Dereferenzierung des Zeigers ein Array folgendermaßen deklariere:

    "uint8 data[8];
    p_MotorControllers->OnPDOReceived(0x3762,8,&data);"

    kommt immer die Fehlermeldung:

    2>C:\consys\apps\actuators\aManipulator\MAN_ARM5E.cpp(305): error C2664: 'mcDSA_ARM5E::OnPDOReceived': Konvertierung des Parameters 3 von 'uint8 (*)[8]' in 'uint8 *' nicht möglich
    2> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    2>

    Was mache ich verkehrt?



  • Probiers mit:

    uint8 data[8];
    p_MotorControllers->OnPDOReceived(0x3762,8,data);
    

    Oder mit:

    uint8 * data = nullptr;
    p_MotorControllers->OnPDOReceived(0x3762,8,data);
    

    Oder mit:

    uint8 * data = new uint8[8];
    p_MotorControllers->OnPDOReceived(0x3762,8,data);
    

    Je nachdem, was gebraucht oder verlangt ist. Aber sind sprachliche Grundlagen...



  • vll. ist es dir - te - nicht bewusst aber ein array ist grundsätzlich wie ein zeiger nutzbar. daher ist der dereferenzierungsoperator fehl am platz.

    int array[2];
    int *pointer = array;  //funktioniert wunderbar und ist definiertes verhalten
    

Anmelden zum Antworten