IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Erreur d'index sur une List<int> dans boucle for


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de popoliline
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 88
    Par défaut Erreur d'index sur une List<int> dans boucle for
    Bonsoir,

    Je travaille actuellement sur un projet pour lequel je dois réutiliser un script php.
    Je débute en c# et je galère pas mal pour faire la retranscription du php vers c#
    En voulant débugger ce que j'ai fait, je lève une erreur au niveau d'une liste que je veux remplir dans une boucle for et je n'arrive pas à savoir comment résoudre ce problème :
    L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection.
    Nom du paramètre : index
    Voici le code php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    $distanceAuxMoyennes = array();
     
    for($indValeur=0; $indValeur< $nbindividus; $indValeur++)
      {
       $valeurCourante = $valeurs[$indValeur];
     
       for($indClasse=0;$indClasse<$nbClasse;$indClasse++)
          {
            $distanceAuxMoyennes[$indClasse] = pow(($moyenneParClasse[$indClasse] - $valeurCourante),2);  
          }
     
       $minDistanceAuxMoyennes = min ($distanceAuxMoyennes);
     
       $rangMinDistanceAuxMoyennes = array_search($minDistanceAuxMoyennes, $distanceAuxMoyennes);
     
       $rangClassePrecDeValeurCourante = determineClasse($indValeur,$nbClasse, $compteurClasseIterationPrec  );
     
       if($rangMinDistanceAuxMoyennes!=$rangClassePrecDeValeurCourante)
       {
        $compteurClasseIterationCourante[$rangClassePrecDeValeurCourante]--;	
        $compteurClasseIterationCourante[$rangMinDistanceAuxMoyennes] ++;
       }
    }
    et ce que j'ai fait en c# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    List<int> MeanDist = new List<int> ();
    for ( int IndValue = 0 ; IndValue < NbData ; IndValue++ )
      {
        int CurrentValue = Data[IndValue];
    
        for ( int IndClass = 0 ; IndClass < NbClass ; IndClass++ )
        {
         MeanDist[IndClass] = ( (int) ( Math.Pow ( (double) ClassMean[IndClass] - (double) CurrentValue, 2 ) ) ); // j'ai déjà une erreur ici
         }
    
         List<int> MeanDistSort = new List<int> ( MeanDist );
         MeanDistSort.Sort ();
         int MinimumMeanDist = MeanDistSort[0];
    
         int IndexMinimumMeanDist = MeanDist.IndexOf ( MinimumMeanDist );
    
         int IndexPreviousClassCurrentValue = DetermineClass ( IndValue, NbClass, ClassCounterPreviousIteration );  // DetermineClass est une méthode
    
         if ( IndexMinimumMeanDist != IndexPreviousClassCurrentValue )
           {
            ClassCounterCurrentIteration[IndexPreviousClassCurrentValue]--;
            ClassCounterCurrentIteration[IndexMinimumMeanDist]++;
           }    
    }
    Donc en fait je n'arrive à faire en sorte que la valeur de ma liste se modifie à chaque tour.
    j'ai essayé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MeanDist.add ( (int) ( Math.Pow ( (double) ClassMean[IndClass] - (double) CurrentValue, 2 ) ) );
    mais le problème c'est qu'à chaque nouvelle itération j'ai un index qui se rajoute dans ma liste, alors que je souhaite juste modifier la valeur en fonction de l'index. En faite la taille de ma liste ne doit pas changer, c'est juste aux valeurs d'être modifiées.

    J'ai utilisé des listes à la place des tableaux mais est-ce déjà la bonne solution ?
    J'imagine que ce n'est pas très clair, c'est déjà pas super pour moi mais si vous aviez une idée pour me débloquer ce serait top.

    Au pire, la question générale c'est comment faire pour utiliser et modifier une valeur de ma liste dans une boucle for à chaque nouvelle itération ?

    En vous remerciant par avance.

  2. #2
    Membre expérimenté Avatar de el_pedro
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 200
    Par défaut
    Salut.

    Le soucis est que utilise ta liste comme un tableau PHP. Une liste en Csharp ne permet pas d'insérer un valeur à n'importe quel index (comment en PHP) mais seulement de les empiler.

    Donc tu instancie ta liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<int> MeanDist = new List<int> ();
    Et dans ton deuxième FOR tu essai d'insérer une données à l'index IndClass :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MeanDist[IndClass] = ( (int) ( Math.Pow ( (double) ClassMean[IndClass] - (double) CurrentValue, 2 ) ) ); // j'ai déjà une erreur ici
    Si ça ;plante, c'est tout à fait normal, dès le premier tour de FOR (index à 0) tu essai d'accéder à l'index 0 de ta liste, mais ta liste est complètement vide, il n'y existe aucun index et aucune donnée derrière.

    Ce que tu peux faire pour que ton bout de code puisse tourner c'est utiliser un un tableau d'int et non pas une liste. Mais attention, contrairement au PHP, les tableau Csharp on besoin de connaitre leur taille maximum.

    Essai de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<int> MeanDist = new List<int> ();
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int[] MeanDist = new int[NbClass];
    Tu devrai alors passer ton erreur. Mais tu devra aussi changer ta list MeanDistSort ou bien mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<int> MeanDistSort = MeanDist.ToList();
    Finallement, à voir ton code, je pense que tu t'embête un peu. Utiliser des List, BIEN, les parcourir avec des foreach, MIEUX.
    Tu devrai trouver ton bonheur ensuite en utilisant la méthode IndexOf(int) de tes listes.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 7
    Par défaut
    Je ne suis pas d'accord avec ta suggestion de passer sa liste en tableau. Il vaut bien mieux s'en tenir à celle-ci et l'utiliser correctement.

    Là effectivement, j'ai l'impression que ton problème tient au fait que tu essaies de manipuler des indexes qui n'existent pas encore. Ta boucle imbriquée correspond bien à ton premier accès à la liste ou elle est déjà remplie ?
    Pour insérer un élément à la fin d'une liste : MeanDist.Add(valeur)
    Pour insérer à une position spécifique : MeanDist.Insert(index, valeur)
    Je pense que c'est tout ce que tu as besoin de savoir. Je te recommande de lire un cours sur les collections en .Net...

    Je ne comprend pas la portion de code avec la classe Counter sinon...

  4. #4
    Membre expérimenté Avatar de el_pedro
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 200
    Par défaut
    Nonon, mon conseil est de manipuler autrement ses listes (t'a pas dut me lire jusqu'à la fin).

    Le passage de liste en tableau lui permet juste de corriger son problème mais risque d'engendrer un paquet d'autres problème pour la suite.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 7
    Par défaut
    Excuse moi mais à un moment tu lui dis
    Citation Envoyé par el_pedro Voir le message
    Ce que tu peux faire pour que ton bout de code puisse tourner c'est utiliser un un tableau d'int et non pas une liste.
    puis tu lui donnes la méthode sur les lignes suivantes, hormis sur les deux dernières lignes où tu parles du foreach (applicable aux tableaux aussi d'ailleurs). A cet égard on pouvait tout à fait interpréter ton post comme je l'ai fait et je pense que popoliline aurait fait de même.
    Enfin l'essentiel est que nous nous comprenions au final .

  6. #6
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    Bonjour

    L'intérêt de la collection, c'est de pouvoir ajouter des éléments à une suite d'éléments dont on ne connait pas forcément le nombre. Tu peux ajouter des éléments à la fin de la liste ou en insérer. Mais dans ce dernier cas, il ne faut pas insérer au delà du dernier index sinon, ça plante.

    Ensuite, il te faut savoir si l'ordre des éléments est important. (je n'ai pas complétement lu ton code pour le savoir). Si oui, deux possibilités : l'insertion "ordonnée" ou le tri ultérieur (si un critère de tri est déterminable).

  7. #7
    Membre expérimenté Avatar de el_pedro
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 200
    Par défaut
    Le tableau ne serais utile que dans le cas où l'index d'insertion est vraiment important. Sinon, la liste est vraiment plus simple d'utilisation et elle te fournis un index de la même façon.

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/09/2010, 17h05
  2. Réponses: 2
    Dernier message: 15/04/2010, 11h11
  3. 'Undefined index' sur une liste issue d'une requete
    Par Gareth dans le forum Langage
    Réponses: 9
    Dernier message: 26/05/2009, 11h35
  4. Réponses: 1
    Dernier message: 30/06/2008, 12h55
  5. [Débutant][jsp] évènement sur une liste
    Par phoebe dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 14/05/2004, 10h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo