2013-05-01 14 views
2

Je n'arrive pas à créer une simple sélection de fichier dans ncurses. Le code suivant échoue, valgring dire "saut conditionnel ou mouvement dépend de la valeur uninitialised (s) de main.cpp: 122"ncurses new_menu segmentation fault

// Create items 
    m_MenuItems = new ITEM * [ m_Files.size() + 1 ]; 

    int i = 0; 
    for (vector <CFile>::iterator it = m_Files.begin(); it != m_Files.end(); ++it, ++i) { 
    /* m_MenuItems[i] = new_item((*it).pName->c_str(), (*it).pDesc->c_str()); */ 
    m_MenuItems[i] = new_item("file", "size"); 
    cout << "[" << i << "]: " << (*it).pName->c_str() << ", " << (*it).pDesc->c_str() << endl; 
    } m_MenuItems[++i] = NULL; // Item list has to be null terminated. 

    // Create menu 
    m_Menu = new_menu((ITEM **)m_MenuItems); // ! line 122 
    cout << "Success" << endl; 

La sortie est exactement ceci:

[0]: main.cpp, 6888 
        [1]: a.out, 106798 
            [2]: .., 4096 
                [3]: listdir.cpp, 701 
                     [4]: menu.cpp, 1908 
                          [5]: ., 4096 
                             Segmentation fault (core dumped) 

Que pourrait probablement causer la variable non initié?

+0

Que retourne 'new_item'? – stardust

+0

ITEM * new_item (const char * nom, const char * description); plus il renvoie NULL en cas d'erreur. – Josef

+0

Quelle ligne dans le code ci-dessus est la ligne 122? –

Répondre

1

m_MenuItems[++i] = NULL à la fin de votre boucle for provoquera une «mauvaise» entrée supplémentaire à ajouter à votre liste. Vous n'avez pas besoin de ++ car i pointera déjà 1 après votre dernière entrée à la sortie de la boucle.

De même, si new_item(...) peut renvoyer NULL, vous devriez probablement vérifier cela et break après l'affectation dans votre liste car tous les éléments qui la suivent seront ignorés si je comprends bien le code.

+0

Fonctionne parfaitement maintenant. Je vous remercie! – Josef