2016-04-29 113 views
-1

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

#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

如果你需要随机数字,不要使用'rand()'。问题在于,你使用相同的种子在循环内播种rng,并且两次迭代之间的时间不会改变。在这个上有几十个重复。 – user463035818

+1

这不是呈现问题,但只调用'srand'一次。不要每次循环都调用它。 –

+0

如果它没有给出预期的结果,那么它不起作用。 –

回答

7

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

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

没有工作!相同的输出5次。 – Vtik

+2

@YassinNasri将'srand()'移出循环,但最好使用更可靠的随机数发生器 – Slava

+0

它的工作,谢谢 – Vtik

3

没有什么奇怪的是怎么回事。该代码打印出传递给它的地址,并且地址不是随机的。

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

您也需要调用的函数,在这里或者,如果你的目的是,它附加到流将调用它,而不是实行类似于流处理器的东西。

+0

任何建议如何做到这一点? @Slava答案也没有工作! – Vtik

相关问题