srandom的警告 - 隐式转换AND%d不是%long

时间:2014-09-08 09:43:10

标签: objective-c stringwithformat

警告1: 我正在按照教程创建一个应用程序,我需要使用srandom(time(NULL))。我在互联网上查了一下,发现arc4random可以解决这个问题,但是没有足够的信息让我知道如何解决。警告表明 -

'隐式转换失去整数精度:' time_t' (又名' long')到' unsigned int'

这是我使用srandom的代码。

- (void) shuffle {
NSMutableArray *validMoves = [[NSMutableArray alloc] init];

srandom(time(NULL)); // warning is here

for( int i=0; i<SHUFFLE_NUMBER; i++){
    [validMoves removeAllObjects];

警告2

警告告诉我:&#39;类型的值&#34; NSInteger&#34;不应该用作格式参数;添加一个显式的强制转换为&#34; long&#34;代替&#39;

我能否知道是否有任何方法可以解决此警告....或者我是否必须使用&#39; long&#39;来定义%d%ld?

    if ([prefs boolForKey:@"Refresh"] == TRUE) {
    countmove = 0;
    thetime = 0;
    if (timer != nil) {
        [timer invalidate];
        timer = nil;
    }
    NSString *Pic = [NSString stringWithFormat:@"image%d.png", [prefs integerForKey:@"PuzzlePicture"]];
    [self initPuzzle:Pic];

2 个答案:

答案 0 :(得分:0)

这是因为srandom(<#unsigned int#>)unsigned int为参数。如果您检查,typedef long __darwin_time_t; /* time() */属于long类型。这就是你得到这个警告的原因。

虽然很奇怪但是enter image description here并没有发生这种情况(当然我在编写这一行后构建了项目):

答案 1 :(得分:0)

编译器可以为您进行这些格式更改,因此没有理由不对它们进行更改。

请记住,NSInteger和NSUInteger的基础类型在32位和64位处理器(有意)上是不同的,因此您无法使用一种格式正确地在32位和64位上打印NSInteger(除了可以尝试z用于size_t)。