728x90
사용방법

프로프레임 스튜디오는 이클립스 기반으로 만들어 졌다. 따라서 이클립스의 기능을 잘 활용하면 편하게 코딩할 수 있다.  예를 들어서 코드 편집창에서 아래와 같이 pfmstr까지만 입력하고 Ctrl-Space 를 누를 경우 미리 등록되어 있는 예약어 중에서 pfmstr 로 시작되는 것을 검색하여 팝업으로 보여주는 기능이 있다. 특히 프로프레임의 경우 유틸리티 함수도 많고 이름도 길어서 일일이 외우기 어렵기 때문에 이렇게 찾아서 사용하면 개발에 많은 도움이 된다.  참고로 프로프레임의 제공되는 유틸리티는 크게 pfmStr~, pfmDate~, pfmNum~, pfmIs~의 유형으로 크게 분류된다.
사용자 삽입 이미지

등록하기

이렇게 사용하기 위해서는  유틸리티 함수를 미리 등록을 해 놓아야 한다. 이것은 프로프레임 스튜디오의 메뉴의  환경설정->C/C++ -> Editor -> Template 메뉴에서 등록할 수 있다.
사용자 삽입 이미지
이미 등록되어 있는 템플릿을 선택한 다음 편집 버튼을 클릭하면 아래와 같이 편집 화면이 나온다. 여기서 자기가 넣고 싶은 이름으로 바꾼다음 저장 하면 새로운 템플릿이 하나 추가된다. 그러나 개인이 일일이 그 많은 함수를 등록하는 것은 인내심을 필요로 한다.

사용자 삽입 이미지

내보내기/가져오기

일일이 개인이 저마다 이런 것을 직접 모두 등록해야 한다면 일이 많을 것이다. 한 명이 등록하고 그것을 일괄 "내보내기" 기능을 이용하여 xml 파일로 떨어뜨리고 이것을 "가져오기" 기능을 이용해서 일괄 등록해서 사용하는 것이 나을 것이다. 일일이 직접 넣기 귀찮은 사람들은 아래 첨부파일을 다운 받아서 로컬pc에 저장해 놓은 다음 스튜디오의 위 메뉴에서 "가져오기" 해서 사용하면 된다. 더 필요한 함수가 있다면 알아서 직접 추가하거나 고쳐서 사용하면 된다. 본 첨부파일은 티맥스소프트의 정세윤 전임이 수고해서 만들어 준 파일임을 밝혀 둔다..

출처 : http://pangate.com/91


728x90

컴파일 하다가 이런 오류를 만났는가? 그렇다면 고생 좀 하겠네요.

 BASENAME = [sfee2106a]
 rm -f core sfee2106a.o libsfee2106a.so
 cc        -DORACLE  -qlanglvl=extc99 -g -q64 -qinfo=pro -brtl -O0 -qcpluscmt -D_SM.
 "sfee2106a.c", line 485.13: 1506-162 (W) No definition was found for function
  c000_biz_main_proc. Storage class changed to extern.
 "sfee2106a.c", line 487.13: 1506-046 (S) Syntax error.
 make: 1254-004 최종 명령에서의 오류 코드는 1입니다.


 정지.
 Compile Error!!

 ====> 완료 ExitCode = [1]

조치방법 :

이런 오류가 날 경우는 c000_biz_main_proc 함수의 선언에서 문법에 맞지 않다는 말인데 함수의 문법이라야 괄호 열고 닫는 거 외에는 별게 있으랴. 즉 열고 닫은  괄호의 개수가 맞지 않기 때문이다.  괄호를 열고 안 닫은 것이 있는지 짝을 맞추어 보아야 한다. 아니면 괄호를 열지 않고 닫기만 했던가.

츨처 : http://pangate.com/81

728x90

PFM_TRY 는 프로프레임에서 가장 빈번히 사용되므로 정확한 이해가 필요하다. PFM_TRY 는 원래 프로프레임 1.0 에서는 SYS_TRY 였고 2.0 에서는 PSC_TRY 였다. 오늘의 PFM_TRY 를 사용하게 된 것은 신한은행 차세대 프로젝트를 하던 3.0 부터 이다.  자바와 같은 OOP 객체지향 프로그램에서 흔히 사용하는 try  .. catch 를 흉내낸 것이지만 나름대로 훌륭한 역할을 해 내고 있다.

