如何使用在 Modelica 中调用的两个 C 函数之间使用的全局变量?
How can I use global variables used between two C function which are called in Modelica?
我在 C 中有两个函数定义,它们共享一些全局变量。我想在 Modelica 中调用这些函数,但我不知道如何在两个函数调用之间正确地保持全局变量的值。
file.c
/*Global variable definition*/
int* global_test1;
void FirstFunc (const int* init_value){
memcpy(global_test1, init_value, 2*sizeof(int));
}
void SecondFunc(int* some_output_variable){
memcpy(some_output_variable, global_test1, 2*sizeof(int));
}
calling_FirstFunc.mo
function calling_FirstFunc
input Integer[2,1] init_value = [3;3];
external "C" FirstFunc(init_value);
end;
calling_SecondFunc.mo
function calling_SecondFunc
output Integer[2,1] output_var;
external "C" SecondFunc(output_var);
end;
model.mo
model Calling_TwoFuncs
Integer[2,1] input_var = [3;5];
Integer[2,1] output_var;
equation
calling_FirstFunc(input_var);
when time>5.0 then
output_var = calling_SecondFunc();
end when;
end Calling_TwoFuncs;
您的示例代码应该几乎可以正常工作。如果(且仅当)按 First
、Second
的顺序调用 C-functions 时,C-functions 将保持其状态并正常工作。您还需要为global_test1
分配内存...但是代码中不能保证这个顺序。我建议改用 external objects;那么您可以创建同一模型的多个实例,并且在 C-code 中没有全局状态(因为您可以 malloc 内存和 return this 用于构造函数调用;第一次调用)。请注意,为了更通用,您可能应该将向量的大小传递给构造函数。
我在 C 中有两个函数定义,它们共享一些全局变量。我想在 Modelica 中调用这些函数,但我不知道如何在两个函数调用之间正确地保持全局变量的值。
file.c
/*Global variable definition*/
int* global_test1;
void FirstFunc (const int* init_value){
memcpy(global_test1, init_value, 2*sizeof(int));
}
void SecondFunc(int* some_output_variable){
memcpy(some_output_variable, global_test1, 2*sizeof(int));
}
calling_FirstFunc.mo
function calling_FirstFunc
input Integer[2,1] init_value = [3;3];
external "C" FirstFunc(init_value);
end;
calling_SecondFunc.mo
function calling_SecondFunc
output Integer[2,1] output_var;
external "C" SecondFunc(output_var);
end;
model.mo
model Calling_TwoFuncs
Integer[2,1] input_var = [3;5];
Integer[2,1] output_var;
equation
calling_FirstFunc(input_var);
when time>5.0 then
output_var = calling_SecondFunc();
end when;
end Calling_TwoFuncs;
您的示例代码应该几乎可以正常工作。如果(且仅当)按 First
、Second
的顺序调用 C-functions 时,C-functions 将保持其状态并正常工作。您还需要为global_test1
分配内存...但是代码中不能保证这个顺序。我建议改用 external objects;那么您可以创建同一模型的多个实例,并且在 C-code 中没有全局状态(因为您可以 malloc 内存和 return this 用于构造函数调用;第一次调用)。请注意,为了更通用,您可能应该将向量的大小传递给构造函数。