C++ 未打印出的双精度

C++ 未打印出的双精度,c++,C++,在这段代码中,我将创建一个粒子簇,并为它们指定x、y和z坐标。然后,我在评估这个星系团在某个遥远的地方产生的力。函数directSumUnregularized计算该力。 我想知道那个力是什么,但不管出于什么原因,它并没有被打印出来 这是我的代码: #include <omp.h> #include <time.h> #include <iostream> #include <cmath> #include <random> #incl

在这段代码中,我将创建一个粒子簇,并为它们指定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;

}
#包括
#包括
#包括
#包括
#包括
#包括“unitTestFunctions.h”
int main(){
//设置粒子簇
常数int numberOfParticles=10;
std::随机_设备rd{};
std::mt19937 gen{rd()};
正态分布d{0,1};
粒子*clusterOfParticles=新粒子[粒子数];
双sumX{},sumY{},sumZ{};

对于(int ind=0;ind关于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{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;
要点(heh)是指针必须指向有效位置。即变量的位置或对
new
的调用。在这种情况下,有效位置是变量
值的位置


另请参见:

我认为您不了解指针是如何工作的。它们需要指向有效内存。在这种情况下,最简单的方法是传递有效的
变量的地址。您应该使用调试器一次运行一行代码,检查所有变量的值,并观察程序的lo这是调试器所需要的。能够有效地使用调试器是每个C++开发者所需的技能。这看起来是一个极好的机会,让你学会如何使用调试器。现在花点时间做这件事意味着你可以在未来找到并修复自己的错误。e、 当你说“它没有被打印出来”时,你的意思是“什么都没有发生”还是“我的程序崩溃了”?我想你可能得到了一个“分段错误”错误。只是好奇,如果pi是一个常数(显然),那么1/(4pi)也应该是常量,你们不认为吗?或者你们希望在每个函数调用上得到不同的结果?若你们想使用指针的话**
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