在C ++中将函数作为参数传递时出错

时间:2016-04-29 13:22:07

标签: c++ function random

当我试图将一个函数作为参数传递给另一个函数时,我用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次,我得到了相同的价值! output

这有什么理由吗?我错过了什么吗?

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

没有什么奇怪的事情发生。此代码打印出传递给它的地址,地址不是随机的。

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

你需要在这里调用函数,或者,如果你的目的是将它附加到流中调用它,而是实现类似于流操作符的东西。