Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Exebiche
0 / 0 / 0
Регистрация: 08.05.2013
Сообщений: 23
#1

Ошибка в вызове функции - C++

14.07.2013, 12:26. Просмотров 373. Ответов 5
Метки нет (Все метки)

Здравствуйте, помогите исправить ошибку в вызове функции. Привожу часть кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
int main(int argc, char *argv[])
{
    ShowCopyright(); // функция вывода прав копирайта
 
    if(argc == 1)       // если не введена команда то выводим помощь
    {
        cout << "Введена неизвестная команда, прочти помощь или введи команду help" << endl;
        ShowHelp(); /// функция вывода помощи
 
        return 0;
    }
 
string sArg(argv[1]);
 
    if(!sArg.compare("help")) /// если введена команда help то выводим помощь
    {
        ShowHelp(); /// функция вывода помощи
 
        return 0;
    }
 
    if(!sArg.compare("dir")) ///при вводе команды dir сканируем ключи  отображения
     {
        for (int i = 2; i < argc; i++) /// считываем  для команды dir ключи
        {
            string sArg(argv[i]);
 
 
            if(!sArg.compare("/all")) // если введен ключ /all отображаем всю информацию об каталоге такую как права доступа, количество ссылок на файл, имя владельца, имя группы, размер, время последнего редактирования
            {
                all = true;
                blSeeName = true;  /// не отображать им файлов так как оно отобразится в ключе /all
            }
 
 
            if(!sArg.compare("/p")) /// если введен ключ /p то отображаем права доступа
            {
                p = true;
            }
 
            if(!sArg.compare("/s")) /// если введен ключ /s то отображаем количество ссылок на файл
            {
                s = true;
            }
 
            if(!sArg.compare("/v")) /// если введен ключ /v то отображаем имя владельца
            {
                v = true;
            }
 
            if(!sArg.compare("/g")) /// если введен ключ /g то отображаем имя группы
            {
                g = true;
            }
            if(!sArg.compare("/r")) /// если введен ключ /r то отображаем размер ф
            {
                r = true;
            }
            if(!sArg.compare("/t")) ///если введен ключ /t то отображаем время последнего редактирования
            {
                t = true;
            }
        }
     }
 
 
    if (argc != 1) // если заданы параметры для командной строки то считываем все файлы в каталоге
    {
        while (--argc)
        {
            cout << *++argv << endl;
            do_ls(*argv, string() ); //выполнение функции на проверку существования файлов
        }
    }
 
    return 0;
}
//-----------------------------------------------------------------------------------------------
/**
 * Функция отображения информации о директории. Возвращает количество файлов
 *
 * Функция открываеткаталог для чтение всех файлов в каталоге
 * и подсчета количества файлов в каталоге.
 * \param [in] ...
 * \return ...
 */
int do_ls(string &dirname,  string &filename) /// функция отображения информации о директории. Возвращает количество файлов
{
    DIR *dir_ptr;
    dirent *direntp;
    int colCount = 0; /// cчетчик количества
 
    if((dir_ptr = opendir(dirname.c_str())) != NULL)   /// открываем директорию
    {
 
        while((direntp=readdir(dir_ptr)) != NULL)   /// Циклически считываем содержимое директории
        {
                    if (filename.empty())
                    {
                       dostat(direntp->d_name, dirname.c_str()); ///функция слияние пути
                       colCount++; /// увеличиваем счетчик количества
                       kolkatalog=1; /// устанавливаем флаг для вывода количества файлов в каталоге  1 раз 55
                    }
 
 
        }
        /// закрываем директорию.
        closedir(dir_ptr);
    }
 
    if(kolkatalog == 1)
    {
        cout << "\nКоличество файлов в каталоге = " << colCount << endl;
        kolkatalog = 0; /// устанавливаем флаг для запрета вывода количества файлов в каталоге
    }
 
    return colCount;
}
//-----------------------------------------------------------------------------------------------
/**
функция слияния пути к сканируемому файлу и запуск функции вывода информации об файле
*/
void dostat(string &dirname,  string &filename)     /// функция получения информации о файле (принимает имя файла и директорию)
{
    struct stat info; /// переменная, содержащяя информацию о файле.
    char* way_to_file=new char [strlen(filename.c_str())+strlen(dirname.c_str())+2];
    /// way_to_file - путь к файлу (директория + имя файла).
 
    strcpy(way_to_file,dirname.c_str());    /// слияние имени файла и директории в один путь
    strcpy(way_to_file+strlen(dirname.c_str()),"/\0");    /// слияние имени файла и директории в один путь
    strcpy(way_to_file+strlen(way_to_file),filename.c_str());    /// слияние имени файла и директории в один путь
 
    if(stat(way_to_file,&info)==-1)     /// получаем информацию о файле. Если ошибка
    {
        /// выводим сообщение
        cout<<"Ошибка слияния пути"<<way_to_file;
    }
    else
    {
        show_file_info(filename,&info);  ///вызываем функцию вывода информации об файле.
    }
    delete way_to_file;
}
А вот ошибка
||=== data_file, Debug ===|
obj/Debug/main.o||In function `main':|
/data_file/main.cpp|115|undefined reference to `do_ls(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'|
obj/Debug/main.o||In function `do_ls(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)':|
/data_file/main.cpp|143|undefined reference to `dostat(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'|
||=== Build finished: 2 errors, 0 warnings ===|
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2013, 12:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в вызове функции (C++):

Ошибка в вызове функции - C++
Добрый день, написал маленькую программку, которая записывает в файл данные работников. Вызываю 3 функции, две из них записывают в файл...

Ошибка в вызове функции - C++
вопрос, в чем ошибка? объявлял так int pArray и int q

Ошибка в вызове функции - C++
В программе выполняю транспонирование матрицы,через функцию,но возникли проблеммы с передачей аргументов. Описание функции...

Ошибка в вызове функции - C++
Учителя толком не могут обьяснить в чем ошибка, объясните pls =( #include &lt;iostream.h&gt; void vvod(int r,int,int); int...

Ошибка при вызове функции - C++
Добрый день! Есть функция по расчету детерминанта int _det(int size,double **arr,double &amp;det) { int i,j,k; det=1; double b; ...

Ошибка при вызове функции - C++
Ошибка в строке 90, при пошаговом выполнении она появляется при вызове функции, до захода в нее, хотя список сформирован правильно, т.к. до...

5
Kuzia domovenok
1957 / 1810 / 142
Регистрация: 25.03.2012
Сообщений: 6,278
Записей в блоге: 1
14.07.2013, 12:37 #2
Вообще-то функции надо прописывать ДО того, как их начнёшь вызывать.
C++
1
2
3
4
5
6
7
8
9
10
void dostat(string &dirname,  string &filename)     {
...
}
int do_ls(string &dirname,  string &filename) {
...
}
int main(int argc, char *argv[]){
...
...
}
Добавлено через 4 минуты
Либо следует объявлять прототипы функций в начале. Тогда можно сами функции могут идти в любом порядке.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int do_ls(string &,  string &) ;
void dostat(string &,  string &) ;
int main(int argc, char *argv[]){
...
...
}
int do_ls(string &dirname,  string &filename) {
...
}
void dostat(string &dirname,  string &filename)     {
...
}
0
Exebiche
0 / 0 / 0
Регистрация: 08.05.2013
Сообщений: 23
15.07.2013, 11:23  [ТС] #3
ни один из вариантов не помог
0
zer0mail
2374 / 2004 / 199
Регистрация: 03.07.2012
Сообщений: 7,198
Записей в блоге: 1
15.07.2013, 11:42 #4
Цитата Сообщение от Exebiche Посмотреть сообщение
ни один из вариантов не помог
Очень "глубокое" замечание, позволяющее взглянуть и сразу понять, в каком месте неверно.
1
Tulosba
15.07.2013, 12:23
  #5

Не по теме:

Цитата Сообщение от zer0mail Посмотреть сообщение
Очень "глубокое" замечание, позволяющее взглянуть и сразу понять, в каком месте неверно.
Просто ТС не особо хочет прислушиваться к советам судя по предыдущим его темам. И городит огороды, не пытаясь вникнуть в проблему как следует.

0
Exebiche
0 / 0 / 0
Регистрация: 08.05.2013
Сообщений: 23
15.07.2013, 13:01  [ТС] #6
я перенес main в самый конец, и пишет туже ошибку
||=== data_file, Debug ===|
obj/Debug/main.o||In function `do_ls(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)':|
)/data_file/main.cpp|64|undefined reference to `dostat(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'|
obj/Debug/main.o||In function `main':|
)/data_file/main.cpp|286|undefined reference to `do_ls(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'|
||=== Build finished: 2 errors, 0 warnings ===|

Я уверен на 80 % что не правильно вызываю функции
C++
1
dostat(direntp->d_name, dirname.c_str()); ///функция слияние пути
и
C++
1
do_ls(*argv, string() ); //выполнение функции на проверку существования файлов
так как сначала они были описаны так
C++
1
int do_ls(char *dirname, char *fileName)
C++
1
void dostat(char *filename, char *dirname)
а теперь так
C++
1
2
void dostat(string &dirname,  string &filename)   
int do_ls(string &dirname,  string &filename)
0
15.07.2013, 13:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 13:01
Привет! Вот еще темы с ответами:

Ошибка при вызове функции - C++
В функции NewWords вызывается функция correct,при отладке я не могу войти в эту функцию,к тому же потом не выводится элементы объекта...

GCC ошибка при вызове функции - C++
Здравствуйте. Проблема в следующем: при вызове функции sub из тела add выдается ошибка. http://puu.sh/3bFZj.png Путем экспериментов...

Ошибка компиляции при вызове виртуальной функции - C++
Здравствуйте. Сильно не плюйтесь, в С я не силен. Пишу на джаве, но попал в руки код, в котором нужно разобраться. Не пойму в чем...

Ошибка слишком мало аргументов в вызове функции - C++
Здравствуйте помогите разобраться, компилятор выдает что в строке 140 407 и 418 слишком мало аргументов в вызове функции ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru