Lecture seule, variable en C# WinForm

Résolu/Fermé
damiens1026
Messages postés
553
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
- Modifié par damiens1026 le 25/06/2011 à 23:07
damiens1026
Messages postés
553
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
- 26 juin 2011 à 02:34
Bonjour,

Je suis en train de réaliser un générateur aléatoire de nombre pour les keys d'un logiciel que j'ai codé et je n'arrive pas à générer cela:

private void monBouton_Click(object sender, EventArgs e)    
        {    
            for (i = 0; i <= 29; i++) /*Boucle de génération du code qui fait 29 caract.*/    
            {    
                if (i == 5 || i == 12 || i == 18 || i == 25) /*Si le code arrive à 5, 12, etc. chiffres, il met un tiret (séparation du code) à la position i    
                {    
                    str_Code[i] = '-'; /*Il insère le tiret*/    
                }    
                else    
                {    
                    str_Code[i] = Convert.ToChar(Base.Next(10)); /*Autrement il génère un chiffre aléatoire à la position i*/    
                }    
            }    
        }


Je réponds volontiers à toute question et merci d'avance pour laide!



Meilleures salutations
damiens1026

4 réponses

DJ Fire-Black
Messages postés
6554
Date d'inscription
vendredi 28 décembre 2007
Statut
Contributeur
Dernière intervention
27 juin 2021
455
Modifié par DJ Fire-Black le 25/06/2011 à 03:15
En fait, quand tu fais str_Code[i], tu essaies d'accéder/modifier une case d'un tableau qui n'existe pas encore dans str_Code au lieu de la créer, donc à un endroit de la mémoire qui n'appartient pas encore à ton programme (endroit qui est logiquement en lecture seule).

Si tu fais str_Code += "lachaine", là tu demandes explicitement à AJOUTER et non accéder/remplacer les valeurs du tableau. Apparemment en c#, ce serait le seul moyen.

De plus pour ton code, tu demandes bien à ajouter une lettre à chaque fois dans ta boucle. Donc ça revient au même.

Voilà j'espère que tout va fonctionner pour toi.
Musicalement,
DJ Fire-Bl@ck.
1
damiens1026
Messages postés
553
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
25 juin 2011 à 12:17
Je n'ai pas tout compris :S
Je veux insérer à un endroit précis dans la string, une valeur soit char soit int, je ne vois pas comment le str_Code += "lachaine" pourrait il insérer à un endroit précis ma valeur...
0
DJ Fire-Black
Messages postés
6554
Date d'inscription
vendredi 28 décembre 2007
Statut
Contributeur
Dernière intervention
27 juin 2021
455
25 juin 2011 à 12:37
Ta façon d'ajouter à un endroit précis reviendrait au même que d'ajouter les lettres une par une. C'est exactement ce que ta boucle for est sensée faire, aller de 0 à 29 compris (soit 30 lettres).

Tu sais au moins que les instructions sont exécutées une par une, dans l'ordre où elles sont écrites ?
Reprends bien ton code. Imagine toi au départ de ta boucle. Ta chaine vaut "". En faisant str_Code += "4", Tu lui demande d'ajouter la première lettre 4 (par exemple). Et ensuite la deuxième ... etc.
C'est la même chose, et c'est même encore plus simple que de vouloir modifier directement la chaine à un endroit précis.

Moi, je te dis que ça va fonctionner alors essaies.

Deuxième solution, qui devrait te plaire, mais je ne pense pas que ce soit très conventionnel :
Déclare ta chaine str_Code avec déjà 30 cases dedans.
(Je dis case, parce que les chaines ne sont que des tableaux numériques).

string str_Code = "------------------------------";  
0
damiens1026
Messages postés
553
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
Modifié par damiens1026 le 25/06/2011 à 14:44
Oui mais si je fais str_Code += 4 et par la suite, une autre instruction du genre str_Code += 9, il va changer le 4 en 9, non? C'est ça que je ne comprends pas...
0
damiens1026
Messages postés
553
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
25 juin 2011 à 14:46
Sinon ce que je peux faire, c'est a chaque ajout d'un nombre je multiplie le précédant par une dizaine, exemple. SI je nom en case o est 2, je le multiplie par 10 et ajoute le nombre de la case 1...
0
DJ Fire-Black
Messages postés
6554
Date d'inscription
vendredi 28 décembre 2007
Statut
Contributeur
Dernière intervention
27 juin 2021
455
Modifié par DJ Fire-Black le 25/06/2011 à 16:41
Nan pas du tout !
str_Code += '4' c'est comme si tu faisais :
 str_Code = str_Code + '4';

Du coup ça va ajouter à la fin de ta chaine à chaque fois ;)
0
DJ Fire-Black
Messages postés
6554
Date d'inscription
vendredi 28 décembre 2007
Statut
Contributeur
Dernière intervention
27 juin 2021
455
Modifié par DJ Fire-Black le 25/06/2011 à 02:57
Salut,

Tu as des erreurs ou non ?

Déjà il me semble que :

 for (i = 0; i <= 29; i++)


Devrait être :

 for (int i = 0; i <= 29; i++)


Ensuite, tu devrais nous guider un peu plus pour savoir ce qui cloche.

Edit : Ensuite, je ne sais pas si ce sera fonctionnel, tu devrais tester après.
Quand tu veux ajouter une lettre à str_Code, faire str_Code += ...

Musicalement,
DJ Fire-Bl@ck.
0
damiens1026
Messages postés
553
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
Modifié par damiens1026 le 25/06/2011 à 02:57
Alors en fait, toutes mes variables sont déclarées plus haut dans le code...
        string str_Code;  
        Random Base = new Random();  
        int i;

Ensuite, il me dit que "La propriété ou l'indexeur 'string.this[int]' ne peut pas être assigné -- il est en lecture seule"
Meilleures salutations
damiens1026
0
damiens1026
Messages postés
553
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
25 juin 2011 à 02:58
J'avais déjà fait pareil en assignant l'endroit dans la string où il devait écrire, mais ça avait marché...
0
DJ Fire-Black
Messages postés
6554
Date d'inscription
vendredi 28 décembre 2007
Statut
Contributeur
Dernière intervention
27 juin 2021
455
25 juin 2011 à 02:59
0
damiens1026
Messages postés
553
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
Modifié par damiens1026 le 25/06/2011 à 23:06
Bon, alors réussis:
        private void btn_Generer_Click(object sender, EventArgs e)  
        {  

            for (i = 0; i < 29; i++)  
            {  
                if (i == 4 || i == 11 || i == 17 || i == 24)  
                {  
                    str_Code += "-";  
                }  
                else  
                {  
                    {  
                        str_Code += Convert.ToString(Base.Next(10));  
                    }  
                }  
            }  
        }


Merci messieurs!
Meilleures salutations
damiens1026
0
DJ Fire-Black
Messages postés
6554
Date d'inscription
vendredi 28 décembre 2007
Statut
Contributeur
Dernière intervention
27 juin 2021
455
25 juin 2011 à 23:38
J'ai l'impression qu'il y a des accolades en trop pour le bloc else ...

;)
0
damiens1026
Messages postés
553
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
26 juin 2011 à 02:16
je ne crois pas, une ferme le else, l'autre le for et après de le private...
0
DJ Fire-Black
Messages postés
6554
Date d'inscription
vendredi 28 décembre 2007
Statut
Contributeur
Dernière intervention
27 juin 2021
455
26 juin 2011 à 02:26
                else  
                {  
                    {  
                        str_Code += Convert.ToString(Base.Next(10));  
                    }  
                }  


-->>

                else  
                {  
                        str_Code += Convert.ToString(Base.Next(10));  
                }  


Nan ? :o
0
damiens1026
Messages postés
553
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
26 juin 2011 à 02:34
ah, oui en effet, c'est juste! J'avais même pas vu!
0
damiens1026
Messages postés
553
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
26 juin 2011 à 02:34
Merci
0