struct pointer aus dll als argument



  • Hallo,

    ich habe in meiner DLL sowie in meinem Projekt indem ich die DLL inkludiere
    ein struct mit dem Namen UpDateStatus in .h deklariert. Weiters entält die
    DLL die methode:

    //DLL.cpp

    UpDateStatus* DLL::UpdateStatus(UpDateStatus *s)
    {
    	StatusStruct st;
    
    	if(!GetStatus(hUsb, &HyCncDll_olpRead, &st)) 
    		return NULL;
    
    	status.num = st.num;
    	status.cx = st.cx;
    	status.cy = st.cy;
    	status.cz = st.cz;
    	status.ca = st.ca;
    	status.cb = st.cb;
    	status.cc = st.cc;
    	status.din = st.din;
    
    	s = &status;
    	return s;
    }
    

    Wenn ich die methode dann aufrufe bekomme ich in status_1 die
    richtigen werte. status_2 ist aber nicht definiert.
    kann mir jemand sagen was ich falsch mache?

    struct UpDateStatus *status_1;
    struct UpDateStatus *status_2;
    
    status_1 = DLL::UpdateStatus(status_2);
    

    thx



  • Warum willst du die gleiche Strucktur 2 mal zurückgeben?

    Des weiteren ist die Stucktur status ein Member deiner Klasse und waum gibst du den Zeiger auf diese Daten zurück? Kannst du denn zu jeser Zeit Sicher stellen das die Klasse auch noch lebnt und die Daten auch noch die richtigen sind? Warum übergibst du nicht einen Zeiger auf eine Stucktur die der Aufrufer erzeugt hat und die du in deiner Funktion nur noch mit daten füllst, als Rückgabe würde dann ein einfacher BOOL reichen, damit der aufrufer weis ob die Strucktur auch mit sinnvollen Daten gefüllt wurden.

    So mal als Idee dazu, ob das so geht weis ich nicht weil ich GetStatus nicht kenn

    BOOL DLL::UpdateStatus(UpDateStatus *s)
    {
        if(!GetStatus(hUsb, &HyCncDll_olpRead, s))
            return FALSE;
    
        return TRUE; 
    }
    
    UpDateStatus *status_1 = new UpDateStatus;
    
    if(DLL::UpdateStatus(status_2) == TRUE)
    ...
    

  • Mod

    s = &status;
    

    Ist das Problem. Damit lädst Du nur einen Zeiger um.

    Es muss heißen:

    *s = Status;
    

    Definitv falsch ist auch der Aufruf.

    struct UpDateStatus status;
    
    DLL::UpdateStatus(&status);
    

    Du solltest etwas mehr lernen, was Zeiger und Referenzen sind.



  • Warum willst du die gleiche Strucktur 2 mal zurückgeben?

    Das macht natürlich keinen sinn. ich wollte nur wissen wieso es als rückgabewert funktioniert, ich also die richtigen werte erhalte, im argument aber nur "nicht definierter wert" steht.

    Des weiteren ist die Stucktur status ein Member deiner Klasse und waum gibst du den Zeiger auf diese Daten zurück? Kannst du denn zu jeser Zeit Sicher stellen das die Klasse auch noch lebnt und die Daten auch noch die richtigen sind?

    Das struct Status ist ein statisches globales struct. wieso sollte ich keinen zeiger zurückgeben können? Ich möchte auch keine instanz der klasse erstellen sondern statisch auf alle methoden zugreifen. hätte ich vl besser beschreiben sollen.

    Warum übergibst du nicht einen Zeiger auf eine Stucktur die der Aufrufer erzeugt hat und die du in deiner Funktion nur noch mit daten füllst, als Rückgabe würde dann ein einfacher BOOL reichen

    kann ich machen, ich wollte aber nur wissen wieso DIESE lösung nicht funktioniert. wenn ich den zeiger auf ein statischen struct als argument zurückgebe muss das ja funktionieren. Per return funktioniert es ja auch.

    das habe ich vor. ich will den zeiger nicht per return zurückgeben sonder den zeiger auf ein statisches struct (kein dynamisches) als argument zurückgeben.

    hoffe ich hab mich halbwegs klar ausgedrückt 🙂

    @Martin Richter

    Es muss heißen:

    Code:
    *s = Status;

    ich will doch einen zeiger umladen. s ist ja ein zeiger. wieso soll ich ihn dereferenzieren? wenn ich das so mache bekomme ich natürlich eine null reference exception.
    wie gesagt im aufruf:

    status_1 = DLL::UpdateStatus(status_2);
    

    bekomme ich in status_1 die gewünschten werte als return,
    im status_2 steht aber "nicht definierter wert"

    Definitv falsch ist auch der Aufruf.

    Code:
    struct UpDateStatus status;

    DLL::UpdateStatus(&status);

    stimmt ist falsch. nur ruf ich das so auch nirgendwo auf.



  • dark123 schrieb:

    Es muss heißen:

    Code:
    *s = Status;

    ich will doch einen zeiger umladen. s ist ja ein zeiger. wieso soll ich ihn dereferenzieren? wenn ich das so mache bekomme ich natürlich eine null reference exception.

    Wenn du den Zeiger ändern willst, dann reicht es nicht den Zeiger (=Wert des Zeigers!) zu übergeben. Dann musst du einen Zeiger auf den Zeiger oder eine Referenz auf den Zeiger übergeben.



  • entweder ich bin im erklären so schlecht oder verstehs einfach nicht 🙂

    weil:

    Wenn du den Zeiger ändern willst, dann reicht es nicht den Zeiger (=Wert des Zeigers!) zu übergeben. Dann musst du einen Zeiger auf den Zeiger oder eine Referenz auf den Zeiger übergeben.

    s = &status;
    

    mach ich doch


Anmelden zum Antworten