| 
			| 
					
						| Dr.Yevhenius | 
								|  | «  : 24-12-2009 06:27 »  |  | 
 
 Есть некий класс: class A{
 public:
 void foo() { printf("dfsa"); }
 };
 
Ниже пишу: но выдает  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 » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #1 : 24-12-2009 06:38 »  |  | 
 
 Классические грабли    Компилятор принимает код за объявление функции. Надо |  
						| 
								|  |  
								| « Последнее редактирование: 24-12-2009 06:40 от Вад » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dr.Yevhenius | 
								|  | « Ответ #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
 
 Всё это выводит при попытке создать экземпляр класса Что теперь не так? _______________________________________
 А, всё, нашел: вся проблема с CFileFind cff;. Поменял на указатель.
 
 |  
						| 
								|  |  
								| « Последнее редактирование: 24-12-2009 07:12 от Inkognito » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dr.Yevhenius | 
								|  | « Ответ #3 : 24-12-2009 07:16 »  |  | 
 
 Всё-равно какая-то ерунда: при попитке выдает нагора     при первом компилировании: 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. На подобного не выдает, хотя по сути это одно и то же, только типы разные... (Это что же получается: нельзя динамически создавать CFileFind?     ) |  
						| 
								|  |  
								| « Последнее редактирование: 24-12-2009 07:19 от Inkognito » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #4 : 24-12-2009 07:23 »  |  | 
 
 _beginthreadex используешь? Библиотеки какие-нибудь дополнительно к проекту линкуешь? Похоже на конфликт 2х версий стандартной библиотеки (отладочной и релизной или многопоточной и однопоточной).  |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dr.Yevhenius | 
								|  | « Ответ #5 : 24-12-2009 07:27 »  |  | 
 
 Использую только #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 » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #6 : 24-12-2009 07:33 »  |  | 
 
 А что такое класс CFileFind? MFC? Возможно, где-то из MFC просочилась многопоточность. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  | 
	| 
			| 
					
						| lapulya 
								Молодой специалист    Offline | 
								|  | « Ответ #8 : 24-12-2009 15:58 »  |  | 
 
 Inkognito, если твою программу укоротить до такого (т.е. убрать ВСЕ):
 class A
 {};
 
 int main()
 {
 A a;
 return 0;
 }
 
 что скажет компилер и линкер?
 |  
						| 
								|  |  
								|  |  Записан | 
 
 С уважением Lapulya |  |  | 
	| 
			| 
					
						| Dr.Yevhenius | 
								|  | « Ответ #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 
								Молодой специалист    Offline | 
								|  | « Ответ #10 : 25-12-2009 14:07 »  |  | 
 
 Inkognito, а все свои инклуды вставил? Кстати я надеюсь, что ты не создал новый проект с предложенным мной исходником, а использовал свой "проблемный".
 Что за библиотека LIBCD, кто добавил, зачем добавил, кто писал, что внутри?
 |  
						| 
								|  |  
								| « Последнее редактирование: 25-12-2009 14:10 от lapulya » |  Записан | 
 
 С уважением Lapulya |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #11 : 25-12-2009 14:08 »  |  | 
 
 Раз внешних библиотек самостоятельно не добавлялось - думаю, проблема в где-то в линковке с MFC.  |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dr.Yevhenius | 
								|  | « Ответ #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 
								Молодой специалист    Offline | 
								|  | « Ответ #13 : 25-12-2009 20:41 »  |  | 
 
 Inkognito,  Смысл компилить - понять на что орет линкер. Именно поэтому надо использовать существующий проект, а не создавать новый. В твоем текущем проекте (тот что не линкуется) залинкована библиотека LIBCD (хотя ты говоришь, что ничего не линковал, но у линкера на этот счет другое мнение), вот я и спрашиваю что это за хрень? Если ты создал новый проект, то там естественно никакой LIBCD нет, поэтому то и проблемы нет, поэтому и компилить мой пример в новом проекте смысла нет. откуда мне знать, кто добавил LIBCD в afxmem.obj? эту фразу я вообще не понял. Кстати, можно грохнуть LIBCD из проекта и посмотреть, на что будет орать анресолвед экстернал симбол. |  
						| 
								|  |  
								|  |  Записан | 
 
 С уважением Lapulya |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #14 : 25-12-2009 22:04 »  |  | 
 
 Куда грохнуть libcd? это же отладочная LIBC. Она по дефолту включается, с ней не должно быть проблем с самой по себе. А afx*.obj - это MFC-шные, насколько я понимаю. Вот где-то здесь и проблема: будто в MFC одна версия библиотеки LIBC слинкована, а в проекте - другая.
 
 Inkognito, как ты подключал MFC - мастером создавал MFC-проект? Были ещё какие-то манипуляции с проектом и mfc?
 |  
						| 
								|  |  
								| « Последнее редактирование: 25-12-2009 22:06 от Вад » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dr.Yevhenius | 
								|  | « Ответ #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 | 
								|  | « Ответ #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 
								Молодой специалист    Offline | 
								|  | « Ответ #17 : 26-12-2009 12:00 »  |  | 
 
 Сорри, я не знал, что LIBCD отладочная библиотека. Но суть дела не меняется, надо было разобраться на что орал линкер, т.е. понять какие либы конфликтуют и кто и как добавил их в проект. |  
						| 
								|  |  
								|  |  Записан | 
 
 С уважением Lapulya |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #18 : 26-12-2009 21:32 »  |  | 
 
 lapulya[/b], ну, из слов топикстартера Это у меня вообще Win32 Console Application. Не стояло сюда MFC пихать?  я могу заключить, что надо смотреть, как именно был прилеплен к проекту MFC. Возможно, каким-то нетрадиционным способом   |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| lapulya 
								Молодой специалист    Offline | 
								|  | « Ответ #19 : 27-12-2009 22:51 »  |  | 
 
 Вад, Угу, то он это после моего поста написал, а так со всем согласная я   |  
						| 
								|  |  
								|  |  Записан | 
 
 С уважением Lapulya |  |  | 
	|  |