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++Builder Discussion :

Erreur List Index Out Of Bound


Sujet :

C++Builder

  1. #1
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut Erreur List Index Out Of Bound
    Bonjours, jai une application multi thread qui fonctionne niquel dans la plupart des cas ..

    Mais la j'ai laiser tourner toute la nuit (c'est une appli qui doit fonctionner 24h/24) jai eu plusieur Dizaine d'erreur du stule Index Out Of Band (XXX) (xxx etais preque a chaque fois different).
    Etant doner que le poste sur lequelle le programme n'a pas builder, jai eseyer de reproduire l'erreur sur mon pc, et jai reusi une fois et il ma mis l'ereur juste apres le Application->Run sa me semble bizare

    Le programme fonctionne nikel pendant des heures, mais meme avec ces ereur je clike que ok et sa repart.

    Un probleme peut etre lié et que certain thread sarete il me semble ... malgré le fait qu'il y ai une boucle infini dans le execute du thread ... je ne vois vraiment plus comment debugger tous sa :s

    Si quelqu'un pouvais m'aider s'il vous plait

    Cordialement Baxter
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  2. #2
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Pour information mon programme fais la supervision d'un automate.

    Jai un thread qui lit et qui ecrie des info dans l'automate a partir de tableau que jai aloué dinamiquement (il sont de la bonne taille)
    Jai plusieur autre thread qui accéde a ces tableau pour changer la couleur de boutons, afficher des valeurs ou afficher des message, ou encore de géré le tracage de courbe TChart lefacement de ces courbes et lexportation impression de ces courbes.

    voila
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  3. #3
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Au vu de ton erreur, tu dois essayer d'accéder à un index qui n'existe pas dans une liste.

    Comme ca, c'est pas évident de t'aider sans avoir de code

  4. #4
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    ben j'aimerais bien donner du code ... mais il ma pas montré ou exactement il a planter ...
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  5. #5
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    de temps en temps sa saconpagne d'un message d'ereur du type ...

    Acces violation at adress 00440C63 in module 'project.exe'
    Read of address 00000014
    je me tape la tete contre un mur, avant sa fonctionnais nikel

    Et etant doner que mes lecture dans les list son ciclique, si je fesais la dedans quelque chose que javais pas le droit il devrais me faire une erreur a chaque fois ... mais la c ponctuelle et completement aléatoire
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  6. #6
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Comment génère tu l'index pour accéder à tes listes.

    Moi j'ai déjà eu se problème ou l'index que je génèrais n'existait pas dans ma liste et ca me fesait cette erreur, et comme toi de façon aléatoire.

    Si je comprend bien, tu n'a pas réussi a identifier quelle ligne provoque l'erreur.

    C'est par là qu'il faudrais commencer

    tu ne pourrais par faire un affichage de ton index a chaque fois que tu veux acéder à tes liste, ca te permettrait de voir s'il est correct ou non.

  7. #7
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    voici les deux fonction qui accede au donnée du tableau en s'aidant d'une liste :


    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    //---------------------------------------------------------------------------
    int AccesDataRead(int iVal)
    {
      int iIndex = -1;
      int iReturn;
     
            //Fonction retourant la valeur du MW iVal ou -1 si le MW n'est pas lue
     
            iIndex = Form1->slListMWRead->IndexOf(IntToStr(iVal));
            if(iIndex != -1)
                    iReturn = Form1->TabValeurIndex[iIndex];
            else
                    iReturn = -1;
     
            return iReturn;
    }
    //---------------------------------------------------------------------------
    int AccesDataRead(int iVal, int iBit)
    {
      int iValRetourner = -1;
     
            iValRetourner = AccesDataRead(iVal);
     
            if(iValRetourner != -1)
            {
                    if((iValRetourner>>iBit)& 0x01)
                            return 1;
                    else
                            return 0;
            }
            else
                    return -1;
    }
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  8. #8
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Bon en eseyant dafficher lindex auquele on accede, il a fais le acces data read etc a l'index 145
    Ma list et mon tableau contienne 385 lignes ... donc normalement c bon :s
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  9. #9
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Tu as essayé de balayer l'ensemble des valeurs de ton tableaux pour voir s'il le lisait en entier.

    Pourquoi tu n'utilise pas uniquement des listes au lieu de tableaux.

    Cela serait beaucoup plus simple pour l'allocation.
    Tu crée un élément liste et tu l'ajoute dans ta liste. tu fais cela pour chaque élément que tu veux ajouter dans la liste. (pour toi un élément liste, c'est un pointeur d'entier mais tu peux te créer une classe qui va bien pour stocker ton entier, moi c'est ce que je fais).

  10. #10
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Ben, jai des tableau de ansistring et de int

    pour les Ansistring je peut utiliser des TStringList mais pas pour les int a moin de frequement faitr InToStr et StrToInt ...

    Ce que javais penser pour les message par exemple
    pour le moment jai


    - un tableau qui dis le mot du mess
    - un tableau qui dis le bit dans ce mot
    - un tableau qui contien le message
    - et deux tableu qui sont mis a jour pour gérer les fronts sur ces message pour les afficher que une fois

    EN regardant un peu le TList jaimerais bien savoir si il est possible de faire que une seul list contenant des structure regroupant toute ces info ?
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  11. #11
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    pour la gestion de mes message et de mes alarmes jai remplacer 6 tableaux par un seul

    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
     
    class clasMessageAla
    {
      public :
            clasMessageAla()
            {
                    this->iMots = 0;
                    this->iBit = 0;
                    this->asMessage = "";
                    this->iAncienEtat = 0;
                    this->iNouvelEtat = 0;
                    this->Couleur = clBlack;
            }
            int iMots;
            int iBit;
            AnsiString asMessage;
            int iAncienEtat;
            int iNouvelEtat;
            TColor Couleur;
    };
    Dans le .h du principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //DECLARATION DES TABLEAU POUR LE STOCKAGE DES MESSAGE
    clasMessageAla *TabMessage;
     
    //DECLARATION DES TABLEAU POUR LE STOCKAGE DES ALARMES
    clasMessageAla *TabAlarme;
    Apres pour lalocation je fais comme sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TabAlarme =  new clasMessageAla [ListTmp->Count];
    TabMessage = new clasMessageAla [ListTmp->Count];
    ou ListTmp est une StringList contenant tous les message mot bit couleur etc stocker en resource jai fais des fonction qui stoke ces valeur dans le on crate


    Est ce que cette maniere de travailler est propre ?
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  12. #12
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    mais bon, je ne suis pas persuader que mon prob vien de la ... jai mis des try catch dans chacun de mes thread sa me permetra de localiser plus précisement je pense
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  13. #13
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    tu peux mettre ce que tu veux dans un TList
    Tu n'est pas obligé que chaque élément soit du même type.

    Moi j'utilise TList dans mes logiciels avec plusieurs type.

    Tu te crée une classe qui va bien et qui contient toutes les infos dont tu as besoin.

    Ensuite tu crée un pointeur sur un objet de cette classe et c'est lui que tu ajoute dans ta TList.

    Pour y accéder, il te suffit ensuite de l'extraire de la liste.

    Sinon pour tes int, moi je le fais sans intToStr et StrToInt

    Je me suis créé une classe toute simple pour stocker un int

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class TInt
    {
       public :
          int Valeur;
     
          // Constructeur
          TInt();
    };
    Ensuite lorsque tu veux ajouter des int dans une liste, je fais ceci
    Pour l'exemple je fais une suite de 1 à 10

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for(int i = 1; i <= 10; i++)
    {
       // Je crée l'élément
       TInt *Entier = new TInt();
     
       // Je renseigne la valeur de l'entier
       Entier->Valeur = i;
     
       // Je l'ajoute dans la liste
       Liste->Add(Entier);
    }
    Après pour y accéder, c'est très simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // J'extrait le 3ème élément (Index 2 car les index commence à 0)
    TInt *Entier = (TInt *)(Liste->Items[2]);
     
    ShowMessage("l'élément d'index 2 est : " + AnsiString(Entier->Valeur));
    Bien sur, il ne faut pas oublié de déclarer ta liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TList Liste = new TList();
    Donc pour ton exemple avec ta classe Message, cela irait très bien

    il te suffit de déclarer une liste comme je t'ai montrer plus haut
    Et ensuite a chaque fois que tu crée un élément de type clasMessageAla *, tu l'ajoute dans ta liste.

    Pas besoin d'allocation puisqu'elle se fait automatiquement à chaque fois que tu crée ton élément et que tu l'ajoute dans la liste

  14. #14
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    ben si je le fais avec une TList et ma class message, si je ve accéder a quelque chose je suis obliger de le sortir

    si je ve modifier quelque chose, je dois le sortir, puis modifier, supprimer l'ancien du TList puis Insert la version modifier, c pas plus lourd ?
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  15. #15
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Non tu n'as pas à supprimer quand tu modifies, vu que c'est un pointeur que tu stocks dans la liste, tu accède directement à l'élément et donc tu le modifies.

    Exemple (Je reprend ma liste d'entiers de tout à l'heure)
    On va retrancher 1 à tous les entier de la liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for(int i = 0; i < Liste->Count; i++)
    {
       // Je récupère mon élément à l'index i
       TInt *Entier = (TInt *)(Liste->Items[i]);
     
       // Je retranche 1 à sa valeur
       Entier->Valeur = (Entier->Valeur - 1);
    }
    Et voilà ma liste est modifié, et je n'ai pas enlever mon Entier de ma liste et remis l'entier modifié, cela se fait directement

  16. #16
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    ah oui, javais oublier sa, merci beaucoup

    jai réduit le nombre de tableau de pal mal

    il m'en reste plus que deux maintenant, celui ou je stoke ce ke je lit et celui ou je stoke ce que je dois ecrire, suis en train deseyer danaliser pour les remplacer par des list ausi, mais sa entrenne pas mal de modif, vue que javais fais pas mal de fonction qui travaillais avec un tableau ..
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  17. #17
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    C'est sur, j'ai fait exactement la même chose que toi au début, mais tu verras que par la suite, les listes sont quand même plus facile a manipuler.

  18. #18
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    voila jai plus aucun tableau , a par celui que le TTcpClient et resoi mais la il n'y a pas le choix.


    Donc pour les valeur que je lie jai créé une clase TCoupleInt qui contien 2 int.

    Par exemple pour les valeurs que je lit et que j'ecrie Valeur1 contien La num du MW, Valeur2 contient la valeur du MW.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class TCoupleInt
    {
      public :
            int Valeur1;
            int Valeur2;
     
            TCoupleInt()
            {
                    this->Valeur1 = 0;
                    this->Valeur2 = 0;
            }
    };
    le tous stocker dans une TList

    voila
    Derniere question pour rendre la memoire il faut juste faire delete List; ou delete chaque Items de la list séperement vue que j'ai fais un new pour chaque?
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  19. #19
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 388
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 388
    Points : 1 775
    Points
    1 775
    Par défaut
    Salut !

    Séparément puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Liste->Clear();
    delete Liste;
    A plus !

  20. #20
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    ok merci
    donc jai fais comme sa :

    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
     
                    while(iCpt < ListValeurEcriture->Count )
                    {
                            delete ListValeurEcriture->Items[iCpt];
                            iCpt++;
                    }
                    ListValeurEcriture->Clear();
                    delete ListValeurEcriture;
                    iCpt = 0;
     
                    while(iCpt < ListValeurLecture->Count )
                    {
                            delete ListValeurLecture->Items[iCpt];
                            iCpt++;
                    }
                    ListValeurLecture->Clear();
                    delete ListValeurLecture;
                    iCpt = 0;
    je fais comme sa pour chaque list

    c'est bien ou il y a plus simple ?
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

Discussions similaires

  1. Erreur Python : list index out of range
    Par mmmppp dans le forum Général Python
    Réponses: 4
    Dernier message: 15/10/2011, 21h59
  2. list index out of bounds
    Par sasaas dans le forum Débuter
    Réponses: 1
    Dernier message: 13/01/2009, 17h54
  3. [socket]Erreur List Index Out Of Bound
    Par afrodje dans le forum C++Builder
    Réponses: 1
    Dernier message: 23/06/2008, 16h43
  4. Message d'erreur : Liste index out of bounds (-1)
    Par valer dans le forum Langage
    Réponses: 7
    Dernier message: 25/04/2008, 08h50
  5. Réponses: 15
    Dernier message: 31/03/2007, 16h32

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