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

SL & STL C++ Discussion :

Problème avec les listes et les itérateurs en Visual Studio 2008


Sujet :

SL & STL C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Problème avec les listes et les itérateurs en Visual Studio 2008
    Bonjour tout le monde,
    je travaille sur la migration d'un projet de la version 6 de visual studio à la version 2008. à la compilation je n'ai aucune erreur par contre au déboggage ça part en vrille dès le début

    Bref le problème c'est avec les listes et les itérateurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    list<char*, allocator <char*> > *maList = createStringListInstance();
    GetLocalList(maList);
    avec createStringListInstance est une fonction que j'ai implémenté pour créer une nouvelle instance de la liste en question et GetLocalList pour lui assigner un certain nombre de valeurs. Jusque là tout marche à merveille. passons au problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    list<char*, allocator <char*> >::iterator maListIterator;
    maListIterator = maList->begin(); //ici ça bloque
    en atteignant cette dernière ligne, j'ai une alerte qui se déclenche :

    Exception non gérée à 0x00418620 dans Sample.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xdddddddd.
    si quelqu'un a une idée, je lui serait reconnaissant

  2. #2
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Ton code ne semble pas comporter d'erreurs.
    La seule cause pourrait alors être le contenu de la fonction createStringListInstance();.

    De plus,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::list<char*> *maList;
    suffit.
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    l'erreur te dit que dans
    maLit est un pointeur non initialisé.

  4. #4
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    maLit est un pointeur non initialisé.
    Donc le problème est bien dans la fonction d'initialisation de ta liste (vu qu'il n'est pas ailleurs...).
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Ignescence Voir le message
    Exception non gérée à 0x00418620 dans Sample.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xdddddddd.
    0xdddddddd ça sent la valeur non initialisé (ou avec l'init par défaut du debugger visual) de ta variable maList. D'où l'erreur quand tu essaie d'accéder à un membre.

  6. #6
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    j'ai essayé avec un new list<char*, allocator <char*>> mais le problème persiste :/

    il faut que j précise un truc c'est que la fonction : GetLocalList(maList) est une fonction qui réside dans une DLL que j'ai développé en Visual Studio 6 !

    en effet lors du déboggage, maList a été initialisée et elle reçoit une adresse mémoire, donc le problème ne peut être un problème d'initialisation de la liste! la violation d'accès en lecture se déclenche lors de l'affectation de valeur au pointeur de cette liste.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    (ou avec l'init par défaut du debugger visual) de ta variable maList.
    C'est ca..
    Aprés tu peut trouver des valeur ressemblant à 0xfefefefefe dans de la mémoire désalloué pointé par un pointeur.
    Y en as d'autre mais je ne me rappel plus...

  8. #8
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Il faut que tu nous montres le contenu de ces deux fonctions. On n'est pas devins pour te dire c'est quoi le problème. Ce qui es sûr, c'est que le problème réside dans l'une de ces deux fonctions.
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  9. #9
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Spout Voir le message
    Il faut que tu nous montres le contenu de ces deux fonctions. On n'est pas devins pour te dire c'est quoi le problème. Ce qui es sûr, c'est que le problème réside dans l'une de ces deux fonctions.
    voilà pour la première fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    list<char*, allocator<char*> > *__stdcall createStringListInstance()
    {
    	list<char*, allocator<char*> > *stringlist =new list<char*, allocator<char*> >;
    	return stringlist;
    }
    pour la deuxième c'est un peu trop compliqué car c'est une fonction qui va faire un browsing du système à la recharche de Serveurs OPC :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void __stdcall GetLocalrList(list<char*, allocator <char*> > *maList)
    {
         BrowsingLocalRegistry(maList);
    }
    vous voyez c'est pas si simple que ça, car dans le dernier appel il y'a d'autres traitements et appel, c'est toute une SDK qui a testé et approuvée par OPC Foundation! mais la question est si une DLL a été développée en utilisant VS6 il y a t il le risque qu'en l'utilisant dans projet réalisé en VS 2008 qu'elle bugue?

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    ces bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    list<char*, allocator <char*> > *maList = createStringListInstance();
    GetLocalList(maList);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    list<char*, allocator <char*> >::iterator maListIterator;
    maListIterator = maList->begin(); //ici ça bloque
    sont bien dans la même fonction?

  11. #11
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    ces bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    list<char*, allocator <char*> > *maList = createStringListInstance();
    GetLocalList(maList);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    list<char*, allocator <char*> >::iterator maListIterator;
    maListIterator = maList->begin(); //ici ça bloque
    sont bien dans la même fonction?
    oui bien entendu!

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Ignescence Voir le message
    oui bien entendu!
    Tu peut mettre le code de cette fonction?
    même si on va pas y comprendre grand chose, y as peut être un truc que t'as pas vue.

  13. #13
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    voilà grosso modo le code de la fonction comme vous pourrez le constater c'est une application MFC
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    BOOL CSampleRedundancyClientDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
            HRESULT notif = InitDll();
     
    	HTREEITEM hLocalMachineParentP = m_Primary_Server.InsertItem("Local Machine",TVI_ROOT);
     
    	HTREEITEM hLocalMachineParentS = m_Slave_Server.InsertItem("Local Machine",TVI_ROOT);	
     
    	list<char*, allocator <char*> > *maList = createStringListInstance();
    	GetLocalList(maList);
    	int NbServer;
    	list<char*, allocator <char*> >::iterator maListIterator;
    	maListIterator = maList->begin();
    	NbServer = maList->size();
    	for(int j=0; j<NbServer ; j++)
    	{
    		HTREEITEM hNewLocalServerP = m_Slave_Server.InsertItem(*daServerListIterator,hLocalMachineParentP,TVI_LAST);
    	}
     
    	// IDM_ABOUTBOX must be in the system command range.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
     
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		CString strAboutMenu;
    		strAboutMenu.LoadString(IDS_ABOUTBOX);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
     
    	// Set the icon for this dialog.  The framework does this automatically
    	//  when the application's main window is not a dialog
    	SetIcon(m_hIcon, TRUE);			// Set big icon
    	SetIcon(m_hIcon, FALSE);		// Set small icon
     
    	// TODO: Add extra initialization here
     
    	return TRUE;  // return TRUE  unless you set the focus to a control
    }

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Avec les éléments que tu as fourni, je vois pas trop pourquoi il y aurait un pb. On est d'accord que c'est ça et pas plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    list<char*, allocator<char*> > *__stdcall createStringListInstance()
    {
    	list<char*, allocator<char*> > *stringlist =new list<char*, allocator<char*> >;
    	return stringlist;
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __stdcall GetLocalrList(list<char*, allocator <char*> > *maList)
    {
         BrowsingLocalRegistry(maList);
    }
    Manquerait éventuellement le code de BrowsingLocalRegistry.

    Autre hypothèse: débordement mémoire.

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Autre hypothèse: débordement mémoire.
    Je voie pas non plus... Normalement 0xdddddd c'est un pointeur non initialisé en debug sous visual.

    Tu devrais mettre un break point au niveau de la création de maList pour voir la valeur du pointeur..
    La à part une erreur mémoire, je ne voie pas non plus. BrowsingLocalRegistry pourrais faire un delete sur maList??

    Un conseil, ajouter des testes sur le retour de fonction. Comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HRESULT notif = InitDll();
    Si la Dll n'est pas chargé, t'as des chance d'avoir des problème par la suite

  16. #16
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    j'ai trouvé en quoi résidait le problème, c'est que la gestion des listes entre le VS 6 et VS 9 ne se fait pas de la même façon et vu que ma DLL est en VS6 lors des appels de fonctions utilisants des listes comme paramètre, le problème ressurgit

    j'ai découvert ceci en changeant l'appel de createStringListInstance() par un new list<.....

    et j'ai découvert par un appel de size() la différence c'est qu'en appelant une fonction de ma dll qui devait retourner la même chose qu'une instanciation directe le size donnait une valeur du genre -5211242585 alors qu'en utilisant directement new lis..... le size retournait 0

    donc je suis obligé de revoir mon SDK pour qu'il n'y ait plus de fonctions prenant des listes en paramètres

    Merci tout de même pour votre assisatance

  17. #17
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Je voie pas non plus... Normalement 0xdddddd c'est un pointeur non initialisé en debug sous visual.
    Tout à fait d'accord, mais quand les hypothèses probables ne marchent plus, il faut essayer les autres

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/09/2011, 21h26
  2. Réponses: 1
    Dernier message: 19/02/2008, 23h05
  3. Réponses: 2
    Dernier message: 24/01/2008, 17h34
  4. problème avec strtok pour récupérer les vides
    Par manikou dans le forum MFC
    Réponses: 4
    Dernier message: 02/06/2005, 20h08

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