双精度未打印出来

Double not being printed out

本文关键字:打印 双精度      更新时间:2023-10-16

在此代码中,我正在制作一个粒子簇并为其分配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;
  }

我应该怎么做?

关于 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;

2nd,将 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;

这将给出如下所示的输出:(地址可能因您而异(

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

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

另请参阅:什么是分段错误?