双重未打印

时间:2019-07-25 16:19:08

标签: c++

在这段代码中,我正在制作一个粒子簇,并为其分配x,y和z坐标。然后,我正在评估此群集在某个较远点产生的力。函数directSumUnregularized计算该力。 我想看看那是什么力量,但是由于某种原因,它没有被印出来。

这是我的代码:

#include <omp.h>
#include <time.h>
#include <iostream>
#include <cmath>
#include <random>
#include "unitTestFunctions.h"
int main() {

  //set up cluster of particles
  const int numberOfParticles = 10;
  std::random_device rd{};
  std::mt19937 gen{rd()};
  std::normal_distribution<> d{0,1};

  PARTICLE *clusterOfParticles = new PARTICLE [numberOfParticles];

  double sumX{}, sumY{}, sumZ{};
  for (int ind=0; ind<numberOfParticles; ind++){
    clusterOfParticles[ind].x = d(gen);

    clusterOfParticles[ind].y = d(gen);

    clusterOfParticles[ind].z = d(gen);
  }

  //test position

  double xTest {5}, yTest{6}, zTest {7};

  double *exactForceX{nullptr}, *exactForceY{nullptr}, *exactForceZ{nullptr};
  *exactForceX = 0;
  *exactForceY = 0;
  *exactForceZ = 0;

  directSumUnregularized(numberOfParticles, exactForceX, exactForceY,
    exactForceZ, xTest, yTest, zTest,
    clusterOfParticles);

  std::cout<<"exactForce X: "<<*exactForceX<<std::endl;

delete [] clusterOfParticles;

return 0;

}

和我的功能:

#include <omp.h>
#include <time.h>
#include <iostream>
#include <cmath>
#include <random>
#include "unitTestFunctions.h"


void directSumUnregularized(const int numberOfParticles, double *exactForceX,
  double *exactForceY, double *exactForceZ, double xTest, double yTest, double zTest,
  PARTICLE *clusterOfParticles){
    double rSq{};
    double r{};
    double dx {}, dy {}, dz{};
    const double pi = 3.1415926535897;
    double inv4pi = 1/(4*pi);
    for (int i=0; i<numberOfParticles; i++){
      dx = xTest - clusterOfParticles[i].x;
      dy = yTest - clusterOfParticles[i].y;
      dz = zTest - clusterOfParticles[i].z;
      rSq = dx*dx+dy*dy+dz*dz;
      r = sqrt(rSq);

      *exactForceX -= inv4pi*(dx/(rSq*r));
      *exactForceY -= inv4pi*(dy/(rSq*r));
      *exactForceZ -= inv4pi*(dz/(rSq*r));
    }
    return;
  }

我应该怎么做?

2 个答案:

答案 0 :(得分:1)

关于exactForceX / Y / Z,要正常工作,必须像这样:

//test position

double xTest = 6, yTest = 6, zTest = 7;
double exactForceX = 0, exactForceY = 0, exactForceZ = 0;

directSumUnregularized(umberOfParticles, &exactForceX, &exactForceY,
    &exactForceZ, xTest, yTest, zTest,
    clusterOfParticles);

std::cout << "exactForce X: " << exactForceX << std::endl;

首先,定义(并初始化)3个变量:

double exactForceX = 0, exactForceY = 0, exactForceZ = 0;

2,将3个地址传递给函数,以使其存储结果。

答案 1 :(得分:0)

有问题的部分是

  double *exactForceX{nullptr}, *exactForceY{nullptr}, *exactForceZ{nullptr};
  *exactForceX = 0;
  *exactForceY = 0;
  *exactForceZ = 0;

这到底在做什么?

double *exactForceX{nullptr};
*exactForceX = 0;

您正在创建一个值为nullptr的指针,尝试对其进行取消引用并指定值为0。取消引用nullptr是未定义的行为。

要解决此问题,您需要地址操作符&

double exactForceX = 0;
double exactForceY = 0;
double exactForceZ = 0;

  directSumUnregularized(numberOfParticles, &exactForceX, &exactForceY,
    &exactForceZ, xTest, yTest, zTest,
    clusterOfParticles);

对于指针的工作方式似乎有些困惑。我喜欢使用这样的简单示例。

double value = 12345;
double *pointer_to_value = &value;
std::cout << "value " << value << std::endl;
std::cout << "&value " << &value << std::endl;
std::cout << "pointer_to_value " << pointer_to_value << std::endl;
std::cout << "*pointer_to_value " << *pointer_to_value << std::endl;

这将给出如下输出:(地址可能与您不同)

value 12345                                                                                                                                                  
&value 0x7ffc601869b0                                                                                                                                        
pointer_to_value 0x7ffc601869b0                                                                                                                              
*pointer_to_value 12345

要点(heh)是指针必须指向有效位置。也就是说,要么是变量的位置,要么是对new的调用。在这种情况下,有效位置是变量value的位置。

另请参阅:What is a segmentation fault?