Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构中的数组_C_Arrays_Structure - Fatal编程技术网

C 结构中的数组

C 结构中的数组,c,arrays,structure,C,Arrays,Structure,我是C语言的新手,在结构中嵌入数组类型时遇到了问题。以下是我的问题的一个例子: 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

我是C语言的新手,在结构中嵌入数组类型时遇到了问题。以下是我的问题的一个例子:

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不是一个选项,因为我使用的是Sundals cvode解算器,它规定了参数的类型和顺序。

尝试将局部变量double J[151][151]定义为double**J。

尝试将局部变量double J[151][151]定义为double**J。

您无法分配给数组。您应该查找C中数组和指针之间的差异

代码中需要的内容如下:

double (*J)[151] = data->J;
这是指向长度为151的数组的指针。或者如果你想用typedefs

typedef double line[151];
line *J = data->J;
仅此而已,不应复制数据,而应复制指向数据的指针

编辑:但从整个答案来看,我认为所有这些都是纯粹的猜测,你的瓶颈可能在哪里。它可能在任何地方,例如,您以错误的方式访问矩阵(按轮、按列或其他方式)。或者说从内存中抽取数据只是控制着你的计算


也许考虑查看汇编程序,编译器会生成选项-S来查看是否有可疑的东西。

不能分配给数组。您应该查找C中数组和指针之间的差异

代码中需要的内容如下:

double (*J)[151] = data->J;
这是指向长度为151的数组的指针。或者如果你想用typedefs

typedef double line[151];
line *J = data->J;
仅此而已,不应复制数据,而应复制指向数据的指针

编辑:但从整个答案来看,我认为所有这些都是纯粹的猜测,你的瓶颈可能在哪里。它可能在任何地方,例如,您以错误的方式访问矩阵(按轮、按列或其他方式)。或者说从内存中抽取数据只是控制着你的计算


也许考虑查看汇编程序,编译器会生成选项-S来查看是否有可疑的东西。

< P> C.问题的根本原因是数组类型不能直接在Apple中赋值。必须显式使用MimcPy,如Studio.S/P> 但是请注意,执行复制可能会抵消您在功能剩余部分中获得的优化增益。可能,解决方案参数是一个指针,而优化者担心用户数据/数据和解决方案之间可能存在混淆。或者,如果您有一个支持C99的restrict关键字的编译器,则在参数上使用该限定符:

static int PSolve(void * restrict user_data, N_Vector restrict solution)
这向编译器保证这些指针不使用别名,并且应该允许您直接使用data->J,而不会牺牲编译器的优化


一些编译器在C89模式下以“restrict”等拼写使restrict关键字可用。有关详细信息,请参阅编译器文档。

问题的根本原因是无法在C中直接分配数组类型。必须显式使用memcpy,如图所示

但是请注意,执行复制可能会抵消您在功能剩余部分中获得的优化增益。可能,解决方案参数是一个指针,而优化者担心用户数据/数据和解决方案之间可能存在混淆。或者,如果您有一个支持C99的restrict关键字的编译器,则在参数上使用该限定符:

static int PSolve(void * restrict user_data, N_Vector restrict solution)
这向编译器保证这些指针不使用别名,并且应该允许您直接使用data->J,而不会牺牲编译器的优化


有些编译器在C89模式下使用restrict关键字,拼写为uu restrict-有关详细信息,请参阅编译器文档。

可能的重复项您难道不能直接读取数据->J而不是将其复制到本地数组吗?或者你会在这个函数中修改它吗?我提到,作为一种解决方法,我读取了矩阵方程中的数据->J[x][y]。但是这个函数在执行过程中会被调用数十亿次。数据->J似乎是一个性能瓶颈。我正在尝试获取一个本地副本作为解决方法。的可能副本您不能直接读取数据->J而不是将其复制到本地数组吗?或者你会在这个函数中修改它吗?我提到,作为一种解决方法,我读取了矩阵方程中的数据->J[x][y]。但是这个函数在执行过程中会被调用数十亿次。数据->J似乎是一个性能瓶颈。我正在尝试获取一个本地副本作为解决方法。不可能,它将编译时警告不兼容的指针类型,但在执行时会出错。谢谢你的尝试。我不是-1无骰子,它将编译w

有一个关于不兼容指针类型的警告,但在执行时会出现错误。谢谢你的尝试。我不是-1,你可以简单地在memcpy中使用sizeof J。我更新了代码以反映新的结构定义。但是memcpy不是一个可行的选择,因为相对于没有本地副本和引用J[x][y]作为数据->J[x][y],它增加了大约20%的总计算时间。主要问题是data->J似乎是一个瓶颈,因此我将尝试@caf的建议,使用关键字'restrict'。+1建议不要将结构作为指针。我不太清楚为什么,但它减少了程序中其他地方的操作时间。@Sevenless伙计,不要劫持你自己的线程。你完全改变了问题,使我们的答案无效!!!回滚并保留旧问题不变。已经回答了。如果您有与此代码相关的其他问题,并且显然您有,请再问一个问题!抱歉,我试图添加新的信息以找到问题的根源。现在它被回滚了。我将重新发布修改后的问题。您只需在memcpy中使用sizeof J。我更新了代码以反映新的结构定义。但是memcpy不是一个可行的选择,因为相对于没有本地副本和引用J[x][y]作为数据->J[x][y],它增加了大约20%的总计算时间。主要问题是data->J似乎是一个瓶颈,因此我将尝试@caf的建议,使用关键字'restrict'。+1建议不要将结构作为指针。我不太清楚为什么,但它减少了程序中其他地方的操作时间。@Sevenless伙计,不要劫持你自己的线程。你完全改变了问题,使我们的答案无效!!!回滚并保留旧问题不变。已经回答了。如果您有与此代码相关的其他问题,并且显然您有,请再问一个问题!抱歉,我试图添加新的信息以找到问题的根源。现在它被回滚了。我将重新发布修改后的问题。这与后面在函数中直接使用data->J没有任何不同。@caf,它是一个间接较少的问题。因此,这取决于数据的实际声明方式。@caf@Jens Gustedt:我编辑了这个问题,以包含UserData的typedef,并澄清问题的性能元素。Gustedt:间接寻址的数量完全相同,因为data->J与数据本身的偏移量为零。@caf,在这种情况下,您可能是对的。但通常,只有当编译器能够对此偏移量进行常量传播时,这才有效。否则,此常量偏移量可能会妨碍汇编程序中的直接寻址。这与后面在函数中直接使用data->J的行为不太可能有任何不同。@caf,它是一种间接寻址方式。因此,这取决于数据的实际声明方式。@caf@Jens Gustedt:我编辑了这个问题,以包含UserData的typedef,并澄清问题的性能元素。Gustedt:间接寻址的数量完全相同,因为data->J与数据本身的偏移量为零。@caf,在这种情况下,您可能是对的。但通常,只有当编译器能够对此偏移量进行常量传播时,这才有效。否则,这个常量偏移量可能会妨碍汇编程序中的直接寻址。我添加了restrict关键字,但是我得到了:cc1:error:unrecogned命令行选项-std=C99,当我使用`gcc44-c-std=C99-I/home/matteson/sundals/include/-I/misc/linux/64/opt/pkg/matlab/r210b/extern/include-I/misc/linux/64/opt/pkg/matlab/r210b/simulink/include-DMATLAB\MEX文件-D\GNU-SOURCE-fexceptions-fPIC-fno省略帧指针-pthread-fopenmp-DMX_COMPAT_32-O3-DNDEBUG het_kry.c`我检查了gcc的手册页,它说这是正确的标志。@Sevenless:它是小写的c--std=c99,但实际上您可能需要-std=gnu99,这是正常默认gnu89的c99版本。@Sevenless:另外,添加一些适当的常量限定符可能会有所帮助。你能更新你的问题来显示N_向量的定义吗?我添加了restrict关键字,但是我得到了:cc1:error:unrecogned命令行选项-std=C99,当我使用`gcc44-c-std=C99-I/home/matteson/sundals/include/-I/misc/linux/64/opt/pkg/matlab/r210b/extern/include-I/misc/linux/64/opt/pkg/matlab/r210b/simulink/include-DMATLAB\MEX文件-D\GNU-SOURCE-fexceptions-fPIC-fno省略帧指针-pthread-fopenmp-DMX_COMPAT_32-O3-DNDEBUG het_kry.c`我检查了gcc的手册页,它说这是正确的标志。@Sevenless:它是小写的c--std=c99,但实际上您可能需要-std=gnu99,这是正常默认gnu89的c99版本。@Sevenless:另外,添加一些适当的常量限定符可能会有所帮助。你能更新你的问题来显示N_向量的定义吗?