프로그램 제작시, 에러 코드 할당 관련 질문입니다.
음...
제목 적는게 왜 이렇게 힘든지...
나날이 어휘력이 떨어짐을 느끼고 있습니다.
에.
그래서요.
상황을 설명드리면...
프로그램을 만들잖아요?
그럼, 각 상황에 따라 에러 코드가 발생하지요?
음... 프로그램을 잘 못 짜서 발생하는 에러가 아니고,
[이러이러한 상황은 에러다] 라고 인위적으로 정의한 상태를 말하는 겁니다. 예를들면 입력값이 1-10까지만 있도록 해서, 11이 입력으로 들어오면 "에러다!" 라는 식이죠.
기본적으로 모든 함수가 int형 return값을 가지도록 할 생각인데요. 문제는, 당연하겠지만 모든 함수가 다 다른 에러값을 가져야 한다는 겁니다.
음.... 제가 봐도 글이 잘 ... -_-;; 코드로 설명합죠.
int fna()
{
if (errorstate) return -2;
};
int fnb()
{
if (errorstate) return -3;
};
int fnb()
{
if (errorstate1) return -4;
if (errorstate2) return -5;
};
int main()
{
fna();
fnb();
fnc();
}
뭐.... 이런 식이 되겠네요.
포인트는, [프로그램 안에서 쓰이는 모든 함수가, 다 다른 리턴 값을 가지도록 하는 방법] 에 대한 질문입니다.
(아... 코드 쓰고 나서 정리하니까 잘되네요?? 새로운 발견... ^^)
일단 가장 단순히 생각해 본게, DEFINE에 각각의 에러 값을
#define FNnameERRORNo 1
처럼 정해서, 각각의 함수에 대해 모든 값을 선언해 놓는 건데요.
그렇게 해 버리면 중간에 함수를 바꾸던가 생성하면 그때마다 값을 추가해 줘야 하잖아요. 사람이 일일이 쓰니까 값이 겹칠지도 모르구요.
그러지 않고, 뭔가 자동화 할 수 있는 방법은 없을까요?
아. 글구요. 리턴값으로 음수만 할 수 있나요?
정 안되면 emum 써볼까 했는데, 이거 보니까 값이 1부터 시작하더라구요.
C로 만들고 있는데.... 좋은 아이디어나, 고견 있으신 분(아..같은소린가. -_-; ) 답변 부탁드립니다.
그럼... 행복하세요.
Re: 프로그램 제작시, 에러 코드 할당 관련 질문입니다.
에러 상황에는 특정한 변수를 설정하고 invalid한 값만 반환한 뒤 사용자가 그 변수를 읽을 수 있게 하는 방법(예를 들어서, SDL의 경우 SDL_SetError와 SDL_GetError 함수)을 많이 본 것 같습니다.
그리고 enum에 들어 가는 각각의 item에는 숫자 값을 줄 수 있습니다. 예를 들어서 enum { A = -8, B, C, D = 0, E } 식으로 한다면 -8, -7, -6, 0, 1이 할당되겠죠.
- 토끼군
이런 방법은 어떨까요?
만들어 본건 아니고, 머리로만 생각해 본 건데요.
자동화 하는 방법이 대충 두가지 정도 머리에 떠오르더군요.
프로그램 시작할때 Init함수가 있는데, 거기서 프로그램 시작에 필요한 변수 설정등을 합니다.
거기에서...
1. 댓글 주신 거 보고 생각해 봤는데요,
간단히, int SetError( char *) / int GetError( char *) 를 만들고, SetError는, 해당 문자열을 에러 테이블에 등록하고, 등록할 때 문자열에 대해 -1에서부터 1씩 감소하는 index를 자동으로 부여하게 하면 어떨까요? GetError는 물론 문자열 기준으로 검색해서, 문자열에 해당하는 인덱스를 반환하게 하는 거죠.
이렇게 하면, 초기에 자기가 만든 함수만 전부 등록해 주고, 이름 규칙만 지키면 비교적 간단히 만들 수 있겠는데요.
문제는 메모리죠. 전부 텍스트니까.... -_-; 뭐, 많다면 많고 적다면 적은 용량이지만, 대충 한 함수당 30byte(이름+ 4byte int )라고 잡으면 , 함수 100개당 3kbyte... 흠...
2. int SetError( void *, int type), int GetError(void *, int type) 로 만들구요.
에러 테이블에 등록할 때, 등록 기준이 문자열이 아니라, 함수 포인터라면 , 하나의 함수에 12byte( 함수 포인터 4byte + type 4byte(같은 함수에 두개 이상의 에러 코드가 필요한 경우도 있음) + return value int)니까 , 메모리는 더 절약할 수 있을 듯 한데요.
문제는, 이렇게 해 버리면 함수 포인터이기 때문에, 프로그램 시작시마다 바뀌는 어드레스를 다룰 수가 없다는 거죠. -_-;;;;;
흠... 뭔가 다른 방법이 있을 듯 한데...
emum은... 역시, 번호를 자동 부여한다는 것 이외에는 메리트가 없으니, 되도록 안 쓰고 싶은데 말이죠....
....
........
............
음........
뭔가 방법이 있을 것 같은데....
답변 주신 [토끼군]님. 감사합니다. ^^
댓글 달기