Assignng error

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
poggo
Beiträge: 10
Registriert: Mo Aug 24, 2020 2:19 pm

Assignng error

Beitrag von poggo » Mo Feb 08, 2021 2:06 pm

Hallo,

ich habe eineTest API geschrieben (c++) und möchte dafür ein C Interface schreiben. Die API besteht aus 2 Klassen.
Controller.h und ControllerResult.h

die Controller.h Klasse hat eine Funktion, die ein "ControllerResult" Objekt zurück gibt.

Code: Alles auswählen

ControllerResult calculate();
Nun habe ich in dem C Interface folgende Funktion geschrieben (also alle anderen Funktionen funktionieren in dem C Interface)

Code: Alles auswählen

#define CONTROLLER_ID uint64_t
#define RESULT_ID  uint64_t

Code: Alles auswählen

ERROR TESTAPI_Calculate(CONTROLLER_ID ControllerID, Result& result)
{
    int error = NONE; 
    
    RESULT_ID ResultID;
    TESTAPI::ControllerResult* pResult1 = new TESTAPI::ControllerResult();
    ResultID = reinterpret_cast<RESULT_ID>(pResult1);
    TESTAPI::ControllerResult* pResult = reinterpret_cast<TESTAPI::ControllerResult*>(ResultID);
    
    TESTAPI::Controller* pController = reinterpret_cast<TESTAPI::Controller*>(ControllerID);
    if (pController != nullptr) {
        pResult = pController ->calculate(); // hier ist dann die Fehlermeldung
        return static_cast<ERROR>(error);
    }
    ...
    ...
Das "Result" im Funktionskopf von calculate ist ein Struct. In den überführe ich die Ergebnisse aus dem Result Objekt. Das Result besteht dann auch nur aus Datentypen, die in C verfügbar sind.

Dann kommt folgender Fehler:
testapi.cpp:160:19: error: assigning to 'TESTAPI::ControllerResult *' from incompatible type 'TESTAPI::ControllerResult'
Kann man das beheben ohne die API zu ändern? Also irgendwie den Rückgabewert hier in der FUnktion zu einem Pointer umwandeln/adressieren/zuweisen ?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Assignng error

Beitrag von Xin » Mo Feb 08, 2021 2:53 pm

Hi,

ich habe das mal was gekürzt:
poggo hat geschrieben:
Mo Feb 08, 2021 2:06 pm

Code: Alles auswählen

ControllerResult calculate();

TESTAPI::ControllerResult* pResult1 = new TESTAPI::ControllerResult();
pResult = pController ->calculate(); // hier ist dann die Fehlermeldung
Dann kommt folgender Fehler:
testapi.cpp:160:19: error: assigning to 'TESTAPI::ControllerResult *' from incompatible type 'TESTAPI::ControllerResult'
Du weißt also eine Instanz von TESTAPI::Controller-Result auf einen Zeiger zu... das passt nicht, was die Fehlermeldung ja auch sagt.
poggo hat geschrieben:
Mo Feb 08, 2021 2:06 pm
Kann man das beheben ohne die API zu ändern? Also irgendwie den Rückgabewert hier in der FUnktion zu einem Pointer umwandeln/adressieren/zuweisen ?
Das kommt drauf an, ob Du dieses Result rausgeben möchtest.

Was ist ein Result? Und wieso ist

Code: Alles auswählen

ERROR TESTAPI_Calculate(CONTROLLER_ID ControllerID, Result& result)
eine C-Funktion? Da ist eine Referenz drin!?

Wenn Du eine Instanz mit CreateResult zurück gibst, muss diese Instanz ja auch irgendwo weiterleben. Wenn Du nur einen Pointer (oder eine Referenz, was in C ja nicht geht) rausgibst, zeigt die auf einen Speicherplatz, der beim Verlassen der Funktion nicht mehr gültig ist.

Ich denke, Du wirst die API ändern dürfen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

poggo
Beiträge: 10
Registriert: Mo Aug 24, 2020 2:19 pm

Re: Assignng error

Beitrag von poggo » Mo Feb 08, 2021 4:07 pm

Wenn ich in der C++ API die Funktion ändere von:

Code: Alles auswählen

ControllerResult TESTAPI::calculate();
zu

Code: Alles auswählen

ControllerResult* TESTAPI::calculate();
verschwindet die Fehlermeldung, jedoch ist dieses Objekt dennoch leer.
Die Klasse ControllerResult hat ein Struct, welches mit getResult abgerufen werden kann.

ich erstelle ein struct:

Code: Alles auswählen

TESTAPI::ControllerResult::Values
Values = pResult->getResult();
Values.coordinate_x = Result.coordinate_x
Was ist ein Result? Und wieso ist
Das ist ein struct mit double und ints enthalten

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Assignng error

Beitrag von Xin » Mo Feb 08, 2021 5:09 pm

poggo hat geschrieben:
Mo Feb 08, 2021 4:07 pm
verschwindet die Fehlermeldung, jedoch ist dieses Objekt dennoch leer.
Da habe ich keinen Quelltext zu, ergo kann ich zu all dem nichts sagen. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten