结构中的数组

我是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 / datasolution之间可能存在别名。 作为替代方案,如果您有一个支持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