Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Поиск файлов  (Прочитано 11027 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« : 24-12-2009 06:27 » 

Есть некий класс:
Код:
class A
{
public:
void foo() { printf("dfsa"); }
};
Ниже пишу:
Код:
A a();
a.foo();
но выдает
Цитата
D:\Eugene\Temp\w32ca\w32ca.cpp(176) : error C2228: left of '.foo' must have class/struct/union type
.
Почему? Разве А не класс?

P.S. Использую:
Код:
#include <stdafx.h>
#include <iostream>
#include <afx.h>
#include <fstream.h>
#include <windows.h>
#include <string.h>
У меня Microsoft Visual Studio 6.0
« Последнее редактирование: 26-12-2009 06:23 от Inkognito » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 24-12-2009 06:38 » 

Классические грабли Улыбаюсь Компилятор принимает код
Код:
A a();

за объявление функции. Надо
Код:
A a;
« Последнее редактирование: 24-12-2009 06:40 от Вад » Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #2 : 24-12-2009 07:04 » 

Вот вообще тот класс (тела методов убрал, они тут без нужды), из-за которого весь сырбор:
Код:
class Lister2
{
public:
Lister2():target(0), end(true), file(1) {}

~Lister2() { delete target; }

int getFile() const { return file; }

void set(string & target_path)
{
}

BOOL next(string & where, int proc, string & get)
{
return end;
}
protected:
Lister2(const Lister2 & original) {}
private:
CFileFind cff;
string * target;
BOOL end;
int file;
};
() убрал. Ошибки left of ... must have class/struct/union type больше нету, спасибо. Но не все так хорошо, как хотелось бы. Получил следующее:
Цитата
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCD.lib(new.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCD.lib(dbgdel.obj)
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
Debug/w32ca.exe : fatal error LNK1120: 2 unresolved externals
Всё это выводит при попытке создать экземпляр класса
Код:
Lister2 list;
Что теперь не так?


_______________________________________
А, всё, нашел: вся проблема с CFileFind cff;. Поменял на указатель.
« Последнее редактирование: 24-12-2009 07:12 от Inkognito » Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #3 : 24-12-2009 07:16 » 

Всё-равно какая-то ерунда: при попитке
Код:
cff = new CFileFind;
выдает нагора
     при первом компилировании:
Цитата
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCD.lib(new.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCD.lib(dbgdel.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int,int,char const *,int)" (??2@YAPAXIHPBDH@Z) already defined in LIBCD.lib(dbgnew.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCD.lib(new.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCD.lib(dbgdel.obj)
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
Debug/w32ca.exe : fatal error LNK1120: 2 unresolved externals
    при следующих компиляциях:
Цитата
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCD.lib(new.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCD.lib(dbgdel.obj)
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
Debug/w32ca.exe : fatal error LNK1120: 2 unresolved externals
Что опять не слава Богу?

P.S. На
Код:
int * a = new int;
подобного не выдает, хотя по сути это одно и то же, только типы разные... (Это что же получается: нельзя динамически создавать CFileFind?  Улыбаюсь )
« Последнее редактирование: 24-12-2009 07:19 от Inkognito » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 24-12-2009 07:23 » 

_beginthreadex используешь? Библиотеки какие-нибудь дополнительно к проекту линкуешь? Похоже на конфликт 2х версий стандартной библиотеки (отладочной и релизной или многопоточной и однопоточной).
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #5 : 24-12-2009 07:27 » new

Использую только
Цитата
#include <stdafx.h>
#include <iostream>
#include <afx.h>
#include <fstream.h>
#include <windows.h>
#include <string.h>
Никаких lid или dll или еще чего к проекту не подключал.

_beginthreadex в моем коде нету.

Мог бы выложить код, но там 325 строк С ума сойти... ...
« Последнее редактирование: 24-12-2009 07:29 от Inkognito » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 24-12-2009 07:33 » 

А что такое класс CFileFind? MFC? Возможно, где-то из MFC просочилась многопоточность.
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #7 : 24-12-2009 07:37 » 

MFC
http://msdn.microsoft.com/en-us/library/f33e1618(VS.80).aspx
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #8 : 24-12-2009 15:58 » 

Inkognito, если твою программу укоротить до такого (т.е. убрать ВСЕ):

class A
{};

int main()
{
    A a;
    return 0;
}

что скажет компилер и линкер?
Записан

С уважением Lapulya
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #9 : 25-12-2009 12:42 » 

Цитата
--------------------Configuration: w32ca - Win32 Debug--------------------
Compiling...
w32ca.cpp
Linking...

w32ca.exe - 0 error(s), 0 warning(s)
Впрочем, как и любой другой Microsoft Visual Studio 6.0  Да-да
« Последнее редактирование: 25-12-2009 12:44 от Inkognito » Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #10 : 25-12-2009 14:07 » 

Inkognito, а все свои инклуды вставил? Кстати я надеюсь, что ты не создал новый проект с предложенным мной исходником, а использовал свой "проблемный".

Что за библиотека LIBCD, кто добавил, зачем добавил, кто писал, что внутри?
« Последнее редактирование: 25-12-2009 14:10 от lapulya » Записан

С уважением Lapulya
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 25-12-2009 14:08 » 

Раз внешних библиотек самостоятельно не добавлялось - думаю, проблема в где-то в линковке с MFC.
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #12 : 25-12-2009 19:49 » 

Inkognito, а все свои инклуды вставил?
Да, все.

Кстати я надеюсь, что ты не создал новый проект с предложенным мной исходником
Конечно же нет. А зачем? Что такого ты делаешь в коде? A a; написал верно, CFileFind динамически не создаешь. Смысл компилить твой код...

Что за библиотека LIBCD, кто добавил, зачем добавил, кто писал, что внутри?
lapulya, откуда мне знать, кто добавил LIBCD в afxmem.obj? Улыбаюсь
Использую только
Цитата
#include <stdafx.h>
#include <iostream>
#include <afx.h>
#include <fstream.h>
#include <windows.h>
#include <string.h>
Никаких lid или dll или еще чего к проекту не подключал.
« Последнее редактирование: 25-12-2009 19:51 от Inkognito » Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #13 : 25-12-2009 20:41 » 

Inkognito,
Смысл компилить - понять на что орет линкер. Именно поэтому надо использовать существующий проект, а не создавать новый. В твоем текущем проекте (тот что не линкуется) залинкована библиотека LIBCD (хотя ты говоришь, что ничего не линковал, но у линкера на этот счет другое мнение), вот я и спрашиваю что это за хрень?

Если ты создал новый проект, то там естественно никакой LIBCD нет, поэтому то и проблемы нет, поэтому и компилить мой пример в новом проекте смысла нет.

Цитата
откуда мне знать, кто добавил LIBCD в afxmem.obj?
эту фразу я вообще не понял.

Кстати, можно грохнуть LIBCD из проекта и посмотреть, на что будет орать анресолвед экстернал симбол.
Записан

С уважением Lapulya
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 25-12-2009 22:04 » 

Куда грохнуть libcd? это же отладочная LIBC. Она по дефолту включается, с ней не должно быть проблем с самой по себе.
А afx*.obj - это MFC-шные, насколько я понимаю. Вот где-то здесь и проблема: будто в MFC одна версия библиотеки LIBC слинкована, а в проекте - другая.

Inkognito, как ты подключал MFC - мастером создавал MFC-проект? Были ещё какие-то манипуляции с проектом и mfc?
« Последнее редактирование: 25-12-2009 22:06 от Вад » Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #15 : 26-12-2009 00:17 » 

Это у меня вообще Win32 Console Application. Не стояло сюда MFC пихать? Улыбаюсь

CFileFind убрал з кода полностью. Заменил его с помощью WIN32_FIND_DATA, FindFirstFile, FindLastFile. Вот функция, котороя ищет файл:
Код:
// Знайти наступний файл
bool next(string path, string & get, int process = 0)
{
if(neoc)
{
nowfilenumber = 0;
isFound = true;

WIN32_FIND_DATA w32FileData;
HANDLE hSearch;
BOOL isFirst = TRUE;

// Шукаємо файл з потрібним номером
while(true)
{
if(isFirst)
{
// Намагаємося знайти перший файл
hSearch = FindFirstFile(target.c_str(), &w32FileData);
if(hSearch == INVALID_HANDLE_VALUE)
isFound = false;
isFirst = FALSE;
}
else
{
// Шукаємо наступний файл
isFound = (bool)FindNextFile(hSearch, &w32FileData);
}

if(!isFound) // Якщо не знайшли, то в цій папці шукати більше
            // нічого
break;

isFound = false; // Файл знайшли, але він нам не підходить по
                // номеру (або підходить: перевірка зразу нижче)

// Перевіряємо, чи це не папка
if(w32FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// Переходимо всередину папки
string path_temp = path;
path_temp += "\\*.*";
// Власне, перехід
next(path_temp, get, process + 1);
// Чи знайдений файл після рекурсії?
if(isFound)
return true;
}
else
{
++nowfilenumber; // Знайшли новий файл
if(nowfilenumber > lastfilenumber) // Якщо це той файл,
                                  // який ми шукали
{
// Ініціалізуємо номер останнього відкритого файла
lastfilenumber = nowfilenumber;
// Ініціалізуємо шлях до файла
get = path;
get += w32FileData.cFileName;
// Файл знайдено!
isFound = true;

cout << get.c_str() << endl; // Добавил для отладки; в конечном варианте этого не будет

return true;
}
}
}

// Якщо навіть початковий процес не знайшов файл, то шукати
// тут більше нічого: або всі файли вже опрацьовані, або
// ціль задано невірно
if((!isFound) && (process == 0))
neoc = false;
}

return neoc;
}

Но вот проблема: код
Код:
if(w32FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// Переходимо всередину папки
string path_temp = path;
path_temp += "\\*.*";
// Власне, перехід
next(path_temp, get, process + 1);
// Чи знайдений файл після рекурсії?
if(isFound)
return true;
}
не работает, как должен. То есть он не заходит внутрь подпапки, а просто добавляет символ "\" в конец путя... Пока не сможет найти какое_то_имя_папки\\.

Подскажите пожалуйста, как мне зайти внутрь подпапки для поиска там файлов (и подпапок)?
« Последнее редактирование: 26-12-2009 06:00 от Inkognito » Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #16 : 26-12-2009 05:59 » 

Разобрался сам Да-да . Код исправил.
Работающая функция поиска файлов/папок:
Код:
bool next(string path, string & get, int process = 0)
{
if(neoc)
{
nowfilenumber = 0;
isFound = true;

WIN32_FIND_DATA w32FileData;
HANDLE hSearch;
BOOL isFirst = TRUE;

// Шукаємо файл з потрібним номером
while(true)
{
if(isFirst)
{
string path2 = path;
if(process != 0)
path2 += "*.*";
// Намагаємося знайти перший файл
hSearch = FindFirstFile(path2.c_str(), &w32FileData);
if(hSearch == INVALID_HANDLE_VALUE)
isFound = false;
isFirst = FALSE;
}
else
{
// Шукаємо наступний файл
isFound = (bool)FindNextFile(hSearch, &w32FileData);
}

if(!isFound) // Якщо не знайшли, то в цій папці шукати більше
            // нічого
break;

isFound = false; // Файл знайшли, але він нам не підходить по
                // номеру (або підходить: перевірка зразу нижче)

// Перевіряємо, чи це не папка
if(w32FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// Пропускаємо "." і ".."
if((strcmp(w32FileData.cFileName, ".") == 0) ||
  (strcmp(w32FileData.cFileName, "..") == 0))
  continue;
// Переходимо всередину папки
string path_temp = path;
path_temp += "\\";
// Власне, перехід
next(path_temp, get, process + 1);
// Чи знайдений файл після рекурсії?
if(isFound)
return true;
}
else
{
++nowfilenumber; // Знайшли новий файл
if(nowfilenumber > lastfilenumber) // Якщо це той файл,
                                  // який ми шукали
{
// Ініціалізуємо номер останнього відкритого файла
lastfilenumber = nowfilenumber;
// Ініціалізуємо шлях до файла
get = path;
get += w32FileData.cFileName;
// Файл знайдено!
isFound = true;

return true;
}
}
}

// Якщо навіть початковий процес не знайшов файл, то шукати
// тут більше нічого: або всі файли вже опрацьовані, або
// ціль задано невірно
if((!isFound) && (process == 0))
neoc = false;
}

return neoc;
}

Вад, за
Классические грабли
спасибо.
« Последнее редактирование: 26-12-2009 06:23 от Inkognito » Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #17 : 26-12-2009 12:00 » 

Сорри, я не знал, что LIBCD отладочная библиотека. Но суть дела не меняется, надо было разобраться на что орал линкер, т.е. понять какие либы конфликтуют и кто и как добавил их в проект.
Записан

С уважением Lapulya
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 26-12-2009 21:32 » 

lapulya[/b], ну, из слов топикстартера
Это у меня вообще Win32 Console Application. Не стояло сюда MFC пихать? Улыбаюсь
я могу заключить, что надо смотреть, как именно был прилеплен к проекту MFC. Возможно, каким-то нетрадиционным способом Улыбаюсь
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #19 : 27-12-2009 22:51 » 

Вад, Угу, то он это после моего поста написал, а так со всем согласная я Улыбаюсь
Записан

С уважением Lapulya
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines