Forum Programmation.c++ erreur compil Mutex

Posté par  .
Étiquettes : aucune
0
4
juil.
2005
Merci de me dire ce qui ne va pas, (ca doit etre tout con mais je me remets au C!)
g++ -Wall -D_REENTRANT -DUSE_PTHREADS -DMRCP -DPERMISSIVE -g -I../build -I../build/../util -I../build/../util/threads -I../build/../util/logging -I../build/../util/crypto -I../build/../util/statistics -I../build/../util/snmp -I../build/../util/signals -I../build/../util/behavior -I../build/../util/io -I../build/../util/services -I../build/../util/transport -I../build/../util/config -I../build/../util/dnssrv -I../build/../util/deprecated -I../build/../util/adt -I../build/../contrib/libxml2.Linux.i686 -DVOCAL_USE_DEPRECATED -DVOCAL_USING_PENTIUM -DUSE_PTHREADS -DUSE_CRYPTO_RANDOM -c -o obj.debug.Linux.i686/threads/Mutex.o threads/Mutex.cxx
threads/Mutex.cxx: Dans constructor « Vocal::Threads::Mutex::Mutex() »:
threads/Mutex.cxx:69: erreur d'analyse syntaxique avantle jeton « { »
threads/Mutex.cxx: At global scope:
threads/Mutex.cxx:70: « myId » n'a pas été déclaré dans cet horizon
threads/Mutex.cxx:71: erreur d'analyse syntaxique avant « static_cast »
make[1]: *** [obj.debug.Linux.i686/threads/Mutex.o] Erreur 1


