2013-04-12 3 views
1

동일한 함수 내에서 선언 한 위치에 따라 다르게 동작하는 변수가 있습니다. 나는 무슨 일이 일어나고 있는지 알고 싶다.변수의 선언 위치에서 값이 변경되지 않는 이유를 설명합니다.

이 함수에는 무엇이 일어나고 있는지를 설명하기 위해 다른 결과를 산출하는 두 위치에 변수 선언과 초기화가 포함되었습니다. 프로그램을 실행할 때 변수를 두 번 선언하지 않고 어느 위치에서든 한 번만 선언합니다. N 개의이나 온도가 어느 변경된 경우 I는 다른 값을 얻는 이유는 가변 온도 참조

, 난 시나리오 1 시나리오 2

C 함수

int main(int argc, char* argv[]) 
    { 
     // ensure proper usage 
     if (argc != 4) // we need four arguments 
     { 
      printf("Usage: copy infile outfile\n"); 
      return 1; 
     } 

     // remember filenames 
     char* infile = argv[2]; 
     char* outfile = argv[3]; 

     // the factor 
     int n = argv[1][0] - '0'; 

     // SCENARIO 1) HERE HERE HERE HERE THIS IS THE VARIABLE I AM DISCUSSING!!!!!!! 
->  int temp = n; // WHEN DECLARED HERE AND INITIALIZED AT TIME OF CREATION 
         // gdb displays its value equal to the value of n 


     // open input file 
     FILE* inptr = fopen(infile, "r"); 
     if (inptr == NULL) 
     { 
      printf("Could not open %s.\n", infile); 
      return 2; 
     } 

     // open output file 
     FILE* outptr = fopen(outfile, "w"); 
     if (outptr == NULL) 
     { 
      fclose(inptr); 
      fprintf(stderr, "Could not create %s.\n", outfile); 
      return 3; 
     } 

     // read infile's BITMAPFILEHEADER 
     BITMAPFILEHEADER bf; 
     fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr); 

     // read infile's BITMAPINFOHEADER 
     BITMAPINFOHEADER bi; 
     fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr); 

     // ensure infile is (likely) a 24-bit uncompressed BMP 4.0 
     if (bf.bfType != 0x4d42 || bf.bfOffBits != 54 || bi.biSize != 40 || 
      bi.biBitCount != 24 || bi.biCompression != 0) 
     { 
      fclose(outptr); 
      fclose(inptr); 
      fprintf(stderr, "Unsupported file format.\n"); 
      return 4; 
     } 

     //gdb break to check the previous values 


     // SCENARIO 2) HERE HERE HERE HERE THIS IS THE VARIABLE I AM DISCUSSING!!!!!!!! 
->  int temp = n; // WHEN DECLARED HERE AND INITIALIZED THE VARIABLE HERE 
         // gdb displays its value equal to 0 and not n 

     // write outfile's BITMAPFILEHEADER 
     fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, outptr); 

     // write outfile's BITMAPINFOHEADER 
     fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, outptr); 

     // determine padding for scanlines 
     int padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4; 

     //gdb break to check the new values 

     // iterate over infile's scanlines 
     for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++) 
     { 
      // iterate over pixels in scanline 
      for (int j = 0; j < bi.biWidth; j++) 
      { 
       // temporary storage 
       RGBTRIPLE triple; 

       // read RGB triple from infile 
       fread(&triple, sizeof(RGBTRIPLE), 1, inptr); 

       // write RGB triple to outfile 
       fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr); 
      } 

      // skip over padding, if any 
      fseek(inptr, padding, SEEK_CUR); 

      // then add it back (to demonstrate how) 
      for (int k = 0; k < padding; k++) 
       fputc(0x00, outptr); 
     } 

     // close infile 
     fclose(inptr); 

     // close outfile 
     fclose(outptr); 

     // that's all folks 
     return 0; 
    } 

댓글 한 코드별로?

+0

변수를 2 번 선언 하시겠습니까? –

+1

@llmo Euro 내가 내 질문에서 언급했듯이 "프로그램을 실행할 때 두 번 변수를 한 번만 두 번 선언하지 않고 왜 다른 결과를 얻는 지 파악하려고합니다." – IberoMedia

+2

확인. 어떤 시점에서 '임시'를 검사합니까? 두 경우 모두 초기화 직후입니까? –

답변

0

코드를 이해하면 초기화 후 temp 또는 n을 읽지 않을 것입니다. 두 번째 경우에는 컴파일러가 (최적화 수준에 따라) 알아 낸 것을 제거 할 수 있습니다.

+0

내 삭제 된 답변에서도 그렇게 생각했지만 시나리오 1에서 프로그래머가 올바르게 작동하는 이유는 무엇입니까?!? –

+0

'n'은 case 1에서 설정되었습니다. 아마도 최적화 창은 앞뒤로 몇 문장을 "볼"수있을만큼 작습니다. – ldav1s

+0

최적화가'main' 함수를 최적화 창으로 사용할 정도로 공격적이라면'temp'와'n'을 모두 쓰기 전용 변수로 삭제할 수 있습니다. – ldav1s

관련 문제