ошибка: переменная или поле объявлены пустыми - PullRequest
0 голосов
/ 14 октября 2011

На самом деле это программа, которую мой инструктор предоставил нам для работы, мне пришлось сделать несколько изменений, чтобы она хотя бы компилировалась:

 #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. Мне очень интересно выяснить, что является причиной проблемы и почему. Половину того, что происходит в функции, я на самом деле не понимаю в данный момент, поэтому, вероятно, у меня возникла проблема с компиляцией. просто еще не до скорости на с / с ++:)

спасибо

редактирование:

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

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

Хорошо, вам нужно внести несколько изменений в образец вашего инструктора, чтобы он скомпилировался.

Я предполагаю, что вы включили четыре заголовка, необходимые для компиляции. Я рекомендую вам использовать только следующие четыре символа из std namespace, а не весь лот. Лично я предпочитаю ссылаться на 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);

Это тоже похоже на опечатку. Здесь вы создаете временную path string, о которой я упоминал ранее. Это должно быть передано как ссылка const (поскольку она не передается по значению).

Чем больше вы будете практиковаться, тем больше вы будете настроены на сообщения об ошибках вашего компилятора!

Удачи!

2 голосов
/ 14 октября 2011
void dir_traverse(&path, ios::out)

Это похоже на определение функции, за исключением того, что аргументы неверны.Функция объявлена ​​так:

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