【问题标题】:Initializating struct error: 'theGrid' being used without being initialized初始化结构错误:“theGrid”在未初始化的情况下被使用
【发布时间】:2014-03-08 13:19:06
【问题描述】:

我正在尝试为我的 OpenCl/GL 流体创建一个 3d 网格。我遇到的问题是,由于某种原因,我的网格初始化功能无法正常工作。这是我的 *.h、*.c 设置和(最后)在 main 中调用:

(grid.h):

#if RunGPU 
    #define make_float3(x,y,z) (float3)(x,y,z)
    #define make_int3(i,j,k) (int3)(i,j,k)
#else
    typedef struct i3{
        int i,j,k; 
    } int3;

    typedef struct f3{
        float x,y,z; 
    } float3;

    #define __global 
    #define make_float3(x,y,z) {x , y , z}
    #define make_int3(x,y,z) {x , y ,z}
#endif

typedef struct grid3 * grid3_t; // u,v,w
typedef struct grid  * grid_t;  // p

struct grid3 {
    __global float3* values_;
    __global float * H_;
    __global float * h_;

    int dimx_;
    int dimy_;
    int dimz_; 
} ;

struct grid {
    __global float * values_;

    int dimx_;
    int dimy_;
    int dimz_; 
};
void grid3_init(grid3_t grid,__global float3* vel,__global float* H,__global float *h, int X, int Y, int Z);

(grid.c):

void grid3_init(grid3_t grid,__global float3* val,__global float* H,__global float *h, int X, int Y, int Z){
    grid->values_ = val;
    grid->H_ = H;
    grid->h_ = h;
    grid->dimx_ = X;
    grid->dimy_ = Y;
    grid->dimz_ = Z;
}

在我的主要初始化我的网格是这样的:

int main(int argc, char** argv)
{
    const int size3d = Bx*(By+2)*Bz;
    const int size2d = Bx*Bz;

    float3 * velocities = (float3*)malloc(size3d*sizeof(float3));
    float  * H = (float*)malloc(size2d*sizeof(float));
    float  * h = (float*)malloc(size2d*sizeof(float));

    for(int i = 0; i < size3d; i++){
        float3 tmp = make_float3(0.f,0.f,0.f);
        velocities[i] = tmp;
        if(i < size2d){
            H[i] = 1;
            h[i] = 2;
        }
    }

    grid3_t theGrid;
    grid3_init(theGrid, velocities, H, h, Bx, By, Bz); // <- ERROR OCCURS HERE
}

我得到的错误是在运行时 - “运行时检查失败 #3 - 变量 'theGrid' 正在使用而没有被初始化”。但这正是 grid3_init 的工作?

当我尝试编写代码来同时为主机和 GPU 工作时,我必须牺牲类的使用并严格使用结构——我对此经验较少。

在这一点上,我也不知道该用谷歌搜索什么,我希望能得到任何帮助。

【问题讨论】:

    标签: c struct initialization opencl


    【解决方案1】:
    struct grid3 theGrid;
    grid3_init(&theGrid, velocities, H, h, Bx, By, Bz);
    

    您需要创建grid3 实例并将其指针传递给grid3_init。您现有的代码只是使用未初始化的指针。

    【讨论】:

    • 这成功了!为什么以前不起作用?我的意思是我有“typedef struct grid3 * grid3_t;”对?我将其解释为“grit3_t grid == struct grid3 * grid”——错了吗?
    • 你需要有结构实例,而不仅仅是指向任何地方的指针。 grid3_t theGrid 是指针,struct grid3 theGrid 是实际结构实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    相关资源
    最近更新 更多