1

我知道如何做一个全局变量,但是每当我尝试用随机数函数定义一个全局变量时,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];
}
4

3 回答 3

3

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

于 2009-06-29T20:13:05.617 回答
0

我知道如何做一个全局变量,但是每当我尝试用随机数函数定义一个全局变量时,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 中定义的。

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

于 2009-06-30T03:19:55.520 回答
0

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

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

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

在实现文件中,我将浮点数定义为一个随机数,并使用 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 等作为我想要的任何函数中的变量(并且我确保将这些变量声明为文件顶部的浮点数)。

于 2009-07-13T14:36:43.127 回答