여러 구조체에서 하나의 구조체를 공유하도록 하는 방법

ShaYEL의 이미지

사용 언어는 C입니다

구조체 타입 A와 B가 있는데, A는 여러개고 B는 딱 하나입니다.
모든 A 구조체들은 B 구조체를 자기 자신에 포함시키고 있어야 하고, 하나의 A 구조체가 B에 접근해서 값을 수정하면 다른 A 구조체들도 수정된 값을 얻도록 해야 합니다.

또 이런 구조상에서 "새로운 A를 생성하는 함수"를 구현해야 하는데요, 이 함수는 B에 직접 접근할 수는 없습니다. 즉 다른 A의 B값에 접근해서 생성해야 합니다.

저는 아래같은 방법을 생각해 보았는데요, 맞는 방법인지 확신이 없어서 질문 드립니다.

struct A
{
    int member1;
    struct X member2;
    struct B *b;
};
 
struct B
{
    int member3;
    struct Y member4;
};
 
struct A *create_A()
{
    struct A *a = (struct A *) malloc (sizeof (struct A));
    a->member1 = /*알아서 초기화*/;
    a->member2 = /*알아서 초기화*/;
 
    if (다른 A가 한 개도 없음)
    {
        a->b = (struct B *) malloc (sizeof (struct B));
        a->b->member3 = /*알아서 초기화*/;
        a->b->member4 = /*알아서 초기화*/;
    }
    else  /* 다른 A가 있는경우 */
    {
        a->b = (다른 A)->b;
    }
 
    return a;
}

이렇게 하면 한 A가 B를 수정했을 때 다른 A도 수정된 값에 접근할 수 있나요?

익명 사용자의 이미지

B가 하나라면 멤버가 될 필요가 없죠 전역으로 쓰세요

ShaYEL의 이미지

아뇨 사실은 B도 여러개가 있는데 간단히 질문하려고 이렇게 쓴거라서요... 전역변수로는 못해요

익명 사용자의 이미지

그럼 b가 a를 관리하면 되겠네요

ShaYEL의 이미지

제가 말씀드린게 문법적으로 불가능한건가요? ㅠㅠ
그렇게해도 되기는 되지만 하던걸 처음부터 다 뒤집어야 하는 문제라, 다른 문제들이 더 발생할거같습니다..

익명 사용자의 이미지

말씀하시는 심정은 이해가 되지만, 그래서 설계 단계에서 신중하게 필요한 요구사항을 반영하는 게 중요하다고 하겠습니다.
안 그러면 뒤집어야 하니까요.

ShaYEL의 이미지

저는 이 구조를 충분히 구현할 수 있다고 생각해서 이렇게 설계했지요. 지금도 그렇게 생각하고요..

익명 사용자의 이미지

뭘 원하는건지 도무지 알수가 없는 질문이네요.

다른 A가 있는지 없는지는 전역변수로 카운터를 만들어서
A가 생성되거나 파괴될 때마다 카운터를 변경하면 간단한 일이겠고

다른 A의 B에 접근할 필요가 있다면
createA의 매개변수로 다른 A의 포인터를 받거나
혹은 역시 마찬가지로 전역으로 접근가능한, 모든 A의 목록을 가진 리스트나 스택을 만들어 쓰면 될거고...

근데 이렇게 하기는 귀찮고 C언어 자체적으로 뭔가 알아서
프로그래머의 자기 자신도 잘 알수없는 마음속의 은밀한 욕구를
알아서 척척 맞춰줘야 한다는 이건가요?

일단 자기가 뭘 원하는 지부터 확실하게 정리를 한 다음에
질문을 하던가 구현을 하던가 하시죠.

지금 상태로는 백날 답변해줘봤자
'아 그건 아닌데... 뭐라 설명해줄수는 없지만 뭔가 짜릿한 그거 있잖아!'하면서
무한반복 될거 같네요.

ShaYEL의 이미지

무슨 말씀이신지.. 저는 그냥 포인터 개념이 좀 헷갈려서 위에 써놓은것처럼 쓰면 구조체에서 참조하는 값들이 한꺼번에 바뀌도록 할 수 있는지 여쭤본건데요 ㅠㅠ 지금은 해결 했습니다. 위에것처럼 쓰면 안되더라고요.

말씀하신거 그대로 카운터 써서 A 갯수 세었고, 모든 A의 목록을 가진 리스트도 이미 만들었답니다.

궁금하신듯해서 말씀드리는데 사실 커널을 만들던 중이었습니다. A가 스레드 구조체고, B는 파일 디스크립터나 I/O lock 등등을 보관하는 구조체고요..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.