for 반복문 내의 여러 변수 저장

게시판 IDL Q&A for 반복문 내의 여러 변수 저장

이 게시글은 8개 답변과 3명 참여가 있으며 마지막으로  Sangwoo에 의해 2 일, 15 시간 전에 업데이트 됐습니다.

  • 글쓴이
  • #5654 답변

    세진 임
    회원

    안녕하세요 IDL을 막 사용하기 시작한 초보 대학원생입니다.
    블로그와 IDL user group에서 많은 정보를 얻으며 공부하고 있어 유저분들께 너무 감사합니다.

    질문은 변수저장에 관한 간단한 질문이지만 초보라 막혀 헤메고 있습니다.

    190910_1.tif
    190910_2.tif
    190910_3.tif

    와 같은 파일을 가지고 있고 readtiffstack.pro이라는 tif 파일을 읽어 3차원 변수로 저장하는 프로시져가 있다고 할때
    a1=readtiffstack(‘190910_1.tif’)
    a2=readtiffstack(‘190910_2.tif’)
    a3=readtiffstack(‘190910_3.tif’)

    이런 식으로 변수 a1, a2, … a40 까지 변수공간에 저장을 하고 싶습니다.

    PRO test
    FOR i=1,40 DO BEGIN
    IF (i ge 10) THEN BEGIN
    rtf=’a’+STRING(i,format='(I2)’)+’=readtiffstack(”190910_’+STRING(i,format='(I2)’)+’.tif”)’
    result=execute(rtf)
    ENDIF ELSE BEGIN
    rtf=’a’+STRING(i,format='(I1)’)+’=readtiffstack(”190910_’+STRING(i,format='(I1)’)+’.tif”)’
    result=execute(rtf)
    ENDELSE
    ENDFOR
    END

    지금 짜논 프로시져가 컴파일은 되는데 변수가 생성이 안됩니다. 이유가 뭘까요?

  • #5655 답변

    ChoiYoun
    회원

    프로그램에서 별다른 문제는 보이지 않습니다. 실행했을 때 출력되는 오류 메세지는 없을까요.

    ps. rtf 변수를 아래와 같이 수정하면 IF문이 필요없습니다.
    rtf=’a’+STRING(i,format='(I0)’)+’=readtiffstack(“190910_’+STRING(i,format='(I0)’)+’+tif”)’

    • #5656 답변

      세진 임
      회원

      네 컴파일 되고 실행하면 loaded DLM: TIFF 뜨고 변수공간에는 아무것도 안생깁니다.
      IF문 수정은 감사합니다!!

  • #5657 답변

    Sangwoo
    회원

    일단 readtiffstack이라는 기능은 IDL에서 기본적으로 제공되지 않습니다. 해당 파일명이 readtiffstack.pro인 것으로 봐선 아마도 외부에서 가져와서 사용중이신 IDL 프로그램인 것으로 보입니다. 제 어림 짐작으로는 아마도 TIFF 파일을 읽는 기능을 수행하는 IDL 내장함수인 READ_TIFF를 내부적으로 사용하고 있지 않을까 추측은 됩니다. 어쨌든 원래 하셨던 것처럼 EXECUTE를 사용하지 않고, 다음과 같이 그냥 일반적인 방식으로 사용했을 경우에도 작업이 정상적으로 수행되는지를 먼저 확인해보는 것이 좋을 것 같습니다.

    a1=readtiffstack(‘190910_1.tif’)

    언급하신 것과 같은 에러 메시지는 읽고자 하는 파일을 제대로 찾지 못했을 때 주로 발생합니다. 예를 들어 TIFF 파일을 읽는 기능을 수행하는 IDL 내장 루틴인 READ_TIFF 함수를 사용하는 상황에서, 만약 읽고자 하는 파일을 제대로 찾지 못했을 경우 다음과 같은 에러가 발생합니다. 여기서는 ‘my_tif.tiff’라는 파일이 실제로는 존재하지 않는 상태에서 실행하였습니다.

    IDL> img = read_tiff(‘my_tif.tiff’)
    % Loaded DLM: TIFF.
    % READ_TIFF: my_tif.tiff: Cannot open

    따라서 혹시라도 이와 비슷한 에러가 발생했을 경우라고 한다면, 읽고자 하는 TIFF 파일들을 프로그램이 혹시 제대로 못찾는 상황인지 여부를 먼저 확인해보시길 권장합니다.

    • 이 답변은  Sangwoo에 의해 6 일, 10 시간 전에 수정됐습니다.
    • #5659 답변

      세진 임
      회원

      일단 답변 감사합니다. 말씀하신 대로 READ_TIFF 함수가 내장이 되어있습니다.

      하지만
      IDL> a1=readtiffstack(‘190910_1.tif’) 로 해도 실행이 잘 되고

      IDL> rtf=’a’+STRING(1,format='(I1)’)+’=readtiffstack(”190910_’+STRING(1,format='(I1)’)+’.tif”)’
      IDL> result=execute(rtf)

      위와 같이 반복문에 들어가는 함수로 직접 i=1을 대입하고 해 봐도 BYTE[1280,960,1779] 형식의 변수 a1이 잘 생성됩니다.

      위의 유저분께서 말씀해주신 대로 I0 연산자로 바꾸고 내장되어 있는 READ_TIFF 함수를 써봐도

      PRO test
      FOR i=1,2 DO BEGIN
      rtf=’a’+STRING(i,format='(I0)’)+’=read_tiff(”190910_’+STRING(i,format='(I0)’)+’.tif”)’
      result=execute(rtf)
      ENDFOR
      END

      컴파일되고 실행은 잘 되고 오류도 안뜹니다. 하지만 변수가 생성이 되지 않고 종료됩니다. tif 파일은 분명 설정 디렉토리 내에 존재합니다.
      while문으로 바꾸어 실행해보는게 도움이 될까요?

  • #5660 답변

    ChoiYoun
    회원

    질문자님 답변으로 미루어보았을 때 제작한 프로그램이 정상적으로 작동하고 “종료”되어 변수공간에 아무 변수도 남지 않는 것이 아닐까란 생각을 해보았습니다.

    프로그램에서 생산한 변수를 확인하기 위해서는 프로그램이 종료되기 전에 멈추는 과정이 필요합니다. 아래와 같이 코드를 변경하고 실행한 후 변수공간을 확인해보시면 변수가 생성되어있을 것 같습니다.

    PRO test
    FOR i=1,40 DO BEGIN
    rtf=’a’+STRING(i,format='(I0)’)+’=readtiffstack(”190910_’+STRING(i,format='(I0)’)+’.tif”)’
    result=execute(rtf)
    ENDFOR
    STOP
    END

    • 이 답변은  ChoiYoun에 의해 5 일, 19 시간 전에 수정됐습니다.
  • #5662 답변

    Sangwoo
    회원

    그러면 처음에 언급하셨던 loaded DLM: TIFF 에러는 이제는 더 이상 발생하지 않는건가요? 그렇다면 별 문제 없이 작업이 진행되고 a1, a2와 같은 항목들이 생성되는 것이 정상입니다. 다음과 같이 HELP 명령을 사용하여 이들의 존재를 확인해볼 수 있습니다.

    PRO test
    FOR i=1,2 DO BEGIN
    rtf=’a’+STRING(i,format='(I0)’)+’=read_tiff(”190910_’+STRING(i,format='(I0)’)+’.tif”)’
    result=execute(rtf)
    ENDFOR
    HELP, a1, a2
    END

    이렇게 HELP 명령을 삽입한 상태로 프로그램을 실행했을 때 a1, a2에 관한 정보가 출력되는지 확인해보시기 바랍니다. 만약 a1, a2 항목에 대한 정보(배열 구조 및 배열 내 값들의 자료형)가 제대로 출력된다면 프로그램이 정상적으로 작동하는 것입니다. 다만 한가지 덧붙인다면 위와 같은 프로그램에서 생성되는 a1, a2 등의 항목들이 존재하는 영역은 프로그램의 메모리 영역입니다. 이 영역은 IDL 인터페이스의 변수감시창에서 나타나는 메모리 영역과는 완전히 별개입니다. 처음 질문하실 때 “변수공간”이라는 용어를 사용하셨는데 혹시나 IDL 인터페이스의 변수감시창을 뜻하고자 하셨던 것은 아니었는지 궁금합니다.

    • #5663 답변

      세진 임
      회원

      네 loaded DLM: TIFF 에러는 발생하지 않습니다.

      말씀해주신 대로 HELP문을 넣어봤더니 a1, a2 정보가 정상적으로 잘 출력됩니다. 제가 메모리 영역과 변수감시창 영역이 별개라는 개념을 몰랐던 것 같습니다. 변수공간이라고 했는데 변수감시창을 뜻하는 것이 맞습니다.

      프로그램이 잘 실행되고 메모리 영역에 a1, a2가 존재하는 것을 HELP를 통해서 확인했는데 이 a1, a2를 변수감시창에 저장하고 싶습니다. 혹시 어떤 방법이 있을까요?

    • #5664 답변

      Sangwoo
      회원

      말씀하신 “변수감시창에 저장한다”는 것은 a1, a2와 같은 항목들이 “변수감시창에서도 보이도록 한다”는 것과 마찬가지 의미입니다. 그런데 이미 말씀드린 것처럼, 프로그램 영역의 메모리와 변수감시창 영역의 메모리는 서로 별개입니다. 만약 두 영역이 서로 만나게끔 하려면 두가지 정도의 방법이 있습니다. 첫번째 방법은 위에서 ChoiYoun님께서 올리신 댓글에서 언급된 바와 같이 프로그램 내에 STOP 명령을 넣어주고 실행하는 것입니다. 그러면 프로그램이 실행되다가 STOP 명령 부분에서 중단되고, 이 때 프로그램 영역의 항목들이 변수감시창 영역에서도 보이게 됩니다. 두번째 방법은 프로그램의 제목 부분을 비활성화시킨 채 실행하는 것입니다. 제가 이전 댓글에서 적어놓았던 코드의 내용을 다음과 같이 수정하여 실행하는 방법입니다.

      ;PRO test
      FOR i=1,2 DO BEGIN
      rtf=’a’+STRING(i,format='(I0)’)+’=read_tiff(“190910_’+STRING(i,format='(I0)’)+’.tif”)’
      result=execute(rtf)
      ENDFOR
      HELP, a1, a2
      END

      물론 이 내용이 담긴 코드 파일은 여전히 test.pro가 되겠지만, PRO로 시작되는 제목 부분을 이와 같이 주석처리한 상태로 실행하면, 프로그램 내에서 생성되는 a1, a2와 같은 항목들이 변수감시창 영역에서 바로 나타나게 됩니다.

'for 반복문 내의 여러 변수 저장'에 답변달기
글쓴이 정보: