error C2664



  • Hallo Leute

    ich erhalte in meinem Programm immer die Fehlermledung:

    "error C2664: 'Send': Konvertierung des Parameters 1 von 'Bas::Message *' in 'Message *' nicht möglich
    3> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat."

    Mein Programmcode sieht gestaltet sich folgendermaßen:

    Headerdatei:

    typedef struct {
    uint32_t cob_id;
    uint8_t flags;
    uint8_t len;
    uint8_t data[8];
    uint32_t timestamp;
    } Message; //Struct vom Typ Message

    Driver m_Driver; //Objekt m_Driver der Klasse Driver erzeugen

    CPP-Datei:

    Message msg; //Alias vom Typ Message erzeugen

    bool Class::WriteMessage(uint32_t cob_id, uint8_t length, uint8_t* dataBytes)
    {
    CanMessage msg;
    if (m_Driver.Send( &msg) == CAN_OK)
    {
    return true;
    }
    return false;
    }

    Definition der Funktion Send:

    Send(Message *m)
    {
    return true;
    }

    Was mache ich verkehrt? Vielen Dank für eure Hilfe!



  • C++Pete schrieb:

    Headerdatei:

    typedef struct {	
    	uint32_t cob_id;	
    	uint8_t	flags;	
    	uint8_t	len;	
    	uint8_t	data[8];	
    	uint32_t timestamp;
        } Message; //Struct vom Typ Message
    
    Driver		m_Driver;  //Objekt m_Driver der Klasse Driver erzeugen
    

    CPP-Datei:

    Message msg; //Alias vom Typ Message erzeugen
    
    bool Class::WriteMessage(uint32_t cob_id, uint8_t length, uint8_t* dataBytes) 
    {
    	CanMessage msg;
    	if (m_Driver.Send( &msg) == CAN_OK)
    	{
    		return true;
    	}	
    	return false;
    }
    

    Definition der Funktion Send:

    Send(Message *m)
    {
       return true;	
    }
    

  • Mod

    Was ist eine CanMessage? Offensichtlich kein Alias für Message.

    Außerdem:
    -typedef struct? Wir sind doch nicht in C!
    -globale Variablen? Pfui! Ich habe sogar den Eindruck, dies ist genau der Grund, wieso du den Fehler eingebaut hast. Du hast keinen Überblick mehr, wo msg überhaupt was ist.
    -bool Rückgabetyp für Erfolg? Auch ziemlich C.

    Nochmal globale Variablen:

    Message msg; //Alias vom Typ Message erzeugen
    //               ^^  Nein!
    

    c.rackwitz schrieb:

    Wenn du selber Code schreibst, musst du ihn auch verstehen. Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur. Du musst genau wissen, warum du wo und welches Zeichen setzt.



  • Du hältst uns zuviel Informationen vor. Insbesondere tritt der Fehler an keiner Stelle des gezeigten Codes auf.

    Hast du eigentlich mal die Tipps aus den bisherigen Threads befolgt und angefangen, systematisch C++ zu lernen?



  • Sorry es sollte anstelle von "CanMessage msg" "Message msg" heißen.
    Ich kann leider nicht mehr Info9rmationen diesbezüglich zur Verfügung stellen. Habe vor kurzen mit C++ angefangen und darf ein fertiges Projekt fortführen.


  • Mod

    Großartig 🙄 . Der Code erzeugt den Fehler nicht, stattdessen präsentierst du uns anderen Code, der lauter andere Fehler enthält und noch dazu gar nicht deinem eigentlichen Code entspricht. Was sollen wir dir mehr sagen, als dass Bas::Message* nicht in Message* umgewandelt werden kann?

    Was ist denn das überhaupt für ein Geheimprojekt, bei dem ein Programmieranfänger beschäftigt wird, der nicht einmal Fragen zu seinem Code stellen darf? Bundestrojaner?



  • C++Pete schrieb:

    Sorry es sollte anstelle von "CanMessage msg" "Message msg" heißen.
    Ich kann leider nicht mehr Info9rmationen diesbezüglich zur Verfügung stellen.

    Oh, ein Ratespiel! 🙂 🤡

    Meine Glaskugel sagt mir, dass du irgendwo eine Klasse Bas hast, in der es einen Typ Message gibt. Außerdem gibt es noch einen Typ Message außerhalb davon. Und du hast den Überblick verloren. Sie sagt weiterhin, dass die Typen Copy&Paste-Varianten voneinander sind und demzufolge einer überflüssig ist.

    Habe vor kurzen mit C++ angefangen und darf ein fertiges Projekt fortführen.

    Hat sich das dein Auftraggeber auch gut überlegt?



  • Das ist der für den Fehler relevante Quelltext. Manche Leute müssen im Rahmen ihrer Abschlussarbeit eben manchmal auch eine neue Programmierpsrache erlernen ;).



  • Der Fehler befindet sich in der Zeile mit der Kontrollstruktur "if (m_Driver.Send( &msg) == CAN_OK)" 🙂



  • Äh ja, danke für die Information, aber soviel war schon klar, einen anderen Send-Aufruf gibts ja nicht.



  • C++Pete schrieb:

    Der Fehler befindet sich in der Zeile mit der Kontrollstruktur "if (m_Driver.Send( &msg) == CAN_OK)" 🙂

    Das mag ja sein, aber die entscheidende Stelle zeigst Du uns trotzdem nicht.

    Du rufst eine Methode Send über eine Membervariable die auf ein Objekte einer uns unbekannten Klasse zeigt, die ein Bas::Message* möchte. Übergeben tust Du aber ein Message*. Das sagt die Fehlermeldung.

    Zeigen tust Du uns eine Funktion Send die ein Message* möchte.

    -> da fehlt etwas 😮


  • Mod

    MichelRT schrieb:

    C++Pete schrieb:

    Der Fehler befindet sich in der Zeile mit der Kontrollstruktur "if (m_Driver.Send( &msg) == CAN_OK)" 🙂

    Das mag ja sein, aber die entscheidende Stelle zeigst Du uns trotzdem nicht.

    Du rufst eine Methode Send über eine Membervariable die auf ein Objekte einer uns unbekannten Klasse zeigt, die ein Bas::Message* möchte. Übergeben tust Du aber ein Message*. Das sagt die Fehlermeldung.

    Zeigen tust Du uns eine Funktion Send die ein Message* möchte.

    -> da fehlt etwas 😮

    Kaffeesatz sagt, dass die Klasse Class bei ihm Bas heißt (oder von Bas erbt) und einen Typ namens Message enthält.



  • Die Klasse Class erbt von Bas.



  • So kommen wir nicht weiter.

    Meine Glaskugel muß zur Inspektion 😮



  • Mehr Informationen habe ich leider nicht. Kann deine Glaskugel mir intuitiv sagen, womit es zusammenhängen könnte?



  • C++Pete schrieb:

    Mehr Informationen habe ich leider nicht. Kann deine Glaskugel mir intuitiv sagen, womit es zusammenhängen könnte?

    Hatte ich gestern schon geschrieben:

    Bashar schrieb:

    Meine Glaskugel sagt mir, dass du irgendwo eine Klasse Bas hast, in der es einen Typ Message gibt. Außerdem gibt es noch einen Typ Message außerhalb davon. Und du hast den Überblick verloren. Sie sagt weiterhin, dass die Typen Copy&Paste-Varianten voneinander sind und demzufolge einer überflüssig ist.


  • Mod

    MichelRT schrieb:

    So kommen wir nicht weiter.

    Eigentlich schon. Das heißt, dass meine Vermutung ziemlich sicher richtig ist. C++-Pete versteht bloß leider nicht, was ich geschrieben habe. Womit weitere Hilfsversuche wohl ziemlich frustrierend sein werden, wenn der Fragesteller die Antworten nicht versteht. Ich hätte daran jedenfalls reichlich wenig Lust. Bisher sind C++-Petes sämtliche Threads sich allesamt sehr ähnlich. Ich denke, in keinem wurde ihm wirklich geholfen.



  • Jeder hat mal klein angefangen!


  • Mod

    C++Pete schrieb:

    Jeder hat mal klein angefangen!

    Klar, aber du bastelst hier nach eigener Aussage an einem fertigen Projekt rum in einer Sprache, die du nicht verstehst. Kein Wunder, dass das nichts wird! Der erste logische Schritt ist hier doch das gründliche Erlernen der Sprache.

    Bisher kam in fast jedem deiner Threads das Wort "Kristallkugel" (oder eine andere Wahrsagemetapher) in fast jeder Antwort vor. Das heißt, du weißt derzeit noch nicht einmal richtig, wie du überhaupt nach deinen Problemen fragen sollst, weil du sie nicht einmal selber richtig verstehst, sondern bloß die diffuse Vorstellung hast (meistens aufgrund von Fehlermeldungen), dass irgendetwas nicht stimmt. Du brauchst schlicht und einfach erst einmal genug Hintergrundwissen, um erkennen zu können, was überhaupt deine Probleme sind und wie du die Antworten interpretieren kannst.

    Zumindest, wenn du weiter Fragen auf diesem Niveau stellst. Wir erklären auch gerne "Hello World". Aber für Fragen zu komplizierten Fehlern in Klassengeflechten sind die Antworten nun einmal auch kompliziert. Vor allem, wenn die Hälfte der Antwort geraten ist, weil du nicht den relevanten Code erkennen und liefern konntest.

    Konntest du denn etwas anfangen, mit meiner und Bashars (identischen) Antworten?

    SeppJ schrieb:

    Kaffeesatz sagt, dass die Klasse Class bei ihm Bas heißt (oder von Bas erbt) und einen Typ namens Message enthält.

    Bashar schrieb:

    Meine Glaskugel sagt mir, dass du irgendwo eine Klasse Bas hast, in der es einen Typ Message gibt. Außerdem gibt es noch einen Typ Message außerhalb davon. Und du hast den Überblick verloren. Sie sagt weiterhin, dass die Typen Copy&Paste-Varianten voneinander sind und demzufolge einer überflüssig ist.

    Genauer geht's nicht, ohne dass sich jemand neben deinen Rechner stellt und dir das Programm korrigiert.



  • Fuchs aus dem Wald schrieb:

    C++Pete schrieb:

    Headerdatei:

    typedef struct {	
    	uint32_t cob_id;	
    	uint8_t	flags;	
    	uint8_t	len;	
    	uint8_t	data[8];	
    	uint32_t timestamp;
        } Message; //Struct vom Typ Message
    
    Driver		m_Driver;  //Objekt m_Driver der Klasse Driver erzeugen
    

    CPP-Datei:

    Message msg; //Alias vom Typ Message erzeugen
    
    bool Class::WriteMessage(uint32_t cob_id, uint8_t length, uint8_t* dataBytes) 
    {
    	CanMessage msg;
    	if (m_Driver.Send( &msg) == CAN_OK)
    	{
    		return true;
    	}	
    	return false;
    }
    

    Definition der Funktion Send:

    Send(Message *m)
    {
       return true;	
    }
    

    Nochmal zum mitschreiben.

    -Wir haben ein struct Message.

    -Eine globale Variable msg vom Typ Message.

    -Eine lokale Variable msg vom Typ CanMessage, die die globale Variable gleichen Namens verdeckt.

    -Wir haben eine Methode Send von einer unbekannten Klasse die laut Compiler einen Parameter vom Typ Bas::Message* möchte.

    -Dann haben wir noch eine freie Funktion Send der ein Parameter vom Typ Message* übergeben werden soll.

    - eine Methode WriteMessage einer ansonsten unbekannten Klasse Class, die laut Deiner Aussage von Bas erbt.

    -es gibt irgendwo einen Typen Bas::Message

    -es gibt irgendwo einen Typen CanMessage

    - und wir haben einen Compilerfehler der aussagt, dass CanMessage* nicht in Bas::Message* gewandelt werden kann.

    Ohne zu wissen wie CanMessage, Bas::Message und Deine Message zusammenhängen kann man Dir nicht helfen. Und ob Du die Hilfe dann auch verstehst ist wieder eine andere Sache 😕


Log in to reply