type을 저장할 수 있나여?

moonzoo의 이미지

예를 들어 다음과 같이 여러개의 structure type이 정의되어 있고

이 structure들이 공통으로 사용할 함수가 다음과 같이 정의되어 있다면

typedef struct
{
...
}A;

typedef struct
{
...
}B;

typedef struct
{
...
}C;

int foo( void * structure, int size, ... );

위와 같은 함수 foo에서 structure을 파라메터로 넘기면서

해당 파라메터의 type도 같이 넘길 수 있는 방법이 없을까요?

foo내부에서는 넘어온 type을 알아야만 합니다.

물론 type의 종류는 수십가지 이상이 될 수도 있는 상황입니다.

아이디어 있으신분 답변 부탁드립니다.

sjpark의 이미지

1. 구조체 처음 n바이트에 ID tag를 두고,
함수에서 받아 볼때 처음 n 바이트만 보고 type을 구별하는 것은 어떨까요?

2. 구조체의 사이즈가 틀리다면, 전달받은 인자의 크기로 구별하는 건 어떨까요
(물론 크기가 고정일때..후후..드물겠죠..=0= )

moonzoo의 이미지

그런식도 생각해 봣는데..

1이 넘어오면 A type이라고 정해야 하는데

소스 내에 임으로 해주긴 그렇고

1 ==> A , 2 ==> B , 3 ==> C structure등과 같이

전역으로 정의할 수 있는 어떠한 방법이 있을지가 가장 궁금합니다.

cdpark의 이미지

struct의 첫번째 컬럼에 공통적인 변수를 두고, 그 값으로 형태를 파악해야 합니다. Xlib의 Widget들이 이런 식으로 설계되어 있습니다. C 함수이면서 여러 종류의 창들에 다형성을 제공하게 됩니다.

그게 싫다면 C++을 쓰셔야죠. :)

doldori의 이미지

원하시는 게 어떤 identifier 같은 거라면 enum을 쓰면 되지 않나요?

typedef enum { TypeA, TypeB, TypeC } StructType;

그리고 각 구조체는 StructType형 멤버를 갖고 있으면 되겠죠.

sjpark의 이미지

moonzoo wrote:
그런식도 생각해 쨏ㅉㅐㄿㅂㅘㅅ는데..

1이 넘어오면 A type이라고 정해야 하는데

소스 내에 임으로 해주긴 그렇고

1 ==> A , 2 ==> B , 3 ==> C structure등과 같이

전역으로 정의할 수 있는 어떠한 방법이 있을지가 가장 궁금합니다.

코딩 할 때 어떤 타입이 올지 예상하지 못하는건가요?

// 어떤 프로그램인가요?

typedef struct _A {
   int i;
   ...
} A;
...

typedef struct _gen {
   int i;
   ... // 나머진 구조체들의 공통부분
   char extra[]; // 각각 구조체들이 가질 수 있는 특수부분을 처리하기 위해..
} generic;

반환타입 function(void *구조체, 크기, ...)
{
   generic *temp;
   예상가능 구조체 임시 변수 모두 선언 // ...
   temp = (generic *)구조체;
   switch(temp->id) {
       case 종류 :  맞게 형 변환; 알맞게 사용..
       ...    
   }
}

아예 extra부분을 이용해서 포인터 쓰듯이 직접 접근해서 하는 방법도 있겠네요

함수에서 모든 구조체의 어떤 부분을 접근 하는가요?
모든 필드를 접근하게되나요?
공통된 점이 없나요?

특정 필드만 접근 해도 되는 경우라면,
각각의 구조체에서 특정 필드의 위치를 동일하게 해서 접근 할 수도있겠네요
그럼 형 변환 시킬 필요도 없겠네요.

정확히 어떤 프로그램인지, 무슨일을 해야 하는지 알려주시고, 코드도 보여주신다면

성심성의껏(?) 답변해 드리도록 노력(?) 해 보겠습니다.

// 정확히 어떤 건지 몰라서....
// 어디가 끝인줄 모르고...
// 계속 상상만 해요...

moonzoo의 이미지

음..foo에서 파라메터로 넘어온 type을 이용해서

동일한 type의 새로운 변수를 만들까 생각했는데..

이론적으로 안될꺼 같습니다.

암튼 여러 모로 생각이 짧았던 듯.

답변 주신 분께 죄성. 및 감사합니다.

ㅡ,.ㅡ;;의 이미지

moonzoo wrote:
예를 들어 다음과 같이 여러개의 structure type이 정의되어 있고

이 structure들이 공통으로 사용할 함수가 다음과 같이 정의되어 있다면

typedef struct
{
...
}A;

typedef struct
{
...
}B;

typedef struct
{
...
}C;

int foo( void * structure, int size, ... );

위와 같은 함수 foo에서 structure을 파라메터로 넘기면서

해당 파라메터의 type도 같이 넘길 수 있는 방법이 없을까요?

foo내부에서는 넘어온 type을 알아야만 합니다.

물론 type의 종류는 수십가지 이상이 될 수도 있는 상황입니다.

아이디어 있으신분 답변 부탁드립니다.

옛날에 저랑 비슷한고민을 하시는군요..ㅎㅎ 안되더군요..

타입을 건네줄수가 없으며 컴파일후에 변수가 생성될수 없습니다.


----------------------------------------------------------------------------

운형의 이미지

데이터의 성격에 따라서는 공용체로 해결하실 수 있는 문제일 수도 있을 거 같네요..

Do you think that's the air you are breathing now?

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.