2014-07-21 6 views
3

Je travaille sur un projet Keil utilisant c. Dans l'un de mes fichiers, j'ai défini certaines variables en haut comme étant statiques. Je les utilise dans certaines fonctions de ce fichier et je les utilise également dans une déclaration switch/case. Par exemple:variables statiques dans les instructions de commutation

au sommet où les variables sont définies:

static uint8_t* imageData = 0; 
static uint32_t height = 0; 
static uint32_t width = 0; 
static uint32_t stride = 0; 

au milieu du code:

switch (pMsg->MsgId) 
{ 

case WM_CREATE: 
{  
    CAMERA_Init(); 
    AMProcessor *processor = new AMProcessor(); 

    struct block blocks[2] = { 
           {2, 240, 160}, 
           {2, 160, 120}        
          }; 
    processor->initBlocks(blocks, 2);   
    stride = 480; //sample_image.width;         
    processor->Initialize(480, 272, 480, InputTypes::CHROMA_MOBILE, InputTypes::RGB); 
    BSP_LED_Toggle(LED3); 

    while(1){        
     const PictureOutput* picOut = processor->ProcessImage((uint8_t *)CAMERA_FRAME_BUFFER);        
     break; 
    } 
} 

et près du fond, j'ai deux ou trois fonctions qui utilisent également variables Cependant, j'obtiens des avertissements qui me disent que les 4 variables définies en haut sont initialisées mais jamais référencées. Si elles ne sont pas statiques, je n'obtiens pas cet avertissement, mais j'obtiens une erreur de faute matérielle (que j'essaie de me débarrasser).

Donc, ma question est, pourquoi sont-ils pas référencés? Cela a évidemment quelque chose à voir avec la définition statique, mais comment se fait-il que la définition statique ne permette pas de les référencer?

pour la clarification: Je reçois ce message sur chacun d'eux, même foulée. avertissement: # 177-D: variable « imageData » a été déclarée mais jamais référencé

J'ai une fonction au fond qui utilise toutes ces variables qui ressemble à ceci:

bool ReadImageFromPgmFile(const char* pFileName, uint32_t &height, uint32_t &width, uint8_t*& ImgData) { 
    if (pFileName == 0) { 
      return false; 
    }; 

    // read data from file 
    if (strstr(pFileName, ".pgm") || strstr(pFileName, ".PGM")) { 
      FILE *pPgmFile = fopen(pFileName, "r"); 

      if (pPgmFile == NULL) { 
        fprintf(stderr, "Cannot open PGM file '%s'.\n", pFileName); 
        return false; 
      }; 

      char x = fgetc(pPgmFile); 
      char y = fgetc(pPgmFile); 

      if (x != 'P' || y != '5') { 
        fprintf(stderr, "Invalid PGM file '%s'.\n", pFileName); 
        return false; 
      }; 

      uint32_t maxvalue; 
      fscanf(pPgmFile, "%d", &width); 
      fscanf(pPgmFile, "%d", &height); 
      fscanf(pPgmFile, "%d", &maxvalue); 

      if (maxvalue > 255) { 
        fprintf(stderr, "File '%s' has incorrect format.\nOnly 8-bit PGMs are supported by this reader.\n", pFileName); 
        return false; 
      }; 

      ImgData = new uint8_t[width*height]; 
      memset(ImgData, 0, width*height); 
      fgetc(pPgmFile);    // skip new line character 
      uint32_t nPixelsRead = fread(ImgData, 1, width * height, pPgmFile); 
      fclose(pPgmFile); 

      if (nPixelsRead != width * height) { 
        fprintf(stderr, "PGM file '%s' does not contain all pixels.\n", pFileName); 
        return false; 
      }; 

      return true; 
    } 

    return false; 
}; 
+5

Je ne vois pas où vous utilisez ces variables ... – Joe

+0

Je ne peux voir que la "foulée" utilisée. Quel est exactement le message d'erreur que vous obtenez? – Steve

Répondre

1

La déclaration méthode cache les variables height et width statiques.

bool ReadImageFromPgmFile(const char* pFileName, 
    uint32_t &height, 
    uint32_t &width, 
    uint8_t*& ImgData) { 

Utilisation de height et width dans cette méthode se référera aux paramètres locaux et non les variables statiques. Je ne vois aucune référence à imageData, bien qu'un paramètre ImgData soit utilisé. Dans ce contexte, le mot-clé static signifie que les variables ne sont visibles que dans l'unité de compilation dans laquelle elles sont déclarées. La suppression du mot-clé statique en fait une variable globale; accessible par l'ensemble du programme. Le compilateur est incapable (ou ne veut pas) de raisonner sur l'utilisation des globals, donc vous n'obtenez pas les avertissements.

+0

comment se fait-il qu'ils n'étaient pas statiques, ils étaient référencés? et vous avez raison sur imagedata – Dude

+0

@Dude supprimant le 'static' rend les variables globales à votre programme. Réponse mise à jour – Steve

+1

@Dude: Le compilateur fonctionne à la lebel d'une seule unité de traduction - si vous faites des variables globales, le compilateur ne peut pas savoir qu'elles ne seront pas utilisées dans une autre unité de traduction. Si vous les faites globales, utilisez l'optimisation inter-modules puis regardez dans le fichier map, vous verrez que les globals inutilisés auront été supprimés par le linker - mais vous n'obtiendrez pas d'avertissement. – Clifford