0

我正在尝试将PETSc 中的 Vec数组传递给一个函数,在内部对其进行修改并检索结果。伪代码如下:

    PetscErrorCode foo(Vec *y, int n) {

    // ...

       ierr = VecDuplicateVecs(x, n, &y);  CHKERRQ(ierr);
    // ...

       ierr = VecNorm(y[0],NORM_2,&norm); CHKERRQ(ierr);   // this prints out fine
       printf("norm = %f\n", norm);

    }

    int main(int argc,char **argv)
    {
        PetscErrorCode ierr;
        PetscScalar norm;
        Vec *y;

        foo(y, 3);

        ierr = VecNorm(y[0],NORM_2,&norm); CHKERRQ(ierr);     // this breaks: segfault

        ierr = VecDestroyVecs(3, &y); CHKERRQ(ierr);

        return 0;
    }

我确实收到了来自编译器的一条消息,指出variable "y" is used before its value is set,但我看不到如何通过引用传递这些人。VecDuplicateVecs必须在main中初始化吗?

4

1 回答 1

0

有两个问题:1)指针的地址*y没有传递给 foo [@Chase] 。2)双指针调用将解决VecNorm内部问题foo()

PetscErrorCode foo(Vec **y, int n) {

// ...

   ierr = VecDuplicateVecs(x, n, y);  CHKERRQ(ierr);
// ...

   ierr = VecNorm((*y)[0],NORM_2,&norm); CHKERRQ(ierr); 

   printf("norm = %f\n", norm);

}

int main(int argc,char **argv)
{
    PetscErrorCode ierr;
    PetscScalar norm;
    Vec *y;

    foo(&y, 3);

    ierr = VecNorm(y[0],NORM_2,&norm); CHKERRQ(ierr);     
    ierr = VecDestroyVecs(3, &y); CHKERRQ(ierr);

    return 0;
}
于 2020-07-23T07:48:17.307 回答