首页 > 解决方案 > 尝试生成随机数时 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);

    }
}

标签: c++

解决方案


主要问题似乎是这段代码看起来不像是由一个人逐段编写的。这就像从其他地方复制的点点滴滴的奇怪混搭,而且这些碎片不合适。

让我们来看看它。

#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::coutand 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,不是srandtime根本没有声明;你忘了包括<ctime>(或<time.h>,但你真的应该弄清楚你是用 C++ 还是 C 编程)。

    for(int i = 0; i <= N; i++){

不是硬错误,但看到从0to循环<= N会引发危险信号。通常是1with<=0with <。你这样做的方式,这个循环会迭代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此外,您正在创建仅存在于循环中的新局部变量yz并隐藏在开头声明的同名外部变量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,变量。使用得有些正确。被错误地使用(在它被初始化之前)。只是一个错误:它仅用作函数,而不是变量。zNvtpow


推荐阅读