Boucle for imbriquée

theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 - 24 oct. 2010 à 23:18
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 - 27 oct. 2010 à 21:06
Bonjour a tous.

J'ai un soucis sur une boucle for, j'aimerais savoir si vous pouvez m'aider la dessus .

Voici le code :

            int subnetn = Convert.ToInt32(nbsubnetr);
            int x = Convert.ToInt32(ipi);
            double nbexpo = Math.Pow(2, (Math.Ceiling(Math.Log10(subnetn) / Math.Log10(2))));

            List<LigneIp> l = new List<LigneIp>();
            for (int i = 0; i <= (nbexpo - 1); i++)
            {
                if (nbexpo > 8)
                l.Add(new LigneIp()
                {
                    colonne1 = "Adresse " + i,
                    colonne2 = ipr + x + "." + nbexpo * i
                }
                );
                else
                for (i = 0; (nbexpo * i) >= 256; i++, x += 1)
                {
                    l.Add(new LigneIp()
                    {
                        colonne1 = "Adresse " + i,
                        colonne2 = ipr + x + "." + nbexpo * i
                    }
                    );
                }
                dataGridView1.DataSource = l;
            }
        }
    }
}



J'aimerais que quand "nbexpo * i" est supérieur à "256", i retourne à 0 pour finir la boucle mais aussi qu'il rajoute +1 a la valeur x.
Mais avec ce code ca ne me donne qu'une valeur ou sa plante .

Voila merci d'avance.

5 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
25 oct. 2010 à 10:40
Salut,

L'affectation
dataGridView1.DataSource = l;
me semble pas au bon endroit.

La condition d'arret n'a pas de fin dans la deuxieme boucle.

Deroules tes valeurs pour la deuxieme boucle
Il n'est pas conseillé d'utiliser la meme variable i pour la boucle externe et la boucle interne.

Corriges ses points ci prends un papier un crayon et ecrit à la main les valeurs que tu veux.

Utilises le mode pas à pas du débugger et les espions et le console.write par exemple et regardes si ca correspond!!

Et corriges au fur et à mesure.

Bon courage.
0
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
25 oct. 2010 à 12:44
Oki je vais essayer comme ça. Je te tien au courant.

Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
0
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
26 oct. 2010 à 00:27
Bonsoir nhervagault, j'ai suivie tes conseils ça donne déjà quelques choses de plus ressemblant.
J'ai refais pas a pas et j'ai fait un exemple sur une feuille. Ensuite j'ai changé le i de la deuxième boucle en y.
Après avoir revue tous cela j'en suis arrivé là :

namespace WindowsFormsApplication1
{
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
        }
        public class LigneIp
        {
            public string colonne1 { get; set; }
            public string colonne2 { get; set; }
        }
        private void Form4_Load(object sender, EventArgs e)
        {
            //Au click appelle le formulaire Form1 pour pouvoir prendre les variables désirées
            Form1 nbsubnet = (Form1)this.Owner;
            string nbsubnetr = nbsubnet.nbsubnetr();

            Form1 ip = (Form1)this.Owner;
            string ipr = ip.ipr();

            Form1 ipb = (Form1)this.Owner;
            string ipi = ipb.ipi();

            //Convertir la valeur retourné en dec pour le tableau
            int subnetn = Convert.ToInt32(nbsubnetr);
            int x = Convert.ToInt32(ipi);
            double nbexpo = Math.Pow(2, (Math.Ceiling(Math.Log10(subnetn) / Math.Log10(2))));
            textBox1.Text = nbexpo.ToString();

            List<LigneIp> l = new List<LigneIp>();
            for (int i = 0; i <= (nbexpo - 1); i++)
            {
                if (nbexpo * i <= 256)
                l.Add(new LigneIp()
                {
                    colonne1 = "Adresse " + i,
                    colonne2 = ipr + x + "." + nbexpo * i,
                }
                );
                for (int y = 0;(nbexpo * i) >= 256 & y <= (nbexpo - 1); y++, x++)
                {
                    if (nbexpo * y <= 256)
                    l.Add(new LigneIp()
                    {
                        colonne1 = "Adresse " + y ,
                        colonne2 = ipr + x + "." + nbexpo * y
                    } 
                    );
                }
            } dataGridView1.DataSource = l;
        }
    }
}


Avec ce code cela me donne bien des séries, ça retourne bien à 0 et ça me rajoute bien +1 sur x, mais quand il arrive sur la deuxième boucle (celle quand nbexpo sera supérieur a 256 et ou il doit justement me gérer le x++) et qui l’exécute il me rajoute x++ à toutes les lignes, donc le x++ est surement mal placé, dois-je faire une troisième boucle pour le x++ ?
Et deuxième et dernier problème le nombre de ligne que cela me crée. le nombre de ligne devrais dépendre du nombre nbexpo (qui serait : 2, 4, 8, 16 ,32 ,64 ou 128) mais il a quand même réussi a m'en sortir 225 .

Voilà si tu as des idées quand tu as un moment évidement, je te remercie.

Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
26 oct. 2010 à 08:29
Prends un papier pour la deuxieme boucle!!

Ou deroules la dans la console de visual studio (fenetre output)
avec un console.write(....)

le x++ peut etre mis dans le corps de la boucle. C'est meme sa place.


Creuses un peu et réfléchis tu ne dois pas être loin.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
27 oct. 2010 à 21:06
Coucou nhervagault !

Bon ben j'ai creusé a fond et ......
J'ai enfin trouvé pour le x++ . Content d'avoir trouvé seul :) (avec de bonne indications quand même )
Qu'est t'en pense ? :
            int subnetn = Convert.ToInt32(nbsubnetr);
            int x = Convert.ToInt32(ipi);
            double nbexpo = Math.Pow(2, (Math.Ceiling(Math.Log10(subnetn) / Math.Log10(2))));
            textBox1.Text = nbexpo.ToString();

            List<LigneIp> l = new List<LigneIp>();
            for (int i = 0; i <= (nbexpo - 1); i++)
            {
                if (nbexpo * i <= 256)
                {
                    l.Add(new LigneIp()
                    {
                        colonne1 = "Adresse " + i,
                        colonne2 = ipr + x + "." + nbexpo * i,
                    }
                    );
                }
                else 
                { x++;
                for (int y = 0; (nbexpo * i) >= 256 & y <= (nbexpo - 16); y++)
                {
                    if (nbexpo * y <= 256)
                        l.Add(new LigneIp()
                        {
                            colonne1 = "Adresse " + y,
                            colonne2 = ipr + x + "." + nbexpo * y
                        }
                        );
                }
                }
            } dataGridView1.DataSource = l;
        }
    }
}

J'ai pas mit le x++ dans la structure de la boucle, je n'y arrivais pas comme ça.
Mais la sa a l'air d'être opérationnel.
Par contre je comprend vraiment pas le problème des lignes.. J'ai beau chercher je pense que doit y avoir une répétition entre les 2 boucles mais ...
Parce que là le nombre de ligne est complètement différent a nbexpo.
Voilou pour les nouvelles. Je te souhaite une bonne soirée.

Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
0
Rejoignez-nous