2010-08-02 4 views
0

Je n'arrive pas à comprendre pourquoi j'obtiens une erreur sur le flag. Toute aide serait appréciée! l'objectif est de générer un caractère de 40 en utilisant les caractères spécifiés ci-dessous.Utilisation de la variable locale non affectée 'flag'

public static string udidGen() {

 bool flag; 
     string s1 = ""; 
     string[] sArr2 = new string[] { 
             "0", 
             "1", 
             "2", 
             "3", 
             "4", 
             "5", 
             "6", 
             "7", 
             "8", 
             "9", 
             "a", 
             "b", 
             "c", 
             "d", 
             "e", 
             "f" }; 
     string[] sArr1 = sArr2; 
     Random random = new Random(); 
     int i = 0; 

     while (**flag**) 
     { 
      s1 += sArr1[random.Next(0, 15)]; 
      i++; 
      flag = i < 40; 
     } 
     return s1; 
    } 
+0

Mis à part les questions de style de codage (ajout d'une chaîne, boucle claire, la copie de tableau inutile, etc.), il y a une autre chose qui est cassé ici - pour random.Next, le 2ème argument doit être 16, pas 15. random.Next (0, 16) vous donnera un nombre aléatoire entre 0 et 15 (ne me demandez pas pourquoi ils l'ont fait de cette façon). –

+1

En outre, votre variable aléatoire doit être déclarée comme un champ statique et instanciée une seule fois (ou instanciée avec une graine différente à chaque fois). Cela garantira que chaque fois qu'il appelle "Suivant" il vous donnera quelque chose de aléatoire, et pas les mêmes valeurs à chaque fois. Pour démontrer, essayez de faire cet appel 10 fois de suite - vous obtiendrez probablement le même résultat plusieurs fois de suite. –

Répondre

2

Vous utilisez le drapeau sans lui assigner une valeur. Remplacez la première ligne par:

bool flag = true;

Mieux encore, se débarrasser de 'drapeau' tout à fait et remplacer la boucle while avec une boucle

for (int i = 0; i < 40; i ++) { ... }

+0

Tu m'as battu dessus! –

0

La première fois que le while s'exécute, flag n'a encore jamais été défini - remerciez le compilateur/runtime de vous avoir signalé ce qui aurait pu s'avérer être un bug très difficile à attraper!

Vous devriez initialiser la variable à true avant la boucle, idéalement dans la déclaration elle-même:

bool flag = true; 
+0

Je ne comprends pas cela, bool est un type de valeur et a donc une valeur par défaut de faux? Juste eu la même erreur et il m'a confondu – DavidB

+1

@DavidB, par https://msdn.microsoft.com/en-us/library/83fhsxwc.aspx, "en utilisant des variables non initialisées en C# n'est pas autorisé" - les valeurs par défaut n'ont rien à faire avec l'affaire. –

+0

Top un - j'ai trouvé cet article hier. A été surpris que je n'avais jamais remarqué auparavant – DavidB

0

variables flag n'a pas été initialisées, ce qui est interdit par le compilateur C#. Dans ce cas, vous voulez le rendre vrai afin que vous entriez dans la boucle au moins une fois.

bool flag = true; 
Questions connexes