2009-06-29 3 views
1

Ich weiß, wie eine globale Variable zu tun, aber wenn ich versuche, eine globale Variable mit einer Zufallszahl-Funktion zu definieren, sagt xcode "Initialisierungselement ist nicht konstant." Der Compiler möchte keine Variable aus einer Zufallszahl machen, da die Zufallszahlenfunktion nicht konstant ist.Behalten Sie eine Zufallszahl über verschiedene Funktionen in Cocoa?

Wie erzeuge ich eine Zufallszahl und verwende dann denselben Wert für mehr als eine Aktion? (Zum Beispiel, um eine Farbe zu definieren und dann schreiben Sie diesen Wert auf ein Label?)

Code:

#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]; 
} 

---- ------ bearbeiten

Danke für die Vorschläge . Es funktioniert immer noch nicht für mich, was mache ich falsch?

Neuer Code:

#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]; 
} 

Antwort

3

Machen Sie es nicht konstanten und initialisieren es in applicationDidBecomeActive. Gibt es einen Grund, dass es konstant sein muss?

+0

Ich habe versucht, aber dann konnte ich nicht den gleichen Wert für das Etikett aufrufen. Es gab mir den Fehler "Funktion undefined: erste Verwendung dieser Funktion" in doButton, obwohl es in applicationDidBecomeActive definiert wurde. – Evelyn

+0

Was mache ich falsch? – Evelyn

+0

Ich meinte, du sollst die Farbtondeklaration dort lassen, wo sie war (ohne den Zeiger *, wie Peter sagte), aber verschiebe die Zuweisung zu applicationDidBecomeActive: float hue; ... - (void) applicationDidBecomeActive: (UIApplication *) -Anwendung { hue = ((arc4random()% ((unsigned) 1000 + 1))/1000.0); So können beide Funktionen die Deklaration des Farbtons sehen, aber es wird bei jedem Start der Anwendung ein neuer Wert angegeben. – alltom

0

I know how to do a global variable, but whenever I try to define a global variable with a random number function, xcode says "incompatible types in initialization."

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

Das ist keine Funktion; es ist ein Ausdruck. Ich würde mich wundern, wenn Sie hier nicht auch einen Fehler bekommen, weil Sie eine globale Variable nicht mit einem Ausdruck initialisieren können, der nicht konstant ist. Wie alltom.com sagt, müssen Sie ihm von applicationDidBecomeActive: zuweisen.

Die Warnung besteht darin, dass Sie der Variablen einen Zeigertyp (float *) zugewiesen haben, dem Sie jedoch keinen Zeiger zuweisen. Schneiden Sie den Stern aus, weil Sie keinen Zeiger auf diese Variable setzen.

Xcode kümmert sich nicht auf die eine oder andere Weise. Es berichtet nur die Ergebnisse des Compilers. Standardmäßig ist der Compiler für Objective-C GCC, aber Xcode unterstützt andere Compiler (und Xcode kommt mit einem anderen C/Objective-C-Compiler: LLVM-GCC).

… I couldn't call the same value for the label.

Sie zeigen hier kein Label, und Sie können keinen Wert aufrufen. Sie können nur eine Funktion aufrufen, und Sie haben keine im angezeigten Code.

It gave me the error "function undefined: first use of this function" in doButton even though it was defined in applicationDidBecomeActive.

Nein, war es nicht. Wenn Sie einer Variablen zuweisen, wird keine Funktion erstellt.

+0

Danke, dass Sie mir geholfen haben meine Begriffe gerade :) Ja, ich bekomme einen Fehler nach der globalen Variable wegen der Tatsache, dass die Zufallszahl nicht konstant ist.Das ist der springende Punkt meiner Frage Das Label ist in der Header-Datei definiert doButton schreibt Text auf das Etikett - ich möchte nur den Farbton von label5 drucken Ich habe versucht, es in appli zu initialisieren cationingDidBecomeActive, ich habe diese Version des Codes hier nicht angezeigt. Vielleicht habe ich gerade etwas verpasst. Ich werde es nochmal versuchen. – Evelyn

0

Falls jemand sich wundern sollte, habe ich endlich einen Weg gefunden, dies effektiv zu tun. (Ich bin sicher, das ist, was alltom sagt, ich war einfach zu dumm zu verstehen.)

ich einen Schwimmer erklärt und einen Samen in meiner .h-Datei:

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

Und in der Implementierungsdatei, Ich habe den Float als eine Zufallszahl definiert und ich habe srandom() als Zufallsgenerator verwendet.

- (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)); 
} 

Dann überall wollte ich eine Zufallszahl halten, ich

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

die Nummer zu initiieren, und von dort konnte ich generated1 verwenden, generated2, Farbton, usw.als Variablen in jeder Funktion, die ich wollte (und ich stellte sicher, diese Variablen als Floats am Anfang der Datei zu deklarieren).

Verwandte Themen