2013-07-29 2 views
0

임시 파일을 생성하기위한 함수는 tmpnam()입니다. 당신이 진짜 필요한 매크로 RND_ROUND하고 다른 사람들이 번호 생성기로 전달하는 파생 볼 수 있듯이C 매크로는 가변 길이 값을 정의합니다.

/* The length of random string. In /tmp/test143276 is 143246 */ 
#define RND_ROUND 6 
/* Used as a minimal bound produced by number generator  */ 
#define RND_MIN 100000 
/* Used as a maximum bound produced by number generator  */ 
#define RND_MAX 1000000 

:이 일을 조정하기위한 나는 다음과 같은 정의를 사용합니다. 그리고 생성을위한 공식은 다음과 같습니다

RND_MIN = 1 and [RND_ROUND-1] zeros 
RND_MAX = 1 and [RND_ROUND] zeros 

질문 : RND_MINRND_MAX이 컴파일시에 RND_ROUND에 따라 생산하는 몇 가지 매크로를 만들 수있는 방법?

예 :

#define RND_ROUND 6 
// somehow define those RND_MIN and RND_MAX 
... 
int32_t random = g_rand_int_range(generator, RND_MIN(RND_ROUND), RND_MAX(RND_ROUND)); 
+0

전원 기능을 사용할 수 있습니까 ?? –

+0

바이너리 패턴을 사용할 수 있습니까? –

+0

글쎄, 일반적으로 할 수는 있지만,'RND_MIN'과'RND_MAX'는 런타임에 절대로 변경되지 않으므로 바람직하지 않습니다. 따라서 모든 호출 ('create_tmp_file'과 같은 함수에서)이 자원을 낭비합니다. – likern

답변

3

당신은 일을하기 위해 전원 기능을 사용할 수 있습니다.

#define RND_MIN (pow (10, RND_ROUND-1)) 
#define RND_MAX (pow (10, RND_ROUND)) 

또는 전달 된 인수에 따라 난 당신이 전원 기능을 사용할 수 있습니다 올바른 오전 경우

#define RND_MIN(val) (pow (10, (val)-1)) 
#define RND_MAX(val) (pow (10, (val))) 
3

:

#define RND_MIN(RND_ROUND) pow(10, RND_ROUND - 1) 
#define RND_MAX(RND_ROUND) pow(10, RND_ROUND) 

당신은 읽을하실 수 있습니다 : How to simplify this power equation?

+0

이것은 컴파일 타임에없고 런타임에 실행된다는 것을 의미합니까? – likern

+0

@ user966467'power' 함수가 런타임에 호출됩니다. –

+0

@ user966467 [이진수를 10 진수로] (http://math.stackexchange.com/questions/454716/binary-to-decimal)를 읽으십시오. 그러므로 pow()'function 다른 방법으로는 알지 못합니다. –

1

나는 약 RND_ROUND를 잊어을 제안 :이 컴파일 시간이다, 어쨌든 ! 당신이 정말로 RND_ROUND, RND_MINRND_MAX 컴파일 타임이 아닌 필요한 경우

#define RND_BASE 1000000 
#define RND_MIN RND_BASE 
#define RND_MAX (RND_BASE*10) 

이제 가정 당신의 RND_ROUND 당신이 #if 함께 분기 수없는, pow로 확대되고 (RND_MAX 그래서, g_rand_int_rangegint32로 제한되어 있습니다 < 2^31 = 2'147'483'648 < 10^10)이 가능하다 :

#if RND_ROUND <= 1 
# define RND_MIN 1 
#elif RND_ROUND <= 2 
# define RND_MIN 10 
#elif RND_ROUND <= 3 
# define RND_MIN 100 
#elif RND_ROUND <= 4 
# define RND_MIN 1000 
#elif RND_ROUND <= 5 
# define RND_MIN 10000 
#elif RND_ROUND <= 6 
# define RND_MIN 100000 
#elif RND_ROUND <= 7 
# define RND_MIN 1000000 
#elif RND_ROUND <= 8 
# define RND_MIN 10000000 
#else 
# define RND_MIN 100000000 
#endif 

#define RND_MAX (RND_MIN*10) 

이것은 또한보다 안전한 것, RND_ROUND을 제한하여 정수 오버 플로우가 발생하지 않도록하십시오.