【发布时间】:2020-07-22 05:33:53
【问题描述】:
我正在尝试将 PETSc 中 Vec 的 array 传递给一个函数,在内部对其进行修改并检索结果。伪代码如下:
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 中初始化?
【问题讨论】:
-
当您尝试将
Vec *y传递给另一个函数时,它没有被初始化。您希望该功能收到什么?您可能想传递它的 地址。 -
@Chase:您的评论是否暗示我应该将其称为:
foo(&y, 3);,然后例程的调用应该是PetscErrorCode foo(Vec **y, int n)?然后在例程中我必须将其修改为ierr = VecDuplicateVecs(x, n, y); CHKERRQ(ierr);。我在我的应用程序中尝试了这个,虽然适用于 Vec 数组的第一个条目,但它给了我其他条目的段错误。