[C++]Liste d'un répertoire

Bonsoir!
Bon, je fais des tests, je me mets doucement au C++. Là, je viens de regarder la FAQ de developpez.com, et j’ai écrit ceci :

[code]#include
#include
#include “nburn.h”

using namespace std;

int main(int argc, char** argv)
{
cout << “On va lister les fichiers contenus dans le répertoire” << endl;
Liste::liste();

return 0;

}

void Liste::liste()
{
DIR * repertoire = opendir(".");

if ( repertoire = NULL)
{
	cout << "Impossible de lister le répertoire" << endl;
}
else
{
	struct dirent * ent;

	while ( (ent = readdir(repertoire)) != NULL)
	{
		cout << ent->d_name << endl;
	}
	closedir(repertoire);
}

}[/code]
Sauf que à l’éxécution, erreur de segmentation. Comme il n’y a pas grand chose, je ne vois pas où je me plante.
Patapé s’il vous plaît, j’apprends tout seul, je débute :stuck_out_tongue: .

Ne compte pas sur moi pour t’expliquer où ça plante par contre je vais te donner tout les moyens pour traquer cette erreur :smiley:

D’abord il est important de savoir qu’une erreur de segmentation ça signifie qu’il y a un accès mémoire illégale. Les deux principales causes qui me viennent en tête sont :
[ul]
[li]mauvais indiçage dans un tableau. Si tu tente d’accéder à un indice trop grand (5ème élément d’un tableau de trois éléments)[/li]
[li]un déréférencement de pointeur null ou non initialisé[/li][/ul]

Pour récupérer des informations sur ton programme tu as plusieurs techniques complémentaires :
[ul]
[li]instrumentation : c’est la plus simple. La jolie phrase pour en définir l’objectif c’est « tu procède par dichotomie pour savoir à quel moment de ton flot d’exécution ton programme plante ». Autrement dis tu fait des affichage pour essayer de savoir à quel instruction exacte ton programme plante.[/li]
[li]strace : extrêmement simple à mettre en place, mais ça donne peut d’information. Tu lance ton programme avec strace. Ça te donne tout les appels système de ton programme et tu voir sur le quel et avec quels paramètres il plante.[/li]
[li]debuger : gdb pour le principal. C’est l’outil le plus sophistiqué qu’il existe pour rechercher une erreur. L’idée c’est d’exécuter ton programme pas à pas (on peut prendre des raccourcis pour aller directement à l’endroit incriminé) tout en étant capable de voir l’état de ton programme à tout moment (contenus des variables, contenus des registres,…) et de modifier cet état (tu peut changer la valeur d’une variable). Il est possible depuis quelques versions de revenir en arrière dans l’exécution d’un programme. L’apprentissage de gdb est pas une sinécure, si tu veut l’utiliser tu peut trouver de la documentation sur internet facilement et en français. Les quelques commandes importantes sont ici je crois : linux-france.org/article/devl/gdb_howto.html[/li]
[li]valgrind : un outils puissant mais que je maîtrise mal. Il permet de voir énormément de choses comme les erreurs de segmentation et les fuites mémoires.[/li][/ul]

L’instrumentation suffit dans bien des cas mais c’est bien de savoir utiliser un debuger d’une manière générale.

Merci une fois de plus pour tous ces indices! il y a tant à apprendre!

Pour mon souci, j’ai réécrit tout à partir de zero, et maintenant, cela fonctionne. Je n’ai malheureusement pas compris pourquoi, donc c’est pas tip top… :confused:

c’est pas :

qui faisait tout planter ? Là c’est pas un test, c’est une affectation :stuck_out_tongue:

[quote=“BenJi”]c’est pas :

qui faisait tout planter ? Là c’est pas un test, c’est une affectation :stuck_out_tongue:[/quote]
En effet. Une affectation est toujours vraie du moment qu’elle réussie.

Ce genre de bug a était à l’origine d’une faille de Linux il y a quelques temps. C’est depuis que j’écris toujours les constantes à gauche :

En effet si tu écris :

Le compilateur va pas apprécier.

Si, bien sûr que c’est ça, erreur tellement idiote! combient de fois faudra-t-il que je me plante pour que ça rentre?
Bon, j’aurais au moins de la doc maintenant! :slight_smile: Merci!

Autre sujet pour ceux qui passe par là, pour faire un programme de gravure, vous verriez plus de C ou C++? Parce que j’ai du mla à voir les objets queje pourrais créer. Si vous avez des idées, ça serait chouette, je ne suis pas très habitué à l’objet…

Le C++ évidement.

Tu peut avoir un objet “Element” (ou “Fichier”) par fichier à graver eux même regroupé dans un objet “Projet”. La gravure consisterait à envoyer un projet à objet “Graveur” qui fait le travail effectif.

Ça c’est pour les objets métier (ce qui touche à la gravure). Après la lecture de la configuration peut par exemple être modélisé comme un objet.

Effectivement, c’est chouette comme façon de faire! Moi je m’embrouillais dans la conception d’un objet de type “liste de fichier”, puis il aufait fallu graver cette liste…
Enfin, c’était beaucoup plus flou que ton idée en tout cas :smiley:

Lis des trucs sur les « design pattern » ils donnent des exemple de conception objet (genre « si on veut que notre application gère différent type de fichier en sorti, il faut… »).

Merci, c’est sympa! Je me retrouve vite perdu dans tout ce que tu m’apportes, mais je vais m’en sortir! :slight_smile:

salut :slight_smile:
j’ai débuter il y a euh env 1 ans et le c++ est long a apprendre et a comprendre mai l’avantage c’est que tu peux vraiment tout faire avec
perso je code pour moi (et comme un sagouin l :laughing: )
voila quelque lien
cpp.developpez.com/faq/cpp/
cplusplus.com/
cppreference.com/wiki/

enjoye