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