【问题标题】:Why am I getting "void value not ignored as it ought to be"?为什么我会得到“不应忽略的无效值”?
【发布时间】:2012-01-17 14:26:59
【问题描述】:

我有以下功能:

void getdata(int arr[], int n)
{

    for (int i = 0; i < n; i++) 
    {
        int a = srand(time(NULL));
        arr[i] = a;
    }
}

我将其称为main

getdata(arr, 1024);

我得到“没有被忽略的空值”,但我不明白出了什么问题。为什么会出现这个错误?

【问题讨论】:

  • 不要一遍又一遍地初始化 PRNG。每个程序运行一次就足够了。
  • arr 是如何声明的?你得到什么错误?你在说什么 void 值?
  • 你在做类似x = getdata(arr,1024) 的事情吗?
  • 您缺少一个分号。请更喜欢复制/粘贴您的代码,而不是重新输入。
  • 注意:如果您尝试将 arr 作为 VLA(可变长度数组)传递,您需要声明 void getdata(int n, int arr[n]) {...}

标签: c


【解决方案1】:
  int a = srand(time(NULL));

srand 的原型是void srand(unsigned int)(前提是您包含&lt;stdlib.h&gt;)。
这意味着它什么也不返回……但是您正在使用它返回的值 (???) 通过初始化分配给 a


编辑:这是你需要做的:

#include <stdlib.h> /* srand(), rand() */
#include <time.h>   /* time() */

#define ARRAY_SIZE 1024

void getdata(int arr[], int n)
{
    for (int i = 0; i < n; i++)
    {
        arr[i] = rand();
    }
}

int main(void)
{
    int arr[ARRAY_SIZE];
    srand(time(0));
    getdata(arr, ARRAY_SIZE);
    /* ... */
}

【讨论】:

  • 如何分配 arr[i] = srand(time(NULL))
  • srand(time(NULL)) arr[i] = rand() % 100 这里的srand函数是什么?
  • @mertmetin rand 在 [0,RAND_MAX] 中返回一个随机整数。 srand 只是初始化随机数生成器。这个生成器不是随机的(它实际上是一个伪随机数生成器)。使用 srand 将其初始化为某个种子值。对于相同的种子值,以下对rand 的调用将给出相同的数字序列。因此,在启动时调用srand 一次(或者在调用getdata 之前使用一些或多或少的随机值(在这种情况下基于当前时间)会使以下rand 调用在每次程序运行时都不同。
  • @mertmetin 但是每次在rand 之前调用srand 是一个坏主意,因为传递给srand 的相同值,rand 将返回相同的值。尽管您在这里引入了当前时间,但这仍然不是一个好主意。阅读我评论中指向其他答案的链接,以更深入地了解此事。
  • void value not ignored as it ought to be: 为什么会有这样神秘的错误信息?为什么不简单地void value cannot be assigned to non-void variable
【解决方案2】:

原始发帖人引用了 GCC 编译器错误消息,但即使通过阅读此线程,也不清楚该错误消息是否已正确解决 - 除了 @pmg's answer。 (+1,顺便说一句)


错误:空值没有被忽略,因为它应该被忽略

这是一条 GCC 错误消息,表示函数的返回值为“void”,但您正试图将其分配给非 void 变量。

例子:

void myFunction()
{
   //...stuff...
}

int main()
{
   int myInt = myFunction(); //Compile error!

    return 0;
}

您不能将 void 分配给整数或任何其他类型。

在OP的情况下:

int a = srand(time(NULL));

...不允许。 srand()according to the documentation,返回 void

此问题与以下问题重复:

我正在回复,尽管它是重复的,因为这是该错误消息在 Google 上的最高结果。由于此主题是最佳结果,因此此主题提供简洁、清晰且易于查找的结果非常重要。

【讨论】:

    【解决方案3】:

    srand 不返回任何内容,因此您无法使用其返回值初始化a,因为它不返回值。你是不是也想给rand打电话?

    【讨论】:

    • @mertmetin 所以不要打电话给srand,而是rand!明白了吗?
    【解决方案4】:
        int a = srand(time(NULL))
            arr[i] = a;
    

    应该是

            arr[i] = rand();
    

    并将srand(time(NULL)) 放在程序最开始的某个位置。

    【讨论】:

      【解决方案5】:

      “应忽略的无效值” 当像 srand(time(NULL)) 这样的函数没有返回某些内容并且您将其视为返回某些内容时,会发生此错误。与队列中的 pop() 函数一样,如果将弹出的元素存储在变量中,则会出现相同的错误,因为它不返回任何内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多