MErci
  • # i18n

    Posté par  (site web personnel) . Évalué à 2.

    > « myId » n'a pas été déclaré dans cet horizon

    aaah les bienfaits de l'i18n sur les messages d'erreur de g++
  • # cool le nettoyage du forum

    Posté par  . Évalué à 1.

    note pour les modérateurs:
    lors de la duplication d'entrée dans le forum, plutot que de ne laisser que la derniere entrée, ce serait pas mal de réimporter les commentaires déja effectués dans les entreés précedentes, d'autant plus que le fil de discussion etait plus complet que le sujet lui meme...
  • # plus de renseignements ?

    Posté par  (site web personnel) . Évalué à 1.

    à Difficile de dire ce qui ne va pas sans accès au code concerné. Il faudrait les lignes 69 à 71 plus quelques unes avant (depuis le début du constructeur, par exemple).
    • [^] # Re: plus de renseignements ?

      Posté par  . Évalué à 1.

      voila:
      static const char* const Mutex_cxx_Version =
      "$Id: Mutex.cxx,v 1.2 2001/08/10 04:02:08 icahoon Exp $";



      #include "Mutex.hxx"
      #include "global.h"
      #include
      #include
      #include



      using Vocal::Threads::Mutex;
      using Vocal::ReturnCode;
      using Vocal::SUCCESS;


      Mutex::Mutex()
      {

      myId = PTHREAD_MUTEX_INITIALIZER ;
      ReturnCode rc = vmutex_init(&myId);
      assert( rc != EINVAL);
      assert( rc != EBUSY);
      assert( rc != ENOMEM);
      assert( rc != EAGAIN);
      assert( rc == SUCCESS );
      }


      Mutex::~Mutex ()
      {

      ReturnCode rc = vmutex_destroy(&myId);
      assert( rc != EBUSY ); // currently locked
      assert( rc == SUCCESS );

      }

      on ne voit pas d'erreur de syntaxe... !!?
      • [^] # Re: plus de renseignements ?

        Posté par  (site web personnel) . Évalué à 1.

        Je ne vois rien de particulier en dehors des #include vides, ce qui devait générer une erreur du type :
        #include attend "NOM_DE_FICHIER" ou <NOM_DE_FICHIER>

        Si ce n'est pas ça, il va aussi falloir Mutex.hh et global.h pour y voir plus clair. Au fait, quelle est la version de g++?
        • [^] # Re: plus de renseignements ?

          Posté par  . Évalué à 1.

          Version g++: 3.2.2 20030222


          Sinon:
          ----------------------------------------------------------
          MUTEX.HXX:

          #if !defined(VOCAL_MUTEX_HXX)
          #define VOCAL_MUTEX_HXX

          static const char* const Mutex_hxx_Version =
          "$Id: Mutex.hxx,v 1.2 2001/03/23 20:22:41 icahoon Exp $";


          #include "global.h"
          #include "vthread.h"
          #include "Lockable.hxx"


          /** Infrastructure common to VOCAL.
          */
          namespace Vocal
          {


          /** Infrastructure common to VOCAL to create and manage threads.
          */
          namespace Threads
          {


          /** Defines a simple mutex class which provides 'fast' mutex functionality,
          * meaning that if the calling thread already has the mutex locked, a call
          * to lock will block the thread forever.
          */
          class Mutex : public Lockable
          {
          public:

          /** Create a VMutex object initialized with operating system
          * dependent defaults (if any).
          */
          Mutex();


          /**
          ** Delete a VMutex object
          */
          virtual ~Mutex();


          /** Lock the mutex. If the mutex is currently unlocked, it
          * becomes locked and owned by the calling thread, and
          * lock returns immediately. If the mutex is already locked by
          * another thread, lock suspends the calling thread until the
          * mutex is unlocked. If the mutex is already locked by the calling
          * thread, the calling thread blocks forever.
          */
          virtual void lock();


          /** Unlock the mutex. The mutex is assumed to be locked and owned
          * by the calling thread, meaning that a call to unlock always
          * returns it to the unlocked state.
          */
          virtual void unlock();


          /** Returns the operating system dependent unique id of the mutex.
          */
          vmutex_t * getId() const;

          private:

          mutable vmutex_t myId ;

          };

          } // namespace Threads
          } // namespace Vocal


          #endif // !defined(VOCAL_MUTEX_HXX)

          ----------------------------------------------------------------------------------
          MUTEX.CXX

          static const char* const Mutex_cxx_Version =
          "$Id: Mutex.cxx,v 1.2 2001/08/10 04:02:08 icahoon Exp $";



          #include "Mutex.hxx"
          #include "global.h"
          #include
          #include
          #include



          using Vocal::Threads::Mutex;
          using Vocal::ReturnCode;
          using Vocal::SUCCESS;


          Mutex::Mutex()
          {

          myId = PTHREAD_MUTEX_INITIALIZER ;
          ReturnCode rc = vmutex_init(&myId);
          assert( rc != EINVAL);
          assert( rc != EBUSY);
          assert( rc != ENOMEM);
          assert( rc != EAGAIN);
          assert( rc == SUCCESS );
          }


          Mutex::~Mutex ()
          {

          ReturnCode rc = vmutex_destroy(&myId);
          assert( rc != EBUSY ); // currently locked
          assert( rc == SUCCESS );

          }


          void
          Mutex::lock()
          {
          ReturnCode rc = vmutex_lock(&myId);
          assert( rc != EINVAL );
          assert( rc != EDEADLK );
          assert( rc == SUCCESS );

          }


          void
          Mutex::unlock()
          {
          ReturnCode rc = vmutex_unlock(&myId);
          assert( rc != EINVAL );
          assert( rc != EPERM );
          assert( rc == SUCCESS );
          }


          vmutex_t *
          Mutex::getId() const
          {
          return ( &myId );
          }

          --------------------------------------------------------------------------
          GLOBAL.H

          #ifndef GLOBAL_H_
          #define GLOBAL_H_

          $Id: global.h,v 1.8 2001/08/16 20:07:16 icahoon Exp $
          */


          #ifdef USE_DMALLOC
          #include <dmalloc.h>
          #endif

          #ifdef __sgi
          #include <pthread.h>
          #include
          #endif

          #ifdef __cplusplus
          namespace std {
          };
          using namespace std;
          #endif

          /* this is used to turn of unused warnings in GCC */

          #ifdef __GNUC__
          #define UNUSED_VARIABLE __attribute__((__unused__))
          #else
          #define UNUSED_VARIABLE
          #endif

          #if defined(WIN32)

          #if _MSC_VER > 1000
          #pragma once
          #endif /* _MSC_VER > 1000 */

          #pragma warning(disable : 4786)

          #define WIN32_LEAN_AND_MEAN

          #include <winsock2.h>
          #include <direct.h>
          #include
          #include
          #include
          #include <process.h>

          #define srandom srand
          #define random rand

          #define strcasecmp stricmp
          #define strncasecmp strnicmp

          #define EWOULDBLOCK WSAEWOULDBLOCK
          #define EINPROGRESS WSAEINPROGRESS
          #define EALREADY WSAEALREADY
          #define ENOTSOCK WSAENOTSOCK
          #define EDESTADDRREQ WSAEDESTADDRREQ
          #define EMSGSIZE WSAEMSGSIZE
          #define EPROTOTYPE WSAEPROTOTYPE
          #define ENOPROTOOPT WSAENOPROTOOPT
          #define EPROTONOSUPPORT WSAEPROTONOSUPPORT
          #define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
          #define EOPNOTSUPP WSAEOPNOTSUPP
          #define EPFNOSUPPORT WSAEPFNOSUPPORT
          #define EAFNOSUPPORT WSAEAFNOSUPPORT
          #define EADDRINUSE WSAEADDRINUSE
          #define EADDRNOTAVAIL WSAEADDRNOTAVAIL
          #define ENETDOWN WSAENETDOWN
          #define ENETUNREACH WSAENETUNREACH
          #define ENETRESET WSAENETRESET
          #define ECONNABORTED WSAECONNABORTED
          #define ECONNRESET WSAECONNRESET
          #define ENOBUFS WSAENOBUFS
          #define EISCONN WSAEISCONN
          #define ENOTCONN WSAENOTCONN
          #define ESHUTDOWN WSAESHUTDOWN
          #define ETOOMANYREFS WSAETOOMANYREFS
          #define ETIMEDOUT WSAETIMEDOUT
          #define ECONNREFUSED WSAECONNREFUSED
          #define ELOOP WSAELOOP
          #define EHOSTDOWN WSAEHOSTDOWN
          #define EHOSTUNREACH WSAEHOSTUNREACH
          #define EPROCLIM WSAEPROCLIM
          #define EUSERS WSAEUSERS
          #define EDQUOT WSAEDQUOT
          #define ESTALE WSAESTALE
          #define EREMOTE WSAEREMOTE

          #if !defined(MAXHOSTNAMELEN)
          #define MAXHOSTNAMELEN 256
          #endif /* !defined(MAXHOSTNAMELEN) */

          typedef int sigset_t;
          typedef int siginfo_t;
          typedef int pid_t;
          typedef unsigned long int in_addr_t;
          typedef long off_t;

          struct pollfd
          {
          int fd;
          short int events;
          short int revents;
          };

          #define POLLIN 0x001
          #define POLLPRI 0x002
          #define POLLOUT 0x004
          #define POLLERR 0x008
          #define POLLHUP 0x010
          #define POLLNVAL 0x020

          #define getcwd _getcwd

          #endif /* defined(WIN32) */

          #endif /* GLOBAL_H_ */


          Voila, je n'arrive tjrs pas a voir ou pourrait etre le probleme!
          • [^] # Re: plus de renseignements ?

            Posté par  . Évalué à 2.

            J'ai trouvé!! en rajoutant une petite condition, ca fonctionne:
            static vmutex_t local;

            static
            void safe()
            {
            vmutex_init(&local);
            }

            Mutex::Mutex()
            {
            static pthread_once_t initialized = PTHREAD_ONCE_INIT;
            pthread_once(&initialized, safe);

            vmutex_lock(&local);
            ReturnCode rc = vmutex_init(&myId);
            assert( rc != EINVAL);
            assert( rc != EBUSY);
            assert( rc != ENOMEM);
            assert( rc != EAGAIN);

            assert( rc == SUCCESS );
            vmutex_unlock(&local);
            }


            Merci a tous pour votre aide!!! a la prochaine!
            • [^] # Re: plus de renseignements ?

              Posté par  . Évalué à 2.

              Gargl ! Des static partout pour faire marcher un programme qui ne veut pas compiler !

              Je te le dis sans méchanceté, mais j'ai plus l'impression que tu as tatonné jusqu'à ce que cela semble marcher plutôt que réellement trouvé la clef du mystère !
          • [^] # Re: plus de renseignements ?

            Posté par  . Évalué à 2.

            comme je l'avais marqué dans un thread qui a été effacé:

            au lieu de

            using Vocal::Threads::Mutex;
            using Vocal::ReturnCode;
            using Vocal::SUCCESS


            essaye de mettre ceci:


            namespace Vocal {
            namespace Threads {

            //ton code d'implémentation
            Mutex::Mutex() {...}
            Mutex::~Mutex() {...}
            ...

            }

            }


            car je pense que ton probleme vient de la résolution de portée qui serait incorrecte.

            de plus j'ai l'impression que certaines choses ne sont pas déclarées:

            using Vocal::ReturnCode;
            using Vocal::SUCCESS;

            et je me demande si using peut s'appliquer a des variables directement.

            (j'avais déja écrit tout ca dans un thread qui a été effacé. Pour le reste du code tout semble correct donc.....)

            merci de me corriger si j'ai dit des conneries, notamment pour les déclarations using a propos des variables.
            • [^] # Re: plus de renseignements ?

              Posté par  . Évalué à 1.

              ouai je ne sais pourquoi le thread a été effacer.. , j'ai essayé en namespace... et ca ne fonctionnait pas et vue que je suis assez pressé j'ai fait au plus simple pour que ca tourne. (mais c vrai que des static partout c pas formidable!

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.