2016-04-29 110 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

相關問題