c – 使用iostream消失的分段错误
发布时间:2020-12-16 07:02:28 所属栏目:百科 来源:网络整理
导读:所以这是粗糙的.我有一段使用哥伦比亚物理系统c库的代码.我运行时遇到段错误,很可能是因为类:CgArg和vector f_field_in等未初始化.我使用Valgrind并发现确实各种参数都指向无效的内存. 奇怪的是,如果我在两个函数中的任何地方插入iostream调用,则段错误就会
|
所以这是粗糙的.我有一段使用哥伦比亚物理系统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 一切都是hunky dory !! 感谢大家的帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
