最近的堆栈交换,
我正在编写MRI扫描仪。我不会涉及太多的背景,但是我对我可以访问的代码数量相当受限,并且设置的方式是......不是最理想的。我的情况如下:
简而言之,我的问题是:
这似乎是对内存管理的绝对泥潭,我想我会在这里问这些情况下的“最佳实践”,因为我可能遇到很多微妙的问题 - 而其他的可能有很多相关的智慧传授。调试系统是一场噩梦,我并没有真正得到扫描仪制造商的支持。
我计划如何进行的简要说明如下:
在.cpp库中:
/* In something::something() /*
/* declare a pointer to a function */
void (*fp)(int*, int, int, ...);
/* by default, the pointer points to a placeholder at compile time*/
fp = &doNothing(...);
...
/* At the appropriate time, point the pointer to the userland function, whose address is supplied as an argument to something(): /*
fp= userFuncPtr;
/* Declare memory for the user function to plonk data into */
i_arr_coefficients = (int) malloc(SOMETHING_SENSIBLE);
/* Create a pointer to that array for the userland function */
i_ptr_array=&i_arr_coefficients[0];
/* define a struct of pointers to local variables for the userland function to use*/
ptrStrct=createPtrStruct();
/* Call the user's function: */
fp(i_ptr_array,ptrStrct, ...);
CarryOnWithSomethingElse();
占位符函数的目的是在没有链接用户函数的情况下保持一致。我知道这可以用#DEFINE
替换,但编译器的聪明或愚蠢可能导致奇数(对我无知的头脑,至少)行为。
在userland函数中,我们有类似的东西:
void doUsefulThings(i_ptr_array, ptrStrct, localVariableAddresses, ...) {
double a=*ptrStrct.a;
double b=*ptrStrct.b;
double c=*localVariableAddresses.c;
double d=doMaths(a, b, c);
/* I.e. do maths using all of these numbers we've got from the different sources */
storeData(i_ptr_array, d);
/* And put the results of that maths where the C++ method can see it */
}
...
something(&doUsefulThings(i_ptr_array, ptrStrct, localVariableAddresses, ...), ...);
...
如果这个像泥一样清楚,请告诉我!非常感谢您的帮助。而且,顺便说一下,我真诚地希望有人能够制作一个开放的硬件/源MRI系统。
*另外,这是制造商用来阻止我们首先修改大型图书馆的主要理由!
答案 0 :(得分:2)
您可以完全访问C代码。您对C ++库代码的访问权限有限。 C代码定义了“doUsefullthings”函数。从C代码中,您调用“Something”函数(C ++类/函数),函数指针以“doUseFullThings”作为参数。现在控件转到C ++库。这里各种参数都分配了内存并进行了初始化。然后用这些参数调用“doUseFullThings”。这里控件转回C代码。简而言之,主程序(C)调用库(C ++),库调用C函数。
其中一个要求是“userland函数应该可以从调用它的C代码访问本地变量”。当你打电话给“某事”时,你只给出“doUseFullThings”的地址。没有参数/参数“something”捕获局部变量的地址。因此“doUseFullThings”无法访问这些变量。
malloc语句返回指针。这没有得到妥善处理。(可能你试图给我们概述)。你必须小心翼翼地将它释放到某处。
由于这是C和C ++代码的混合,很难使用RAII(处理分配的内存),完美转发(避免复制变量),Lambda函数(访问本地varibales)等。在这种情况下,你的方法似乎是要走的路。