IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POSIX C Discussion :

problème avec la macro PTHREAD_MUTEX_INITIALIZER


Sujet :

POSIX C

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut problème avec la macro PTHREAD_MUTEX_INITIALIZER
    Bonjour à tous,
    Je souhaiterais exécuter sous linux un programme en C écrit par un pote sous windows. Ce programme fonctionne parfaitement sous windows.
    J'ai un souci avec la macro PTHREAD_MUTEX_INITIALIZER : le compilateur met qu'une expression est attendu avant un {, mais il n'y a pas de { dans le code à ces lignes...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    bool sds_initialize(u16 local_port, u16 switch_port, const char *switch_name, u16 *_signals, u16 _nb_signals, u16 **_signals_ranges, u16 _nb_signals_ranges) {
    	watchdog_monitoring = true;
    	multithreaded_signal_processing = true;
    	signal_callback_function = do_nothing;
    	*restart_command = '\0';
    	restart_command_mutex = PTHREAD_MUTEX_INITIALIZER;    //ligne 116
    	last_switch_signal_mutex = PTHREAD_MUTEX_INITIALIZER;   //ligne 117
    	is_disposed_mutex = PTHREAD_MUTEX_INITIALIZER;            //ligne 118
    	__is_disposed = false;
    	nb_signals = _nb_signals;
    	signals = _signals;
    	nb_signals_ranges = _nb_signals_ranges;
    	signals_ranges = _signals_ranges;
    	last_switch_signal.tv_sec = 0;
    	last_switch_signal.tv_usec = 0;
     
    	Entity server;
     
    	if (4 + 2 * nb_signals + 4 * nb_signals_ranges > SIGNAL_DATA_MAX_SIZE) return true;
     
    	if (initialize_enregistrement_signal()) return true;
     
    	if (entity_initialize(&server, switch_port, switch_name)) return true;
     
    	if (signal_initialise_client(local_port, server)) return true;
     
    	return false;
    }
    le retour de gcc :
    sds_process.c: In function ‘sds_initialize’:
    sds_process.c:116: error: expected expression before ‘{’ token
    sds_process.c:117: error: expected expression before ‘{’ token
    sds_process.c:118: error: expected expression before ‘{’ token
    Merci d'avance pour votre aide.


    Autre question pendant qu'on y est : un warning apparait disant que usleep est déclaré implicitement alors que la bibliothèque unistd.h est bien inclue, est-ce que vous voyez ce qui se passe ?

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Déjà comment veux tu que l'on reproduise le problème avec un code qui ne compile pas?
    poste un code qui compile, en plus tu donnes des numéro de ligne mais comment veux tu que ça nous parle?
    Pour le problème avec usleep(), le problème vient du fait que tu compiles avec le flag -ansi, en gros,
    tu dis au compilateur de rejeter tout ce qui n'est pas du C standard; compile en -std=gnu89 ou -std=gnu99 et tu n'auras plus de soucis.
    Enfin je ne sais pas d'où sort u16, mais il existe l'équivalent standard dans stdint.h à savoir uint16_t .
    Cordialement.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Je ne tiens pas à poster le programme entier, qui comporte plusieurs fichiers, soit plus de mille lignes de code.

    Sinon u16 = unsigned short, cette équivalence a été faite car ce programme est destiné à un système embarqué, c'est donc plus explicite de déclarer les variables ainsi : on sait qu'il s'agit d'un entier non signé de 16 bits.

    J'espère que quelqu'un a déjà rencontré ce problème et pourra m'aider.

    merci pour l'indication, je vais tester en modifiant le makefile.

  4. #4
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par toma_n7 Voir le message
    Je ne tiens pas à poster le programme entier, qui comporte plusieurs fichiers, soit plus de mille lignes de code.
    poster un code compilable ne veut pas pas dire poster tout ton code!!
    Citation Envoyé par toma_n7 Voir le message
    Sinon u16 = unsigned short, cette équivalence a été faite car ce programme est destiné à un système embarqué, c'est donc plus explicite de déclarer les variables ainsi : on sait qu'il s'agit d'un entier non signé de 16 bits.
    Pourquoi, uint16_t n'est pas parlant selon toi?
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  5. #5
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    c'est vrai que ce n'est pas la peine de mettre tout le code...

    Voilà qq chose de compilable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <stdbool.h>
     
    #include <string.h>
    #include <strings.h>
    #include <pthread.h>
    #include <sys/time.h>
    #include <unistd.h>
     
    #define SIGNAL_DATA_MAX_SIZE 1000
    #define MAX_SIZE_RESTART_COMMAND (SIGNAL_DATA_MAX_SIZE - 50)
     
    typedef unsigned short u16;
     
    static pthread_mutex_t last_switch_signal_mutex;
    static bool __is_disposed;
    static pthread_mutex_t is_disposed_mutex;
    static char restart_command[MAX_SIZE_RESTART_COMMAND + 1];
    static pthread_mutex_t restart_command_mutex;
     
     
     
    bool sds_initialize(u16 local_port, u16 switch_port, const char *switch_name, u16 *_signals, u16 _nb_signals, u16 **_signals_ranges, u16 _nb_signals_ranges) {
    	restart_command_mutex = PTHREAD_MUTEX_INITIALIZER;
    	last_switch_signal_mutex = PTHREAD_MUTEX_INITIALIZER;
    	is_disposed_mutex = PTHREAD_MUTEX_INITIALIZER;
     
    	return false;
    }
    Sinon je ne sais pas pourquoi il a utilisé u16 au lieu de uint16_t, je lui demanderai...

  6. #6
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    OK le problème est simple, PTHREAD_MUTEX_INITIALIZER ne peut servir qu'à initialiser un mutex static. En gros tu est obligé de l'initialiser à sa déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <stdbool.h>
    #include <string.h>
    #include <strings.h>
    #include <pthread.h>
    #include <sys/time.h>
    #include <unistd.h>
     
    #define SIGNAL_DATA_MAX_SIZE 1000
    #define MAX_SIZE_RESTART_COMMAND (SIGNAL_DATA_MAX_SIZE - 50)
     
    typedef unsigned short u16;
     
    static pthread_mutex_t last_switch_signal_mutex = PTHREAD_MUTEX_INITIALIZER;
    static bool __is_disposed;
    static pthread_mutex_t is_disposed_mutex = PTHREAD_MUTEX_INITIALIZER;
    static char restart_command[MAX_SIZE_RESTART_COMMAND + 1];
    static pthread_mutex_t restart_command_mutex = PTHREAD_MUTEX_INITIALIZER;
     
     
     
    bool sds_initialize(u16 local_port, u16 switch_port, const char *switch_name, u16 *_signals, u16 _nb_signals, u16 **_signals_ranges, u16 _nb_signals_ranges)
    {
       return false;
    }
    Si tu veux l'initialiser dynamiquement, tu dois utiliser pthread_mutex_init() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pthread_mutex_init (&last_switch_signal_mutex, NULL);
    est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static pthread_mutex_t last_switch_signal_mutex = PTHREAD_MUTEX_INITIALIZER;
    excepté que dans le dernier cas, il n'a pas de vérification d'erreur.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par toma_n7 Voir le message
    c'est vrai que ce n'est pas la peine de mettre tout le code...

    Voilà qq chose de compilable :
    De plus, un identificateur commençant par _ suivit de _ est réservé à l'implémentation.

    Ceci est correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdbool.h>
    #include <pthread.h>
     
    #define SIGNAL_DATA_MAX_SIZE 1000
    #define MAX_SIZE_RESTART_COMMAND (SIGNAL_DATA_MAX_SIZE - 50)
     
    static bool is_disposed;
    static char restart_command[MAX_SIZE_RESTART_COMMAND + 1];
    static pthread_mutex_t restart_command_mutex = PTHREAD_MUTEX_INITIALIZER;
    static pthread_mutex_t last_switch_signal_mutex = PTHREAD_MUTEX_INITIALIZER;
    static pthread_mutex_t is_disposed_mutex = PTHREAD_MUTEX_INITIALIZER;
    Mais les globales, ça craint...
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    merci pour vos réponses, le programme compile correctement !
    ... mais ça ne va pas plus loin

    gcc -o process_structure.o -pthread -c process_structure.c -std=gnu99 -W -Wall
    gcc -o sds_process.o -pthread -c sds_process.c -std=gnu99 -W -Wall
    gcc -o sds_switch.o -pthread -c sds_switch.c -std=gnu99 -W -Wall
    gcc -o signal.o -pthread -c signal.c -std=gnu99 -W -Wall
    gcc sds_switch.o signal.o -o sds_switch
    sds_switch.o: In function `main':
    sds_switch.c.text+0x666): undefined reference to `pthread_create'
    signal.o: In function `signal_receive_callback':
    signal.c.text+0x6e1): undefined reference to `pthread_create'
    signal.o: In function `signal_receive_callback_server':
    signal.c.text+0x809): undefined reference to `pthread_create'
    signal.o: In function `signal_receive_callback_thread_int':
    signal.c.text+0x93a): undefined reference to `pthread_create'
    signal.o: In function `signal_receive_callback_thread':
    signal.c.text+0x9b2): undefined reference to `pthread_create'
    signal.o:signal.c.text+0xb4a): more undefined references to `pthread_create' follow
    signal.o: In function `signal_wait_reception_thread':
    signal.c.text+0xc0b): undefined reference to `pthread_join'
    signal.o: In function `signal_stop_receive_callback':
    signal.c.text+0xce4): undefined reference to `pthread_join'
    collect2: ld returned 1 exit status
    make: *** [all] Erreur 1
    Vous avez une idée ?

  9. #9
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    fausse alerte, il suffisait juste de rajouter -pthread à une ligne du makefile.

    Merci,
    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec les macros _RPT et _RPTF
    Par pikatshu dans le forum C++Builder
    Réponses: 0
    Dernier message: 12/11/2007, 12h31
  2. Problème avec ma macro
    Par michparmentier dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/11/2007, 12h29
  3. Problème avec une macro impression
    Par Border_xls dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/11/2007, 15h18
  4. Problème avec une macro faisant apel à un tableau Excell
    Par valouche dans le forum Macros et VBA Excel
    Réponses: 52
    Dernier message: 19/06/2007, 12h38
  5. Réponses: 7
    Dernier message: 11/07/2006, 09h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo