On Monday, 22 May 2017 at 01:27:22 UTC, Nicholas Wilson wrote:
On Sunday, 21 May 2017 at 19:33:06 UTC, ParticlePeter wrote:I am statically linking to ImGui [1] on Win 10 x64, quite successfully till this issue came up. The noticed error so far comes when an ImGui function returns an ImVec2, a simple POD struct of two float members. I can use this struct as argument to functions but when it is returned from a function I get a 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF. I can even debug the process with Visual Studion, mixed d and c++ sources. The functions I tested return data from some internal global ImGui data, which I can fully examine, the crash happens on the return statement. Moreover, some functions have variations which return only one component from that ImVec2 POD, which do work as expected, e.g.:ImVec2 GetCursorPos(); // crash float GetCursorPosX(); // works float GetCursorPosY(); // worksThe latter do basically the same as the first one, but return ImVec.x or .y respectively.How could I further debug this?If somebody would be willing to look at the source, the binding is here [2].[1] https://github.com/ocornut/imgui [2] https://github.com/ParticlePeter/imgui_libProbably because the D side is expecting to have the struct returned in a pointer allocated by the callee and then the C++ puts it in regs and BOOM.If you wrap the C++ side to return the struct by a pointer then use that in D, then it should work.
And this is actually D problem. In fact first bug report on this thing was dated back to 2014. Still not fixed.
There is possible hacky workaround to try - put struct as pointer arg instead of return and make helper method to use it, like this
-------- HACK -------------------
// extern(C++) of course
void GetCursorPos(ImVec2* v);
// helper
ImVec2 GetCursorPos()
{
ImVec2 temp;
GetCursorPos(&temp);
return temp;
}
----------------------------------
