【问题标题】:Error when passing function as an argument in C++ [closed]在 C++ 中将函数作为参数传递时出错 [关闭]
【发布时间】:2016-08-24 16:25:04
【问题描述】:

当我试图将一个函数作为参数传递给另一个函数时,我在使用 C++ 时遇到了这个奇怪的事情。这里的问题是它有效但没有给我预期的结果。 这是我的代码(msvc2013):

#include <stdio.h>      /* printf, NULL */
#include <stdlib.h>     /* srand, rand */
#include <time.h>       /* time */
#include <iostream>

typedef unsigned int uint32_t;
typedef unsigned char uint8_t;
using namespace std;

#include "stdafx.h"

uint32_t random_color()
{
    uint8_t r = rand() % 255;
    uint8_t g = rand() % 255;
    uint8_t b = rand() % 255;
    uint32_t rgb = ((uint32_t)r << 16 | (uint32_t)g << 8 | (uint32_t)b);

    return rgb;
}

void print_rgb(uint32_t(*color_generator)() = &random_color)
{
    std::cout << color_generator << std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    for (int i = 0; i < 5; i++)
    {
        srand(time(NULL));
        print_rgb();
    }
    system("PAUSE");
    return 0;
}

这段代码的目的更复杂,但这是一个最小的例子。

问题:虽然如您所见,有一个srand(time(NULL)); 可以让rand() 更改值,但它没有!

所以,在 5 次中,我得到了相同的值!

这有什么原因吗?我错过了什么吗?

【问题讨论】:

  • 如果你需要随机数,不要使用rand()。问题是您使用相同的种子在循环内播种 rng 并且两次迭代之间的时间不会改变。 SO上有几十个重复项。
  • 这不是目前的问题,但只调用一次srand。不要每次循环调用它。
  • 如果它没有给出预期的结果,那么它就不起作用。

标签: c++ function random


【解决方案1】:

看起来你正在打印函数指针的值,你的代码应该是:

std::cout << color_generator() << std::endl;

【讨论】:

  • 没用!相同的输出 5 次。
  • @YassinNasri 将srand()移出循环,但最好使用更可靠的随机数生成器
【解决方案2】:

没有什么奇怪的事情发生。这段代码打印出传入的地址,地址不是随机的。

void print_rgb(uint32_t(*color_generator)() = &random_color)
{
    std::cout << color_generator << std::endl;
}

您需要在此处调用该函数,或者,如果您的意图是将其附加到流中会调用它,则改为实现类似于流操纵器的东西。

【讨论】:

  • 有什么建议吗? @Slava 答案也不起作用!
猜你喜欢
  • 1970-01-01
  • 2011-04-14
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多