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

非定数にして、applicationDidBecomeActive で初期化します。一定でなければならない理由はありますか?

于 2009-06-29T20:13:05.617 に答える
0

誰かが疑問に思っている場合に備えて、私はついにこれを効果的に行う方法を見つけました. (これは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;

番号を開始するために、そこから、生成された 1、生成された 2、色相などを、必要な関数の変数として使用できました (ファイルの先頭で、これらの変数を float として宣言するようにしました)。

于 2009-07-13T14:36:43.127 に答える
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 が付属しています)。

… ラベルに同じ値を呼び出すことができませんでした。

ここにはラベルが表示されておらず、値を呼び出すことはできません。関数を呼び出すことしかできず、示されているコードには関数がありません。

applicationDidBecomeActive.

いいえ、そうではありませんでした。変数に代入しても関数は作成されません。

于 2009-06-30T03:19:55.520 に答える