[closed]Zeiger auf allokierten Speicher zw. Funktionen/DLLs austauschen



  • Hallo,

    ich weiß nicht ob das hier das richtige Unterforum ist aber ich denke, dass die Frage an sich doch recht allgemein ist.

    Ich möchte gerade einen Zeiger, der auf ein in einer dll allokiertes Feld zeigt, an eine weitere dll übergeben. Ich las, dass dies mit einem einfachen unsigned long Übergabewert gehen soll, jedoch weiß ich nicht wie das so recht zu funktionieren hat, da mein gewünschter Zeiger vom Typ float ist und ich nun nicht weiß wie ich diesen in diesen unsigned long Übergabeparameter bekomme, geschweige denn wie ich in der zweiten DLL aus diesem dann wieder meinen float Zeiger bekommen kann.
    Vielleicht hat ja hier jemand eine Idee.



  • Gantenbein schrieb:

    Ich möchte gerade einen Zeiger, der auf ein in einer dll allokiertes Feld zeigt, an eine weitere dll übergeben. Ich las, dass dies mit einem einfachen unsigned long Übergabewert gehen soll ...

    Ich bin jetzt nicht der Win/DLL- Profi, aber ich habe einfach die Zeiger weitergereicht und das hat immer geklappt - einen cast nach was auch immer hat's nie gebraucht.
    Falls bei Experimenten alle Stricke reißen, versuch' mal void* zu übergeben und lokal zu casten.
    Der korrekte Platz für Deine Frage wäre eher das WinAPI- Unterforum.



  • Die Idee hatte ich auch schon, was aber irgendwie nicht wirklich funktionierte.
    Inzwischen geht es aber indem ich den Übergabeparameter erst einmal die gecastete Adresse lade und ihn dann wieder in der Zielfunktion erneut umcaste. Irgendwie recht umständlich aber wenn es denn geht soll es mir recht sein.

    Nun gibt es dort aber noch eine Variable de den Context der Umgebung (Cuda) beschreibt den ich ebenso übergeben muss, da wird mir wohl nicht möglich sein das umzucasten, wie ich das machen soll ist mir noch ein Rätsel aber das versuche ich noch etwas selbst weiter und melde mich dann nochmal falls ich daran verzweifle (was ich schon leider schon auf mich zukommen sehe).



  • Gantenbein schrieb:

    Inzwischen geht es aber indem ich den Übergabeparameter erst einmal die gecastete Adresse lade und ihn dann wieder in der Zielfunktion erneut umcaste. Irgendwie recht umständlich aber wenn es denn geht soll es mir recht sein.

    In irgendwelche ints umcasten ist aber echt Schweinekram, sowas nur für den schnellen Hack und Probieren, aber nix zum Weitergeben, weißte schon, oder?

    Gantenbein schrieb:

    Nun gibt es dort aber noch eine Variable de den Context der Umgebung (Cuda) beschreibt den ich ebenso übergeben muss, da wird mir wohl nicht möglich sein das umzucasten, wie ich das machen soll ist mir noch ein Rätsel

    Tu' Dir selbst einen Gefallen und poste konkret was Du willst und was nicht geht ins WinAPI- Forum. 😉



  • Also was ich genau da habe und machen will ist folgendes.

    Ich habe ein größeres LabVIEW Programm, in diesem Prrogramm gibt es eine Berechnung die ich gerne auf mittels Cuda auf die grafikkarte auslagern möchte. Dazu benötige ich wiederum eine DLL, die erst einmal eine Wrapper Funktion beinhaltet, die dann wiederum den Kernel aufruft. Das läuft so weit recht gut, allerdings wäre es schön wenn ich sämtliche Arrays auf der Grafikkarte nicht in dieser DLL, sondern in einer zweiten, die nur einmal am Anfang aufgerufen wird statt ständig, allokieren könnte.
    Dazu muss ich zum Einen die Pointer auf diese vorallokierten Arrays von der ersten auf die zweite DLL und schließlich in den Kernel bekommen -das funktioniert inzwischen so weit auch.
    Das zweite Problem ist nun aber, dass beide DLLs auf dem gleichen Thread laufen müssen damit die zweite DLL diese vorallokierten Arrays mit Hilfe der übergebenen Pointer wiederfinden kann. Um das zu erreichen gibt es zwei Möglichkeiten(denke ich).Die Erste ist, dass ich in den LV Übergabeknoten der DLLs einfach einstelle, dass beide auf dem UI Thread laufen sollen, die Möglichkeit hat man da. Der Thread kümmert sich aber gerade um alles was auf der Benutzeroberfläche dort so dargestellt wird und wenn genau auf diesem dann auch die Berechnung auf der Grafikkarte laufen sollen, denke ich nicht, dass das gerade die optimale Lösung ist, da dann doch beides etwas gegeneinander läuft.
    Die zweite Lösung (wie ich hoffe) ist, wenn ich einen Cuda Context (Cuda Programming Guide 3.3.1 Context p.51) in der ersten DLL erzeuge [cuCtxCreate()] ihn am Ende der ersten DLL vom aktuellen Thread löse [cuCtxPopCurrent()] und schließlich ihn in der weiten DLL wieder an den aktuellen Thread binde [cuCtxPushCurrent()]. Nach meiner Auffassung sollte ich damit erreichen können, dass die beiden DLL in allen Threads laufen können aber dennoch beide auf eine weise derart verbunden werden können, dass die Zweite die vorallkokierten Arrays wieder findet.

    Problem: dieser Cuda Context einen eigenen Typ CUcontext [CUContext Beispielvariable] und da weiß ich nun nicht wie ich ihn ordentlich übergeben bekomme. nun ja vermutlich ist es für jemanden der etwas mehr Ahnung von der Materie hat als ich einfach aber ich muss mich hier derweil wirklich von Schritt zu Schritt voran kämpfen.



  • Hey Gantenbein,

    nimm's nicht übel, aber Lesen gehört schon mit dazu 😞 . Mit ANSI- C hat das gar nix zu tun, deswegen bist Du im falschen Unterforum und jetz schreib' ich zum dritten mal, daß Du nach WinAPI gehörst.
    Weil die Mods hier wohl auch eher mit Zensieren beschäftigt oder in Komastarre gefallen sind, weck' sie doch mal und bitte ums Verschieben dahin.
    Alternativ editiere den Titel Deines ersten Postings des Themas auf "[closed] Zeiger auf allokierten Speicher zw. Funktionen/DLLs austauschen" und poste den letzten Beitrag unter Win API neu. Die Mods hier hassen nämlich Crossposting.

    Über die WinAPI weißt Du wahrscheinlich bereits mehr als ich, wie soll ich Dir da helfen? Nene, geh' mal zu den Win- Gurus 😃 , da biste besser aufgehoben!



  • Übergib einfach den Zeiger (und zwar als Zeiger) und gut ist.
    Wo soll das Problem sein? Wüsste auch nicht was das mit WinAPI, DLL oder sonstwas zu tun haben soll.



  • Athar schrieb:

    Wo soll das Problem sein? Wüsste auch nicht was das mit WinAPI, DLL oder sonstwas zu tun haben soll.

    Das Problem sind Leute wie Du, die weder lesen noch denken, bevor sie posten. 🙄



  • pointercrash() schrieb:

    Das Problem sind Leute wie Du, die weder lesen noch denken, bevor sie posten. 🙄

    Spar dir das Getue.
    Wenn er einen float-Zeiger erfolgreich mit Casten nach unsigned long übergeben kann, kann er ihn auch gleich als float* übergeben.


Anmelden zum Antworten