【问题标题】:Retain a random number across different functions in Cocoa?在 Cocoa 的不同函数中保留一个随机数?
【发布时间】:2009-06-29 19:57:17
【问题描述】:

我知道如何做一个全局变量,但是每当我尝试用随机数函数定义一个全局变量时,xcode 都会说“初始化元素不是常量”。编译器不想从随机数中生成变量,因为随机数函数不是常量。

如何生成一个随机数,然后将相同的值用于多个操作? (例如,定义一种颜色,然后将该值写入标签?)

代码:

#import "Slider_with_IBAppDelegate.h"

float * const hue = ((arc4random() % ((unsigned)100 + 1))/100.0);

//^this is where I get the error: "initializer element is not constant"

@synthesize label

//write value to label
- (IBAction) doButton {
label.text = [NSString stringWithFormat:@"%f", hue];
}

//set background color
- (void)applicationDidBecomeActive:(UIApplication*)application
{
self.label5.backgroundColor = [UIColor colorWithHue:hue                        
                                             saturation:1.0                                      
                                             brightness:1.0                                       
                                                  alpha:1.0];
}

----编辑-----

感谢您的建议。但是,它仍然对我不起作用,我做错了什么?

新代码:

#import "Slider_with_IBAppDelegate.h"

float const hue = ((arc4random() % ((unsigned)100 + 1))/100.0);

//^I still get the error: "initializer element is not constant."

@synthesize label

//write value to label
- (IBAction) doButton {
label.text = [NSString stringWithFormat:@"%f", hue];
}  
//^this is where I get the error "'hue' undeclared (first use of this function)"

//set background color
- (void)applicationDidBecomeActive:(UIApplication*)application
{

hue = ((arc4random() % ((unsigned)1000 + 1))/1000.0);
/*here I get the error "assignment of read-only variable 'hue.'"  
If I insert "float" just before hue, I do not get this error, 
but it still won't compile because of the error above.*/

self.label5.backgroundColor = [UIColor colorWithHue:hue                        
                                         saturation:1.0                                         
                                         brightness:1.0                                          
                                              alpha:1.0];
}

【问题讨论】:

    标签: cocoa cocoa-touch random colors global-variables


    【解决方案1】:

    使其成为非常量并在 applicationDidBecomeActive 中对其进行初始化。它必须保持不变有什么原因吗?

    【讨论】:

    • 我试过了,但我无法为标签调用相同的值。它在 doButton 中给了我错误“函数未定义:首次使用此函数”,即使它是在 applicationDidBecomeActive 中定义的。
    • 我的意思是让你将色调声明保持在原来的位置(没有指针 ,就像彼得说的那样),但是将分配移动到 applicationDidBecomeActive: float hue; ... - (void)applicationDidBecomeActive:(UIApplication)application { hue = ((arc4random() % ((unsigned)1000 + 1))/1000.0);这样,两个函数都可以看到 hue 的声明,但每次启动应用程序时都会赋予它一个新值。
    • 我没有意识到格式不正确。我希望我的解释得到通过,即使我的代码没有。 :)
    • 感谢您没有放弃我。 :) 它仍然不起作用。即使我确实这样做了,我现在在 applicationDidBecomeActive 下收到一条新消息,上面写着“错误:分配只读变量 'hue'”。我会发布修改。
    • 顶部的“const”使变量只读,因此它只能被赋值一次。从顶部删除 "const" 和 "((arc4random() ..." . [此外,当您在 applicationDidBecomeActive 中将“float”放在“hue”之前时,会在该函数内部创建另一个名为“hue”的变量,这就是为什么这会使函数编译而不是其他所有变量。]
    【解决方案2】:

    我知道如何做一个全局变量,但是每当我尝试用随机数函数定义一个全局变量时,xcode 都会说“初始化中的类型不兼容”。

    float * const hue = ((arc4random() % ((unsigned)100 + 1))/100.0);
    

    那不是函数;这是一种表达方式。如果您在这里没有收到错误,我会感到惊讶,因为您无法使用非常量表达式初始化全局变量。正如 alltom.com 所说,您需要从 applicationDidBecomeActive: 分配给它。

    警告是因为你给变量一个指针类型(float *),但你没有给它分配一个指针。去掉星号,因为你不会在这个变量中放置一个指针。

    Xcode 不想从随机数中生成变量,因为随机数函数不是常数。

    Xcode 不关心其中一种方式。它只是报告编译器的发现。默认情况下,Objective-C 的编译器是 GCC,但 Xcode 支持其他编译器(Xcode 确实附带了另一种 C/Objective-C 编译器:LLVM-GCC)。

    …我无法为标签调用相同的值。

    这里没有显示标签,也不能调用值。您只能调用一个函数,而显示的代码中没有。

    它在 doButton 中给了我错误“函数未定义:首次使用此函数”,即使它是在 applicationDidBecomeActive 中定义的。

    不,不是。分配给变量不会创建函数。

    【讨论】:

    • 感谢您帮助我弄清楚我的条款。 :) 是的,由于随机数不是恒定的,因此在全局变量之后出现错误。这就是我问题的重点。标签在头文件中定义。 doButton 将文本写入标签——我想要的只是打印 label5 的色调值。我确实尝试在 applicationDidBecomeActive 中对其进行初始化,只是没有在此处显示该版本的代码。也许我只是错过了一些东西。我会再试一次。
    【解决方案3】:

    如果有人想知道,我终于找到了一种有效地做到这一点的方法。 (我确定这就是 alltom 所说的,我只是太笨了,无法理解。)

    我在我的 .h 文件中声明了一个浮点数和一个种子:

    - (float)generate:(id)sender;
    - (void)seed;
    

    并且在实现文件中,我将float定义为一个随机数,并使用srandom()作为随机种子生成器。

    - (float)generate:(id)sender
    {
    
    //Generate a number between 1 and 100 inclusive
    int generated;
    generated = (random() % 100) + 1;
    
    return(generated);
    } 
    
    - (void)seed {
    srandom(time(NULL));
    }
    

    然后在任何我想保留随机数的地方,我都使用了

    srandom(time(NULL));
    generated1 = ((random() % 100) + 1)/100.0;
    

    启动数字,然后我可以在我想要的任何函数中使用 generate1、generated2、hue 等作为变量(并且我确保将这些变量声明为文件顶部的浮点数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      相关资源
      最近更新 更多