[Resolu]Erreur de compilation

Erreur de compilation [Resolu] - C++ - Programmation

Marsh Posté le 23-06-2009 à 10:52:26    

Bonjour, je me trouve confronté a une erreur de compilation bizarre.
 
Voici le code utilisé:
 

Code :
  1. #include <windows.h>
  2. #include <string>
  3. #include <iostream>
  4. void WatchDirectory(LPTSTR lpDir);
  5. int main()
  6. {
  7.    TCHAR Directory[MAX_PATH];
  8.    GetCurrentDirectory(MAX_PATH,Directory);
  9.    WatchDirectory(Directory);
  10.    return 0;
  11. }
  12. struct ScopedLockHandle
  13. {
  14.    ScopedLockHandle(HANDLE h_)
  15.       :m_handle(h_)
  16.    {}
  17.    ~ScopedLockHandle()
  18.    {CloseHandle(m_handle);}
  19. private:
  20.    HANDLE m_handle;
  21. };
  22. void WatchDirectory(LPTSTR lpDir)
  23. {
  24.   HANDLE hDir = CreateFile(
  25.     lpDir,
  26.     FILE_LIST_DIRECTORY,
  27.     FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE,
  28.     NULL,
  29.     OPEN_EXISTING,
  30.     FILE_FLAG_BACKUP_SEMANTICS,
  31.     NULL
  32.   );
  33.   if(hDir){
  34.      ScopedLockHandle scoped(hDir);
  35.      const unsigned nbr_item=1024;
  36.      FILE_NOTIFY_INFORMATION Buffer[nbr_item];
  37.      DWORD BytesReturned;
  38.      while( ReadDirectoryChangesW(
  39.         hDir,
  40.         &Buffer,
  41.         sizeof(Buffer),
  42.         TRUE, /* monitoring option */
  43.         FILE_NOTIFY_CHANGE_SECURITY|
  44.         FILE_NOTIFY_CHANGE_CREATION|
  45.         FILE_NOTIFY_CHANGE_LAST_ACCESS|
  46.         FILE_NOTIFY_CHANGE_LAST_WRITE|
  47.         FILE_NOTIFY_CHANGE_SIZE|
  48.         FILE_NOTIFY_CHANGE_ATTRIBUTES|
  49.         FILE_NOTIFY_CHANGE_DIR_NAME|
  50.         FILE_NOTIFY_CHANGE_FILE_NAME, /* filter conditions */
  51.         &BytesReturned, /* bytes returned */
  52.         NULL, /* overlapped buffer */
  53.         NULL))
  54.      {
  55.         FILE_NOTIFY_INFORMATION *p_cur = reinterpret_cast<FILE_NOTIFY_INFORMATION*>(&Buffer[0]);
  56.         do{
  57.            switch(p_cur->Action)
  58.            {
  59.            case FILE_ACTION_ADDED:
  60.               std::wcout<<L"File added : "<<std::wstring(p_cur->FileName,p_cur->FileNameLength/sizeof(p_cur->FileName[0]))<<std::endl;
  61.               break;
  62.            case FILE_ACTION_REMOVED:
  63.               std::wcout<<L"File removed : "<<std::wstring(p_cur->FileName,p_cur->FileNameLength/sizeof(p_cur->FileName[0]))<<std::endl;
  64.               break;
  65.            case FILE_ACTION_MODIFIED :
  66.               std::wcout<<L"File modified : "<<std::wstring(p_cur->FileName,p_cur->FileNameLength/sizeof(p_cur->FileName[0]))<<std::endl;
  67.               break;
  68.            case FILE_ACTION_RENAMED_OLD_NAME :
  69.               std::wcout<<L"File renamed old name : "<<std::wstring(p_cur->FileName,p_cur->FileNameLength/sizeof(p_cur->FileName[0]))<<std::endl;
  70.               break;
  71.            case FILE_ACTION_RENAMED_NEW_NAME :
  72.               std::wcout<<L"File rename new name : "<<std::wstring(p_cur->FileName,p_cur->FileNameLength/sizeof(p_cur->FileName[0]))<<std::endl;
  73.               break;
  74.            default:
  75.               std::wcout<<L"File unknown : "<<std::wstring(p_cur->FileName,p_cur->FileNameLength/sizeof(p_cur->FileName[0]))<<std::endl;
  76.               break;
  77.            }
  78.            p_cur = reinterpret_cast<FILE_NOTIFY_INFORMATION*>(reinterpret_cast<unsigned char*>(p_cur) + p_cur->NextEntryOffset);
  79.         }while(p_cur->NextEntryOffset>0);
  80.      }
  81.   }
  82. }


 
 
 
et l'erreur de compilation est la suivante:
 

Code :
  1. error: `wcout' is not a member of `std'|


 
Quand j'enléve les std::  
 
 
voici erreur :
 

Code :
  1. error: `wcout' was not declared in this scope


 
j'ai essayé beaucoup de chose rien a marché.
J'espère que vous pourrez m'aider.
 
Cordialement


Message édité par thanks33 le 24-06-2009 à 09:08:02
Reply

Marsh Posté le 23-06-2009 à 10:52:26   

Reply

Marsh Posté le 23-06-2009 à 12:08:03    

Remplacer

#include <iostream>

par

#include <iostream>
using namespace std;
extern wostream wcout;

Message cité 1 fois
Message édité par olivthill le 23-06-2009 à 12:09:53
Reply

Marsh Posté le 23-06-2009 à 13:12:16    

merci de ton aide.
 
Malheureusement il y a toujours des erreurs.
 
 
les voici:
 

Code :
  1. `wostream' does not name a type


 

Code :
  1. `wcout' undeclared (first use this function)


 
 
 
Cordialement
 

Reply

Marsh Posté le 23-06-2009 à 13:24:01    

C'est quoi le compilateur que tu utilises?  (Il me semble qu'un -- ou même les deux -- des ports de gcc pour Windows a -- avait? --  des problèmes dans la gestions des wchar_t avec beaucoup de choses non implémentées).
 
Sur le principe je ne vois pas de problèmes et ce que propose olivthill ne change rien.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 23-06-2009 à 13:28:03    

olivthill a écrit :

Remplacer

#include <iostream>

par

#include <iostream>
using namespace std;
extern wostream wcout;



 
Je n'aime pas tellement les using namespace (surtout std qui n'est pas tellement conçu pour, j'ai eu trop de problèmes avec des collisions) et ça ne devrait rien changer à son problème.
 
Et naturellement, la déclaration d'un wcout dans le namespace global sans en fournir une définition va te fournir une erreur au link si tu arrives jusque là.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 23-06-2009 à 13:33:39    

Merci de ton aide Un programmeur.
 
j'utilise mingw32 comme compilateur et dev-c++ comme IDE.
 
J'ai aussi testé mon code sous code-block j'obtiens la même erreur.
 
 
Si cella vient du compilateur, quelqu'un aurai un autre solution pour récupérer les nom de fichier dans un répertoire?
 
 
Cordialement

Reply

Marsh Posté le 23-06-2009 à 16:35:55    

Mon idée de namespace n'était bonne et n'avait rien à voir en effet. Excusez-moi.
 
dev-cpp et code-block utilisent mingw. Or celui-ci ne supporte pas les wide characters.
C'est indiqué sur le site même de mingw : http://www.mingw.org/wiki/wide_characters
 
La solution consiste à utiliser des multibyte au lieu de wide char.
Pour cela, il faudrait utiliser WideCharToMultiByte()
 

Reply

Marsh Posté le 23-06-2009 à 17:21:48    

merci de m'aider ca va faire 2 jours que je galère dessus.
 
 
pourrais tu me donner un exemple s'il te plait?
 
 
Cordialement

Reply

Marsh Posté le 23-06-2009 à 17:58:13    

Avec plaisir. Voici :

TCHAR szFile[MAX_PATH];
int count = WideCharToMultiByte(CP_ACP, 0, p_cur->FileName,
                                p_cur->FileNameLength / sizeof(WCHAR),
                                szFile, MAX_PATH - 1, NULL, NULL);
szFile[count] = TEXT('\0');

Reply

Marsh Posté le 23-06-2009 à 18:32:06    

Donc si j'ai bien compris.
 
A la place de ca :
 

Code :
  1. case FILE_ACTION_ADDED:
  2.                std::wcout<<L"File added : "<<std::wstring(p_cur->FileName,p_cur->FileNameLength/sizeof(p_cur->FileName[0]))<<std::endl;
  3.                break;


 
je met :
 
 

Code :
  1. case FILE_ACTION_ADDED:
  2.              int count = WideCharToMultiByte(CP_ACP, 0, p_cur->FileName,
  3.               p_cur->FileNameLength / sizeof(WCHAR),
  4.               szFile, MAX_PATH - 1, NULL, NULL);
  5.              break;


 
C'est bien sa?
 
Merci de m'aider
 
Cordialement

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed