Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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
将for loop替换为C won中的memcpy';行不通_C_Memcpy - Fatal编程技术网

将for loop替换为C won中的memcpy';行不通

将for loop替换为C won中的memcpy';行不通,c,memcpy,C,Memcpy,我应该尝试使用雅可比在C中更有效地进行一个简单的二维热计算。 在计算新数组之后,我必须将新值复制到旧数组中 此时,将使用for循环: for(j=1;j

我应该尝试使用雅可比在C中更有效地进行一个简单的二维热计算。 在计算新数组之后,我必须将新值复制到旧数组中

此时,将使用
for
循环:

for(j=1;j
我的想法是使用
memcpy
,但我认为我做错了什么:

memcpy(u、utmp、sizex*sizey*sizeof(未签名));
在使用
memcpy
而不是
for
循环后,我的结果完全错误

整个功能:

void relax_jacobi(double *u, double *utmp, unsigned sizex, unsigned sizey) {
        int i, j;
        double unew, diff, sum = 0.0;
        for (j = 1; j < sizex - 1; j++) {
                for (i = 1; i < sizey - 1; i++) {
                        utmp[j * sizex + i] = 0.25 * (u[j * sizex + (i - 1)] +
                                                u[j * sizex + (i + 1)] +
                                                u[(j - 1) * sizex + i] +
                                                u[(j + 1) * sizex + i]);
                }
        }

        /*for (j = 1; j < sizex - 1; j++) {
                for (i = 1; i < sizey - 1; i++) {
                        u[j * sizex + i] = utmp[j * sizex + i];
                }
        }*/
        memcpy(u,utmp,sizex*sizex*sizeof(double));
}
void relax\u jacobi(double*u,double*utmp,unsigned sizex,unsigned sizey){
int i,j;
双unew,差异,和=0.0;
对于(j=1;j
我做错了什么?我以前从未真正使用过C。这是正确的方法吗

循环从1开始,因为2x2网格在边缘不会改变。

OP的
memcpy(u、utmp、sizex*sizey*sizeof(double))(复制所有矩阵)与下面的代码不同,代码复制的是2D矩阵的四条外边缘

for (j = 1; j < sizex - 1; j++) {
  for (i = 1; i < sizey - 1; i++) {
    u[j * sizex + i] = utmp[j * sizex + i];
  }
}
for(j=1;j
就像

for (j = 1; j < sizex - 1; j++) {
  // Copy 1 inner sub-row at a time.
  memcpy(&u[j * sizex + 1], &temp[j * sizex + 1], sizeof *u * (sizey-2));
}
for(j=1;j

使用
sizeof*u
而不是
sizeof(double)
来避免编码错误(正如OP最初发布的那样)。

OP的
memcpy(u、utmp、sizex*sizey*sizeof(double))(复制所有矩阵)与下面的代码不同,代码复制的是2D矩阵的四条外边缘

for (j = 1; j < sizex - 1; j++) {
  for (i = 1; i < sizey - 1; i++) {
    u[j * sizex + i] = utmp[j * sizex + i];
  }
}
for(j=1;j
就像

for (j = 1; j < sizex - 1; j++) {
  // Copy 1 inner sub-row at a time.
  memcpy(&u[j * sizex + 1], &temp[j * sizex + 1], sizeof *u * (sizey-2));
}
for(j=1;j


使用
sizeof*u
而不是
sizeof(double)
来避免编码错误(正如OP最初发布的那样)。

对于(j=1;j
-->从1开始是不寻常的
memcpy()
code好像从0开始。
sizeof(unsigned)
应该是
sizeof(double)
。这可能是唯一的问题,也可能不是。为什么您认为需要“将新值复制到旧数组中”?如果你不这样做,几乎肯定会更好。如果
old
指向旧数组,而
new
指向新数组,那么(几乎可以肯定)最好是对(j=1;jold=new
-->从1开始是不寻常的
memcpy()
code好像从0开始。
sizeof(unsigned)
应该是
sizeof(double)
。这可能是唯一的问题,也可能不是。为什么您认为需要“将新值复制到旧数组中”?如果你不这样做,几乎肯定会更好。如果
old
指向旧数组,而
new
指向新数组,则(几乎可以肯定)最好执行
old=new