2011-10-14 2 views
0

Ceci est en fait le programme, mon instructeur avait fourni avec nous pour travailler, je devais faire plusieurs changements jusqu'ici pour l'obtenir au moins la compilation:erreur: variable ou champ déclarée nulle

#include <dirent.h> 
#include <errno.h> 
#include <stdio.h> 
#include <cstdlib> 
#include <iostream> 
#include <cctype> 
#include <cstdio> 
#include <string> 
#include <list> 

using namespace std; 
std::string makeString(); 
std::string path= "/"; 
DIR*dirp; 
struct dirent*direntp; 
std::list<string> child_directories; 



void dir_traverse(&path, ios::out){ 
    list<string> child_directories; 
    DIR*dirp = opendir(path.data()); 
    struct dirent*dir_entry = readdir(dirp); 
     while(dir_entry !=null){ 
      unsigned char d_type = dir_entry->d_type==DT_OIR?'D' : 'R'; 
      if(d_type == 'D'){ 
       if(dir_entry->d_name[0]!= '.') 
        { 
        child_directories push_back(dir_entry_d_name); 
       } 

      } 
      out<<'\t'<<d_type<<":"<<dir_entry->d_name<<endl; 
      dir_entry= readdir(dirp); 
     } 
     list<string>::iterator it = child_directories.begin(); 
     while(it! = child_directories.end()) 
      { 
       dir_traverse(&path + "/" + *it, out); 
       it++; 
      } 
     closedir(dirp); 
} 

Je reçois l'erreur que j'ai comme titre en référence à la fonction dir_traverse. Je suis plutôt intéressé à comprendre ce qui cause le problème et pourquoi. La moitié de ce qui se passe dans la fonction, je ne comprends pas vraiment pour le moment, ce qui explique probablement pourquoi j'ai ce problème de compilation. tout simplement pas à la vitesse sur c/C++ encore :)

merci

modifier:

void dir_traverse(string& path, ostream& out){ 
    list<string> child_directories; 
    DIR*dirp = opendir(path.data()); 
    struct dirent*dir_entry = readdir(dirp); 
     while(dir_entry !=NULL){ 
      unsigned char d_type = dir_entry->d_type==DT_DIR?'D' : 'R'; 
      if(d_type == 'D'){ 
       if(dir_entry->d_name[0]!= '.') 
        { 
        child_directories.push_back(dir_entry_d_name); 
       } 

      } 
      out<<'\t'<<d_type<<":"<<dir_entry->d_name<<endl; 
      dir_entry= readdir(dirp); 
     } 
     list<string>::iterator it = child_directories.begin(); 
     while(it != child_directories.end()) 
      { 
       dir_traverse(&path + "/" + *it, out); 
       it++; 
      } 
     closedir(dirp); 
} 
+0

Marquez la ligne dans le code où le compilateur affiche l'erreur. –

+0

À quoi ressemblait l'en-tête de la fonction 'dir_traverse()' avant que * vous l'ayez changé? Quelque chose de plus comme void dir_traverse (const std :: chaîne & chemin, std :: ostream & out) '? – Johnsyweb

+0

oui c'est proche de ce qui était: void dir_traverse (string string, ostream & out) – user975044

Répondre

2

D'accord, vous avez donc besoin de faire quelques changements à l'échantillon de votre instructeur pour le compiler.

Je vais supposer que vous avez inclus les quatre en-têtes nécessaires à la compilation. Je vous recommande de tirer seulement les quatre symboles suivants de stdnamespace, plutôt que le lot entier. Personnellement, je préfère faire référence à std::string dans mon code.

using std::string; 
using std::ostream; 
using std::list; 
using std::endl; 

Quoi qu'il en soit, seuls les trois lignes suivantes doivent être fixés:

void dir_traverse(string& path, ostream& out) 

devrait être ...

void dir_traverse(const string& path, ostream& out) 

Parce que vous passez plus tard dans un temporaire lorsque vous appelez la fonction récursivement.

  child_directories.push_back(dir_entry_d_name); 

Devrait être ...

  child_directories.push_back(dir_entry->d_name); 

Cela ressemble à une faute de frappe!

dir_traverse(&path + "/" + *it, out); 

Devrait être ...

dir_traverse(path + "/" + *it, out); 

Cela ressemble à une faute de frappe, aussi. C'est là que vous créez le pathstring que j'ai mentionné plus tôt. Cela doit être passé en tant que référence const (puisqu'il n'est pas passé en valeur). Au fur et à mesure que vous vous entrainerez, vous serez plus à l'écoute des messages d'erreur de votre compilateur!

Bonne chance!

+0

yup a vu les fautes de frappe .. pas sûr que c'était un crayon à papier typo ou une craie à la planche typo typo! Cette classe est littéralement comme être jeté hors de la fin profonde. Aucune expérience en C/C++, juste Java, donc c'était une bataille difficile. Merci beaucoup de m'avoir aidé :) – user975044

+1

Conseil et craie? Vieille école! – Johnsyweb

2
void dir_traverse(&path, ios::out) 

qui ressemble à une définition de fonction, à l'exception que les arguments sont erronés. Une fonction est déclarée comme ceci:

return_type function_name(arg0_type arg0, ..., argN_type argN) 
+0

génial, se débarrasser de cette erreur maintenant son ramasser toutes sortes de problèmes dans la fonction qu'il n'était pas avant lol – user975044

Questions connexes