2011-10-14 2 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

좋아, 당신은 컴파일 얻을 강사의 샘플에서 몇 가지 사항을 변경해야합니다 : 함수는 다음과 같이 선언한다.

나는 네가 컴파일하는데 필요한 네 개의 헤더를 포함했다고 가정 할 것이다. 전체 Lot이 아닌 stdnamespace에서 다음 네 개의 기호 만 가져 오는 것이 좋습니다. 개인적으로 나는 내 코드에서 std::string을 참조하는 것을 선호합니다. 당신이 함수를 호출 할 때

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

는 나중에 임시 전달하기 때문에 ...

void dir_traverse(string& path, ostream& out) 

가되어야한다

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

어쨌든, 단지 다음과 같은 세 가지 라인이 고정 될 필요가 재귀 적으로.

  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