结构中的数组
我是C的新手,在嵌入结构时遇到arrays类型问题。 以下是我的问题的一个例子:
typedef struct { double J[151][151]; } *UserData; static int PSolve(void *user_data, N_Vector solution) { UserData data; data = (UserData) user_data; double J[151][151]; J = data->J; /* Solve a matrix equation that uses J, stored in 'solution' */ return(0); }
当我尝试编译这个时,我得到错误:从类型’double(*)[151]’分配类型’double [151] [151]’时出现不兼容的类型
我目前的解决方法是用代码中的’data-> J [x] [y]’替换’J [x] [y]’来求解矩阵方程,但是分析表明这样做效率较低。
将参数更改为PSolve不是一个选项,因为我正在使用sundials-cvode解算器来规定参数的类型和顺序。
谢谢你的帮助,安德鲁
typedef struct { double J[151][151]; } UserData; // This is a new data structure and should not a pointer! static int PSolve(void *user_data, N_Vector solution) { UserData* data; // This should be a pointer instead! data = (UserData*) user_data; double J[151][151]; memcpy(J, data->J, sizeof(double) * 151 * 151); // use memcpy() to copy the contents from one array to another /* Solve a matrix equation that uses J, stored in 'solution' */ return(0); }
您的问题的根本原因是无法在C中直接分配数组类型。您必须显式使用memcpy()
,如karlphillip的答案所示。
但请注意,执行复制可能会消除您在函数其余部分中所做的优化增益。 据推测, solution
参数是指针,优化器担心user_data
/ data
和solution
之间可能存在别名。 作为替代方案,如果您有一个支持C99的restrict
关键字的编译器,则在参数上使用该限定符:
static int PSolve(void * restrict user_data, N_Vector restrict solution)
这使编译器承诺那些指针不是别名,并且应该允许您直接使用data->J
而不牺牲编译器优化。
有些编译器在C89模式下使用__restrict
等拼写使用restrict
关键字 – 有关详细信息,请参阅编译器文档。
您无法分配给arrays。 你应该查看C中数组和指针之间的区别。
您在代码中需要的是这样的:
double (*J)[151] = data->J;
这是一个指向长度为151
数组的指针。 或者如果你喜欢使用typedef
typedef double line[151]; line *J = data->J;
就是这样,你不应该复制数据,而只是复制指向数据的指针。
编辑:但是看到答案的全部内容,我认为所有这些都是纯粹的猜测,你的瓶颈可能是什么。 它可能只是在任何地方,例如你正在以“错误的方式”,列式或其他方式访问矩阵。 或者从内存中抽取数据只会影响您的计算。
也许考虑查看编译器生成的汇编程序(选项-S)以查看是否有可疑的东西。
尝试将局部变量double J[151][151]
为double **J