2011-10-14 72 views
0

這實際上是我的教練已經提供與我們的程序一起工作,我不得不做出一些改變迄今得到它至少編譯:錯誤:變量或字段宣佈無效

#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); 
} 

我得到作爲參考dir_traverse函數的標題,我有錯誤。我非常想知道是什麼導致了問題,爲什麼。我目前沒有真正理解的函數的一半,這可能是我遇到這個編譯問題的原因。只是沒有達到C/C++還沒有:)

感謝

速度上

編輯:

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

在編譯器顯示錯誤的代碼中標記該行。 –

+0

在改變它之前,dir_traverse()函數的標題看起來像什麼?更像'void dir_traverse(const std :: string&path,std :: ostream&out)'? – Johnsyweb

+0

是的,它接近於:void dir_traverse(string path,ostream&out) – user975044

回答

2

好的,所以你需要對你的教師樣本進行一些修改才能編譯它。

我打算假設你已經包含了編譯所需的四個頭文件。我建議你只需從stdnamespace中提取以下四個符號,而不是全部。我個人更喜歡在我的代碼中參考std::string

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

總之,只有以下三行需要修復:

void dir_traverse(string& path, ostream& out) 

應該是...

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

因爲你以後傳遞一個臨時當你調用該函數遞歸。

  child_directories.push_back(dir_entry_d_name); 

應該是...

  child_directories.push_back(dir_entry->d_name); 

這看起來像一個錯字!

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

應該是...

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

這看起來像一個錯字,太。這是您創建前面提到的臨時pathstring的地方。這必須作爲const引用傳遞(因爲它沒有按值傳遞)。

隨着您的練習越來越多,您將更加關注編譯器的錯誤消息!

祝你好運!

+0

燁看到了錯別字..不知道這是一個鉛筆紙錯字或粉筆粉筆板錯字!這個班級實際上就像被拋棄在深處。沒有任何c/C++的經驗,只是Java,所以它是一場艱苦的戰鬥。非常感謝你幫助我:) – user975044

+1

董事會和粉筆?老套! – Johnsyweb

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

這看起來像一個函數的定義,除了論證是錯誤的。一個函數是這樣聲明的:

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

真棒,擺脫了那個錯誤,現在它拿起所有類型的問題,它不是之前大聲笑 – user975044