c++ - 尝试生成随机数时 C++ 警告弹出帮助?
问题描述
尝试编写代码来生成 x、y 和 z 的随机速度,将这些速度限制为方程 x^2+y^2+z^2 <= 200。我收到警告:指向函数的指针算术 [-Wpointer-arith] 警告弹出?任何帮助将不胜感激,新的 C++ 编码学生
#include <cstdlib>
#include <iostream>
#include <math.h>
int main(){
int N , x, y, z, vt, pow;
printf("Enter the number of particles: \n");
scanf("%d", &N);
random [N];
printf("The velocity of the particles are\nx: y: z:\n");
srand(time(NULL));
for(int i = 0; i <= N; i++){
// the square is N x N, so you want two numbers from 0 to N-1
int x = rand() % vt;
int y = rand() % vt;
int z = rand() % vt;
vt = 200 - ( pow(x,2)+pow(y,2)+pow(z,2));
printf("%d %d %d\n", x, y, z);
}
}
解决方案
主要问题似乎是这段代码看起来不像是由一个人逐段编写的。这就像从其他地方复制的点点滴滴的奇怪混搭,而且这些碎片不合适。
让我们来看看它。
#include <cstdlib>
那是<stdlib.h>
C 头文件的 C++ 版本。不算太奇怪。
#include <iostream>
基于 C++ 流的 I/O的<iostream>
标头。好的。
#include <math.h>
那是基本数学函数的 C 头文件。C++ 版本称为<cmath>
. 你从哪里得到那个的?
int main(){
一个典型的 C++main
函数。
int N , x, y, z, vt, pow;
在这里,您在使用它们之前很久就预先声明了一堆变量。这在 C 中(仍然)有些常见,但不是惯用的 C++。在 C++ 中,您可能会将变量声明为更接近使用它们的位置。
另一个奇怪的事情:你的一个变量被称为pow
,这也是一个标准函数的名称。
printf("Enter the number of particles: \n");
scanf("%d", &N);
在这里,您调用printf
/ scanf
,它们是用于输出/输入的标准 C 函数,但不包括其正确的标头,即<stdio.h>
. 但是你表面上是在写 C++,所以应该是<cstdio>
and std::printf
/std::scanf
而不是,除了在 C++ 中你通常会使用std::cout
and std::cin
。其中在 中声明<iostream>
,您包含但未使用。
如果您打算使用scanf
(我不推荐),您应该始终检查它的返回值以确保它成功:if (scanf("%d", &N) != 1) { /* error */ }
.
random [N];
这条线没有意义。您正在索引一个名为 的数组random
,该数组不存在(random
在您的代码中未声明任何变量)。您没有收到错误的唯一原因是在某些平台上有一个(非标准)函数称为random
,但是将函数视为数组也没有任何意义。这可能是您要询问的警告的来源。
printf("The velocity of the particles are\nx: y: z:\n");
srand(time(NULL));
你包括在内<cstdlib>
,所以应该是std::srand
,不是srand
。time
根本没有声明;你忘了包括<ctime>
(或<time.h>
,但你真的应该弄清楚你是用 C++ 还是 C 编程)。
for(int i = 0; i <= N; i++){
不是硬错误,但看到从0
to循环<= N
会引发危险信号。通常是1
with<=
或0
with <
。你这样做的方式,这个循环会迭代N+1
多次。
// the square is N x N, so you want two numbers from 0 to N-1
int x = rand() % vt;
int y = rand() % vt;
int z = rand() % vt;
应该是std::rand
,不是rand
。
vt
此处未初始化(在第一次迭代期间)。
x
此外,您正在创建仅存在于循环中的新局部变量y
(z
并隐藏在开头声明的同名外部变量main
)。
vt = 200 - ( pow(x,2)+pow(y,2)+pow(z,2));
这一行是一个硬错误:您试图pow
作为一个函数调用,但它是一个声明为 an 的局部变量int
(参见 的开头main
)。
printf("%d %d %d\n", x, y, z);
}
}
到了结尾,main
我们从未使用过开头声明的x
, y
,变量。使用得有些正确。被错误地使用(在它被初始化之前)。只是一个错误:它仅用作函数,而不是变量。z
N
vt
pow
推荐阅读
- tfs - 如何为不同的机器替换具有不同值的令牌?
- python - 为什么一个类的属性被设置一个值,但打印一个 None 类型?
- javascript - javascript中的版本控制
- android - 虚幻引擎AudioRecord()启动错误-38 Android
- java - 多个文件阅读器同时并行读取同一个文件
- c# - 实体框架中一个或多个实体的可空布尔属性验证失败
- javascript - 其他控制器未收到角度广播事件
- javascript - 除非选择特定变体,否则隐藏输入字段 - Shopify
- python - 在 Python 中的 API 网关请求中使用 AWS Cognito 访问令牌
- xslt-2.0 - 如何匹配元素中区分大小写的字符