Variable globale en c

Résolu
Bonjour,

j'ai un petit soucis: voici mon code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>

#include "SWIrecAPI.h"
#include "SWIepAPI.h"

#define MAX_AUDIO_BUF_LEN    2000  
#define MAX_EP_AUDIO_BUF_LEN 2000
#define NUM_AUDIO_BUFS       5
#define   MAGIC_WORD         0  /* switch to 1 for magic word demo */

#ifdef WIN32 /* Windows NT */
#include <windows.h>
#include <process.h>

#define RETURN_TYPE unsigned int

typedef unsigned int (__stdcall *ThreadFunc)(void* userData);

#define usleep(x) Sleep(x / 1000)
#define DEFINE_THREAD_FUNC(funcName, userData) \
        unsigned int (__stdcall funcName)(void *userData)
#define Thread HANDLE
   
SWIrecFuncResult rc;
SWIrecRecognizer *rec =NULL;
SWIepDetector *det;
wchar_t *channelName = L"1";

int ThreadCreate(Thread* thread, ThreadFunc start_function, void* arg)
{
  *thread = (Thread)_beginthreadex(NULL, 0, start_function, arg, 0, NULL);
  return 0;
}

int ThreadJoin(Thread* thread, void* status)
{
  int rc;

  switch (WaitForSingleObject(*thread, INFINITE)) {
    case WAIT_OBJECT_0:
    case WAIT_ABANDONED:
      rc = 0;
      break;
    case WAIT_TIMEOUT:
    default:
      rc = 1;
      break;
  }
  CloseHandle(*thread);
  return rc;
}



le problème est qu'il me dit : rc undeclared first use this fonction
Je pense que rc est déclarée comme variable globale donc la fonction doit la voir?

Je me trompe ?

11 réponses

  1. Contributeur
    Tu es bien sûr que ta variable rc est bien définie dans le même fichier que la fonction init ?
    De plus, je vois un #ifdef et je ne vois pas le #endif...
    1. Contributeur
      Bonjour,
      Pouvez-vous donner le message d'erreur complet ? Car là, on ne voit pas dans quelle fonction est obtenue l'erreur.
      Sinon, il faut faire attention. Vous redéclarez rc; dans la fonction ThreadJoin, ainsi la variable globale est masquée dans cette fonction.
      1. en effet je me suis trompé :
        l'erreur ne viens pas de la fonction threadjoin mias plutot de la fonction Init:

        <code>
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        #include <ctype.h>
        #include <time.h>

        #include "SWIrecAPI.h"
        #include "SWIepAPI.h"

        #define MAX_AUDIO_BUF_LEN 2000
        #define MAX_EP_AUDIO_BUF_LEN 2000
        #define NUM_AUDIO_BUFS 5
        #define MAGIC_WORD 0 /* switch to 1 for magic word demo */

        #ifdef WIN32 /* Windows NT */
        #include <windows.h>
        #include <process.h>

        #define RETURN_TYPE unsigned int

        typedef unsigned int (__stdcall *ThreadFunc)(void* userData);

        #define usleep(x) Sleep(x / 1000)
        #define DEFINE_THREAD_FUNC(funcName, userData) \
        unsigned int (__stdcall funcName)(void *userData)
        #define Thread HANDLE

        SWIrecFuncResult rc;
        SWIrecRecognizer *rec =NULL;
        SWIepDetector *det;
        wchar_t *channelName = L"1";

        int ThreadCreate(Thread* thread, ThreadFunc start_function, void* arg)
        {
        *thread = (Thread)_beginthreadex(NULL, 0, start_function, arg, 0, NULL);
        return 0;
        }

        int ThreadJoin(Thread* thread, void* status)
        {
        int rc;

        switch (WaitForSingleObject(*thread, INFINITE)) {
        case WAIT_OBJECT_0:
        case WAIT_ABANDONED:
        rc = 0;
        break;
        case WAIT_TIMEOUT:
        default:
        rc = 1;
        break;
        }
        CloseHandle(*thread);
        return rc;
        }

        int init(){

        printf ("\n Calling SWIrecInit.\n");
        rc = SWIrecInit(get_sample_baseline_cfg());
        check_rc ("SWIrecInit", rc);

        printf ("\n Calling SWIepInit.\n");
        if(SWIepInit() != SWIep_RESULT_SUCCESS) {
        printf("\n SWIepInit failed\n");

        }

        printf ("\n Calling SWIrecRecognizerCreate.\n");
        rc=SWIrecRecognizerCreate(&rec,NULL,NULL);
        check_rc("SWIrecRecognizerCreate",rc);

        printf ("\n Calling SWIepDetectorCreate.\n");
        rc = SWIepDetectorCreate(&det);
        check_rc("SWIepDetectorCreate",rc);

        printf ("\n Calling SWIrecSessionStart.\n");
        rc = SWIrecSessionStart(rec, channelName, L"");
        check_rc ("SWIrecSessionStart", rc);

        }

        Voila et pour le message d'erreur j'ai que rc undeclared first use this function
        y'a pas autre chose !
        remarque : dans la fonction Init tout les rc sont souligné en rouge dans eclipse
        1. Contributeur
          La fonction init() est-elle dans le même fichier ou dans un fichier à part ?
        2. dans le même fichier
      2. Contributeur
        quel compilateur ? message d'erreur complet.
        Là comme ça il n'y a pas de raison. Il manque peut être une accolade, un ";" ou autre chose.
        essai de compiler ce code :
        int rc;
        void INIT()
        { 
           rc+=1;
        }
        int main()
        {
            rc=5;
            printf("%d\n",rc);
            init();
            printf("%d\n",rc);
            return 0;
        }

        La vrai soumission c'est quand les esclaves s'inquiètent du cours du coton.
        Char Snipeur
        1. j'ai eu 5 et 6 comme résultat : le comportement normal !
      3. bah j'utilise eclipse avec Cygwin ! moi aussi je trouve pas d'erreur je vais essayé de regarder s'il y a un ; qui manque ou autre chose! pourtant c'a étonnerais car éclipse remarque ces erreur d'habitude
        1. Bonjour,

          Je n'ai pas de compilateur sous la main, je ne peux donc pas tester, évite de masquer ta globale rc avec le:
          int rc
          dans ThreadJoin.
          Je ne suis pas sur que ça change grand chose, mais à part ça je ne vois pas d'ou le problème peut venir
          1. :) bah on est deux à ne pas trouver l'erreur
            1. L'erreur est toujours là si tu ne masque pas la variable?
            2. oui carrément !
          2. L'erreur vient peut-être du type de rc, passe "SWIrecAPI.h" et "SWIepAPI.h" au peigne fin
            1. Contributeur
              je te conseille de supprimer des lignes à ton programme, jusqu'à tomber sur le programme minimal qui plante. Ainsi, tu simplifie le problème, et on pourra regarder et tester chez nous.
              1. exactement ça viens de ce petit truc, y a bien un #ifdef , mais j'ai déclarer les variable dedans du coup il le vois pas dans l'autre partie du code.
                Problème résolu merci
                1. Contributeur
                  C'est le problème lorsqu'on ne donne pas le code en entier : on piétine.
                2. :) oui mais le code fait 700 ligne je peux pas tout poster !