gpt4 book ai didi

c - C 语言 OpenMP 中的结构体数组

转载 作者:行者123 更新时间:2023-11-30 19:33:49 25 4
gpt4 key购买 nike

我有包含多个文件的非常大的代码,下面是仅显示我的问题的代码片段。我试图在所有处理器上独立运行代码(不是 OpenMP 的传统方式,其中一些变量是共享的)。

请忘记头文件。包括所有必需的内容。

主.c

static RT_MODEL_pl3phPWM_T pl3phPWM_M_;
RT_MODEL_pl3phPWM_T Array_m[4];
static RT_MODEL_pl3phPWM_T * const pl3phPWM_M_array[4] = { &Array_m[0], &Array_m[1], &Array_m[2], &Array_m[3] };

int main()
{
int flag = 1;
StartTime(); // in anotherfile
#pragma omp parallel num_threads(4)
while(flag == 1)
{
rt_OneStep(pl3phPWM_M_array[k]);
flag = EndTime(); //returns 2 when time > 15 seconds
}

return 0;
}


void rt_OneStep(RT_MODEL_pl3phPWM_T *const pl3phPWM_M)
{
// here some other steps running OK.

pl3phPWM_M->Timing.t[0] = rtsiGetT(&pl3phPWM_M->solverInfo); // Error Line, program stops working.
}

Step.h//这里仅显示结构部分,而不是这里复制的完整文件。头文件已正确创建并且工作正常。

// Macro which is being used in error line 

#define rtsiSetTPtr(S,tp) ((S)->tPtr = (tp))
#define rtsiSetT(S,t) ((*((S)->tPtr))[0] = (t))
#define rtsiGetT(S) (*((S)->tPtr))[0]

// few other structs here

struct RT_MODEL_pl3phPWM_T
{
const char_T *errorStatus;
RTWSolverInfo solverInfo;

/*
* Timing:
* The following substructure contains information regarding
* the timing information for the model.
*/
struct
{
SimTimeStep simTimeStep;
boolean_T stopRequestedFlag;
time_T *t; // Problem when using this pointer;
time_T tArray[5];
} Timing;
};

Main.c 中显示的错误行在按顺序编译时工作正常,但对于并行内核,它会停止工作。我希望我已经提供了足够的信息,但如果缺少什么,请告诉我。

最佳答案

问题非常明显:pl3phPWM_M->Timing.t是一个指针:time_T* t;

在代码中的任何地方都没有初始化此指针,但当您使用全局对象时,整个结构都会默认初始化,这意味着该指针设置为NULL

通过pl3phPWM_M->Timing.t[0](或等效:*pl3phPWM_M->Timing.t),您取消引用此空指针,尝试分配一些内容到它 - 因此崩溃。我假设 rtsiGetT 返回一个 time_T 结构(而不​​是指针),因此您可以删除结构中的指针:time_T t;。如果您出于某种原因无法执行此操作,则需要首先为其分配一个值:

if(!pl3phPWM_M->Timing.t)
{
pl3phPWM_M->Timing.t = (time_T*) malloc(sizeof(time_T));
if(!pl3phPWM_M->Timing.t)
{
// malloc failed! you need appropriate error handling!
}
}

现在您可以照常完成作业。我更愿意在进入循环之前在主函数中初始化指针(您不需要外部 if then - 但仍然检查 malloc 的结果!)。

关于c - C 语言 OpenMP 中的结构体数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44803621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com