C언어, 사용자 자료구조를 초기화할때 데이터형도 함께 지정하게 할수 없을까요?
글쓴이: gurumong / 작성시간: 수, 2009/04/08 - 10:25오전
환형큐를 동적으로 크기를 할당하게 만들고있는데요
이때 데이터형 까지 지정할수 있도록 할수 없을까요?
환형큐를 초기화 하고 데이터를 입출력하는 구조체와 함수들을 잔뜩 만들어놓고
그게 char형에 대해서만 작동한다면...슬픈일이잖아요;
그래서 초기화할때 데이터형도 지정가능하게 할수 없을까 해서요
일딴 생각해둔것은 입출력을 할때 함수가 void*형의 포인터를 반환하고
그 포인터에 대해서 형변환을해서 입출력을 수행하는것인데..
코드도 지저분하고 매번 데이터형을 기억하고 형변환을 해야한다는 귀찬은것도 있구요
다른 방법은 없을까요?
//cirque는 환형큐 구조체 포인트, 데이터형의 바이트 크기도 가지고 있음 cirque_t cirque; init_buffer(cirque, 10, sizeof(int)); *(*int)(put_buffer(cirque)) = data; //입력 data = *(*int)(get_buffer(cirque)); //출력 //많은 괄호가 -_-;
Forums:
음?
씨에는 있는지 모르겠으나
씨쁠쁠에서는 템플레잇을 쓰면 될것같은데염...
으흠...
씨에서는 함수 오버로딩이 안되나요...?
---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.
http://jihwankim.co.nr
여러 프로그램 소스들이 있습니다.
필요하신분은 받아가세요.
Re:
C 언어에서는 답 없습니다.
함수 오버로딩 기능도 없고 하기 때문에 위의 코드처럼 쓰는 수 밖에는 없죠.
Metaprogramming을 해보세요.
Generic Programming이라는 것은 쉬운 게 아닌 것 같습니다. 형식에 대해서 엄격하게 정의하고 그 형식을 포함관계를 만들고 확장할 수 있도록 해야 하니까요. 아예 약한 형식 programming 언어처럼 형식에 대한 안정성은 과감히 programmer에게 책임을 넘겨버리는 방법도 있습니다만...
제가 해보질 않아서 그 경제성은 모르겠습니만... C의 전처리기를 활용한 macro 기능과 source code를 만드는 metaprogramming을 해보시면 다른 방안을 써볼 수는 있겠죠.
물론 둘은 C의 object compile - link 구조와는 어울리지 않죠.
이런것도,
매크로를 써서
#define DECLARE(type) \
init_buffer(cirque, 10, sizeof(type));
#define GET(data, type) \
*(*type)(put_buffer(cirque)) = data;
#define PUT(data, type) \
data = *(*type)(get_buffer(cirque));
하는 방법도 있습죠. C 에서는.
최근에 숙제할 때
최근에 숙제할 때 그런게 필요해서
struct type_handler { cons, decon };
이것처럼 해서 class와 template를 구현했었습니다.
매크로, 없는 함수 몇 개 써주면 java 코드를 무리없이 c로 변환하는게 가능했었습니다...
(읽어가면서 배껴치는 정도...?)
근데 가급적이면 시도하지 마시길 바랍니다 = _=);;;
재활용 불가판정이 나올겁니다...
1. 전통적으로 이런
1. 전통적으로 이런 경우, void *와 size_t를 활용.
2. 때에 따라 union { int type; ... } 꼴도 유용.
3. va_arg()와 같이 (라스코니님의 의견) type name을 인자로 받는 macro 활용.
답은 그때 그때 다르다 정도일까요?
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
타입과 데이터를
타입과 데이터를 포함하는 구조체를 선언하고.. 매크로( My_int 같은맼크로)를 적절히 만들어 이용하면
원하시는데로 될것같습니다.
My_int a;
put_buffer(a);
a = get_buffer();
댓글 달기