1. 정의

PFM_TRY 는 pfmLogMacro.h 에 다음과 같이 정의되어 있다.

#ifndef _PFM_NO_TRYLOG
#define PFM_TRY(
_Ftn
)                                                             \
        do {                                                                        \
            struct timeval s_time_val;                                              \
            long _db_chk;                                                           \
            _db_chk = _pfmDbCheckAndTryLog('T', "AP", __FILE__, __func__, __LINE__);\
            if (_db_chk == RC_ERR)                                                  \
                _pfmTryStart( __FILE__, __func__, __LINE__, &s_time_val, #_Ftn, 0); \
           
rc = _Ftn
;                                                              \
            if (_db_chk == RC_ERR)                                                  \
                _pfmTryEnd( __FILE__, __func__, __LINE__, &s_time_val, #_Ftn, rc);  \
           
if( rc != RC_NRM) goto PFM_CATCH
;                                       \
        } while (0)

#define PFM_TRYNJ( _Ftn )                                                           \
        do {                                                                        \
            struct timeval s_time_val;                                              \
            long _db_chk;                                                           \
            _db_chk = _pfmDbCheckAndTryLog('T', "AP", __FILE__, __func__, __LINE__);\
            if (_db_chk == RC_ERR)                                                  \
                _pfmTryStart( __FILE__, __func__, __LINE__, &s_time_val, #_Ftn, 0); \
            rc = _Ftn;                                                              \
            if (_db_chk == RC_ERR)                                                  \
                _pfmTryEnd( __FILE__, __func__, __LINE__, &s_time_val, #_Ftn, rc);  \
        } while (0)
#else
#define PFM_TRY( _Ftn )
#define PFM_TRYNJ( _Ftn )
#endif


정의에서 볼 수 있듯이 입력된 함수를 그대로 수행한 다음에 그 결과 리턴되는 값에 따라서 분기를 한다. 정상(RC_NRM) 이 리턴될 경우에는 그냥 밑으로 흘러 내리고 그 외의 값으로 리턴될 경우에는 PFM_CATCH 로 jump 하는 단순한 역할이다.   따라서 PFM_TRY 를 사용하였다면 반드시 동일한 BLOCK 내에 PFM_CATCH 라는 라벨이 존재해야 한다. 함수를 호출하기 전 후에는 함수의 입구, 출구를 로그로 남겨주고 있다. 

이 매크로를 do ... while 로 묶어 놓은 것은 PFM_TRY() 뒤에 ; 을 반드시 찍도록 하기 위한 목적이다. do ... while 로 싸지 않았다면 ; 없이 PFM_TRY 를 사용해도 컴파일시 오류가 나지 않으므로 프로그램을 표준화할 수 없다. 어떤 것은 ; 으로 끝나고 어떤 라인은 ; 이 없다면 혼란스러울 수 있다.

반면에 PFM_TRYNJ 는 함수를 수행한 후에 리턴 값에 상관없이 무조건 아래로 흘러 내려간다. goto PFM_CATCH 가 없는 것만 다르다.

PFMTRY [a000_init_proc(context)               ] 입구
PFMTRY [a000_init_proc(context)               ] 출구 RC [0] TIME [00.000032]
PFMTRY [b000_inputvalid_proc(context)         ] 입구
PFMTRY [b000_inputvalid_proc(context)         ] 출구 RC [0] TIME [00.000013]
PFMTRY [c000_main_proc(context)               ] 입구
PFMTRY [c100_fex_commbuf_create(context)      ] 입구
PFMTRY [pfmDlCall1("pfmApLog", &pfmApLog_io)  ] 입구

PFM_TRY 를 빠져 나올 때 해당 구간의 수행시간을 같이 LOG에 남겨준다. 이 시간은 PFM_TRY 입구 부터 출구 까지의 수행 시간이다. 이것을 이용하여 어느 구간에서 수행시간이 많이 걸렸는지 체크할 수 있다.

출처 : http://pangate.com

+ Recent posts