2014-07-21 11 views
3

나는 Keil 프로젝트에서 c를 사용하여 작업 중이다. 내 파일 중 하나에서 맨 위에있는 일부 변수를 정적으로 정의했습니다. 이 파일의 일부 기능에서 사용하고 switch/case 문에서도 사용합니다.switch 문에서 정적 변수

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

코드의 중간에 :

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; 
    } 
} 

및 하단 나는 또한이를 사용하는 함수의 몇이 변수가 정의되어 있습니다 상단에

: 예를 들어, 변수. 그러나 맨 위에 정의 된 4 개의 변수가 초기화되었지만 참조 된 적이 없다는 경고가 나타납니다. 그들이 정적이 아니라면 나는이 경고를 얻지 못한다. 그러나 나는 (나는 제거하려고 노력하고있는) 하드 오류 오류를 얻는다.

내 질문은 왜 이들이 참조되지 않는 것입니까? 정적 정의와는 분명히 관련이 있습니다. 그러나 정적 정의는 어떻게 참조 될 수 있습니까?

설명 : 나는이 메시지를 모두 보았습니다. 경고 : # 177-D : 변수 "imageData의"는 선언하지만이처럼 보이는이 모든 변수를 사용하여 하단의 기능이

를 참조 적이 :

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

나는 그 변수를 어디에서 사용하고 있는지 보지 않고있다 ... – Joe

+0

나는 단지'stride' 만 사용되는 것을 볼 수있다. 정확히 무엇이 오류 메시지입니까? – Steve

답변

1

방법 선언 가죽을 정적 인 heightwidth 변수 이 방법에서는 heightwidth

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

사용은 지역 파라미터 아닌 정적 변수를 참조 할 것이다. 사용 된 ImgData 매개 변수가 있지만 imageData에 대한 참조를 볼 수 없습니다.

여기서 static 키워드는 변수가 선언 된 컴파일 단위에서만 볼 수 있음을 의미합니다. 정적 키워드를 제거하면 전역 변수가됩니다. 전체 프로그램에서 액세스 할 수 있습니다. 컴파일러는 전역 사용에 대해 추론 할 수 없으므로 경고를받지 못합니다.

+0

그들이 정적이 아니었을 때 어떻게 왔습니까? 그리고 당신은 imagedata에 대해 맞습니다. – Dude

+0

@Dude는'static'을 제거하면 변수를 프로그램에 전역 적으로 만듭니다. 답변이 업데이트되었습니다. – Steve

+1

@Dude : 컴파일러는 단일 번역 단위에서 작동합니다. 변수를 전역으로 설정하면 컴파일러는 다른 번역 단위에서 사용되지 않는다는 것을 알 수 없습니다. 글로벌하게 만들면 모듈 간 최적화를 사용하여 맵 파일을 보면 링커가 사용하지 않는 전역을 제거 할 것입니다. 그러나 경고를 얻지는 못합니다. – Clifford

관련 문제