C언어, 사용자 자료구조를 초기화할때 데이터형도 함께 지정하게 할수 없을까요?

gurumong의 이미지

환형큐를 동적으로 크기를 할당하게 만들고있는데요
이때 데이터형 까지 지정할수 있도록 할수 없을까요?

환형큐를 초기화 하고 데이터를 입출력하는 구조체와 함수들을 잔뜩 만들어놓고
그게 char형에 대해서만 작동한다면...슬픈일이잖아요;
그래서 초기화할때 데이터형도 지정가능하게 할수 없을까 해서요

일딴 생각해둔것은 입출력을 할때 함수가 void*형의 포인터를 반환하고
그 포인터에 대해서 형변환을해서 입출력을 수행하는것인데..
코드도 지저분하고 매번 데이터형을 기억하고 형변환을 해야한다는 귀찬은것도 있구요
다른 방법은 없을까요?

//cirque는 환형큐 구조체 포인트, 데이터형의 바이트 크기도 가지고 있음
 
cirque_t cirque;
init_buffer(cirque, 10, sizeof(int));
 
*(*int)(put_buffer(cirque)) = data; //입력
data = *(*int)(get_buffer(cirque)); //출력
 
//많은 괄호가 -_-;
bookgekgom의 이미지

씨에는 있는지 모르겠으나

씨쁠쁠에서는 템플레잇을 쓰면 될것같은데염...

으흠...

씨에서는 함수 오버로딩이 안되나요...?

---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.

http://jihwankim.co.nr

여러 프로그램 소스들이 있습니다.

필요하신분은 받아가세요.

kslee80의 이미지

C 언어에서는 답 없습니다.
함수 오버로딩 기능도 없고 하기 때문에 위의 코드처럼 쓰는 수 밖에는 없죠.

winner의 이미지

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 에서는.

JuEUS-U의 이미지

최근에 숙제할 때 그런게 필요해서
struct type_handler { cons, decon };
이것처럼 해서 class와 template를 구현했었습니다.

매크로, 없는 함수 몇 개 써주면 java 코드를 무리없이 c로 변환하는게 가능했었습니다...
(읽어가면서 배껴치는 정도...?)

근데 가급적이면 시도하지 마시길 바랍니다 = _=);;;
재활용 불가판정이 나올겁니다...

cinsk의 이미지

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/

select99의 이미지

타입과 데이터를 포함하는 구조체를 선언하고.. 매크로( My_int 같은맼크로)를 적절히 만들어 이용하면

원하시는데로 될것같습니다.

My_int a;

put_buffer(a);

a = get_buffer();

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.