programing

C에서 구조물의 정적 배열 초기화

codeshow 2023. 10. 4. 23:05
반응형

C에서 구조물의 정적 배열 초기화

저는 C에서 카드 게임을 구현하고 있습니다.카드에는 여러 가지 유형이 있으며 각 카드에는 개별적으로 관련된 스크립트를 작성해야 하는 몇 가지 작업을 포함한 여러 가지 정보가 있습니다.

이와 같은 구조가 주어졌을 때 (그리고 함수 포인터에 대한 구문 권한을 가지고 있는지 잘 모르겠습니다)

struct CARD {
    int value;
    int cost;
    // This is a pointer to a function that carries out actions unique
    // to this card
    int (*do_actions) (struct GAME_STATE *state, int choice1, int choice2);
};

이것들의 정적 배열을 카드마다 하나씩 초기화하고 싶습니다.이런 모습일 것 같은데요

int do_card0(struct GAME_STATE *state, int choice1, int choice2)
{
    // Operate on state here
}

int do_card1(struct GAME_STATE *state, int choice1, int choice2)
{
    // Operate on state here
}

extern static struct cardDefinitions[] = {
    {0, 1, do_card0},
    {1, 3, do_card1}
};
  1. 이게 효과가 있을까요? 그리고 제가 이 일을 제대로 하고 있는 건가요?엄청난 수의 스위치 진술을 피하려고 합니다.

  2. do_cardN' 함수를 미리 정의해야 하나요, 아니면 구조의 초기화에서 인라인으로 정의할 수 있는 방법이 있나요? (python의 람다 함수와 같은)

  3. 다른 파일에서 cardDefinitions에 대한 읽기 전용 액세스가 필요합니다. 이 경우 '외부 정적'이 맞는가요?

이것은 많은 질문들이 하나로 합쳐진 것을 알지만 나는 이것에 대해 어떻게 해야 할지 정말로 애매합니다.

감사해요.

편집:

분명히 말씀드리면, 제 목표는 다음과 같은 일을 할 수 있는 것입니다.

int cost = cardDefinitions[cardNumber].cost;

아니면

int result = cardDefinitions[cardNumber].do_action(state, choice1, choice2);

거대한 스위치 문장을 여기저기에 사용하는 대신.

당신의 접근 방식이 정확합니다.

  1. 이것은 효과가 있을 것이고, 큰 것을 피할 수 있는 좋은 방법입니다.switch진술들.
  2. C에서 일렬로 함수를 정의할 수는 없고, 각각의 함수는 고유한 이름을 가져야 합니다.
  3. extern당신이 원하는 것이지, 아닌.static. 몸을 다음과 같이 바꿉니다.

    struct CARD cardDefinitions[] = { 
        {0, 1, do_card0}, 
        {1, 3, do_card1} 
    }; 
    

    적절한 헤더 파일에 다음을 입력합니다.

    extern struct CARD cardDefinitions[];
    

당신의 접근 방식은 옳으며 효과가 있을 것입니다.매개 변수 이름을 사용하지 않고 형식만 사용하는 것을 제외하고는 함수 포인터 구문이 맞습니다.

int (*do_actions)(struct GAME_STATE *, int, int);
  1. 잘 될 겁니다.카드 한 장당 하나씩 한다면 많은 기능이 있을 것 같지만, 어쩌면 이 특정 게임은 그 정도 수준의 제어가 필요할지도 모릅니다.

  2. 인라인으로 정의할 수는 없고 전달 선언만 하면 됩니다.할 필요가 있습니다.&func_name구조 초기화에 있어서는

  3. 아니요;extern즉, 변수가 다른 파일에 선언되어 있으므로 해당 위치에서 선언하는 외부 변수를 갖는 것은 의미가 없습니다.또한.static현재 파일에서만 변수에 액세스할 수 있음을 의미하며, 이는 원하는 것과 반대입니다.읽기 전용으로 만들려면 getter 기능이 필요하지만, 다른 파일에서 액세스할 수 있도록 하려면 여기서 일반적으로 선언합니다(struct cardDefinitions[] = {...} 및 ()을합니다.extern struct cardDefinitions[];)

언급URL : https://stackoverflow.com/questions/2641473/initialize-static-array-of-structs-in-c

반응형