gpt4 book ai didi

c++ - 使用 iostream 消失的段错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:18:51 24 4
gpt4 key购买 nike

所以这很粗糙。我有一段使用 Columbia Physics System c++ 库的代码。当我运行它时出现段错误,很可能是因为类:CgArg 和 vector f_field_in 等未初始化。我使用了 Valgrind,发现确实各种参数都指向无效内存。

奇怪的是,如果我在这两个函数的任何地方插入一个 iostream 调用,段错误就会消失。当我把标志放在调试的地方时,我发现了。如果我定义一个整数并编写一个简单的 cin >>,它也不会出现段错误。这就是为什么我认为它与 iostream 有关。

如果您知道为什么调用 iostream 会以某种方式为参数提供代码片段,请与我分享,我将不胜感激。

#include <iostream>
using namespace std;

#include <config.h>
#include <util/lattice.h>
#include <util/dirac_op.h>
#include <util/gjp.h>
#include <interface.h>

#define CLOVER_MAT_SIZE 72

USING_NAMESPACE_CPS

// Same function for clover matrix and its inverse.
static
void interface(double *h_quda_clover, double *h_cps_clover)
{
h_quda_clover[0]=h_cps_clover[0]; // c00_00_re = C0.x, A0

...还有很多这样的东西...

  h_quda_clover[35+36]=h_cps_clover[34+36];  // c32_31_im = C8.w, A5
}

static
void fill_h_clover_inv(Lattice &lat, int site[], double *h_quda_clover_inv_site)
{
double h_cps_clover_inv[72];
Vector *f_field_out, *f_field_in;
CgArg *arg;
CnvFrmType convert=CNV_FRM_NO;
DiracOpClover dirac(lat,f_field_out,f_field_in,arg,convert);
//cout << "B: " << site << endl;
//cout << "B: site: " << site[0] << ' ' << site[1] << ' ' << site[2] << ' ' << site[3] << endl;
dirac.SiteCloverMat(site,h_cps_clover_inv);
interface(h_quda_clover_inv_site,h_cps_clover_inv);
}

void fill_h_clover_inv_all(Lattice &lat, double *h_quda_clover_inv, int parity)
{
double *ptr=h_quda_clover_inv;
int nsites[4];
nsites[0]=GJP.XnodeSites();
nsites[1]=GJP.YnodeSites();
nsites[2]=GJP.ZnodeSites();
nsites[3]=GJP.TnodeSites();
int site[4];
cout << "A: " << site << endl;
for (site[3] = 0; site[3] < nsites[3]; ++(site[3])) {
for (site[2] = 0; site[2] < nsites[2]; ++(site[2])) {
for (site[1] = 0; site[1] < nsites[1]; ++(site[1])) {
site[0] = (site[3] + site[2] + site[1] + parity)%2;
for (; site[0] < nsites[0]; site[0] += 2) {
//cout << "A: site: " << site[0] << ' ' << site[1] << ' ' << site[2] << ' ' << site[3] << endl;
fill_h_clover_inv(lat,site,ptr);
ptr += CLOVER_MAT_SIZE;
}
}
}
}
}

最佳答案

问题是一些未初始化的参数被传递给了 DiracOpClover。一旦我们正确地初始化了 CgArg,

CgArg cg_arg;
cg_arg.mass=1.0

一切都很好!

感谢大家的帮助。

关于c++ - 使用 iostream 消失的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13667838/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com