programing

C에서 함수 배열을 정의하는 방법

lastcode 2023. 10. 29. 19:46
반응형

C에서 함수 배열을 정의하는 방법

나는 다음과 같은 선언문을 포함하는 구조를 가지고 있습니다.

void (*functions[256])(void) //Array of 256 functions without arguments and return value

그리고 다른 함수로 정의하고 싶지만 256개의 함수가 있습니다!나는 다음과 같은 일을 할 수 있습니다.

struct.functions[0] = function0;
struct.functions[1] = function1;
struct.functions[2] = function2;

너무 피곤한데, 이런 걸 할 수 있는 방법이 없을까요?

struct.functions = { function0, function1, function2, function3, ..., };

편집: Chris Lutz가 말한 구문 오류 수정

나는 다음과 같은 선언문을 포함하는 구조를 가지고 있습니다.

아니에요, 당신은 그렇지 않아요.구문 오류입니다.찾으시는 항목:

void (*functions[256])();

함수 포인터의 배열입니다.그러나 주의할 점은void func()"논쟁을 하지 않고 아무것도 반환하지 않는 함수"가 아닙니다.지정되지 않은 숫자나 인수 유형을 선택하고 아무것도 반환하지 않는 함수입니다."논의 없음"을 원한다면 다음 사항이 필요합니다.

void (*functions[256])(void);

C++에서,void func() 는 "인수 없음"을 의미하며, 이는 약간의 혼란을 야기합니다(특히 함수 C가 다음에 대해 지정하기 때문에).void func()의심스러운 가치가 있습니다.)

어느 쪽이든, 당신은.typedef당신의 함수 포인터.코드를 무한히 쉽게 이해할 수 있고 단 한 번의 기회만 가질 수 있습니다.typedef) 구문을 잘못 이해하는 방법:

typedef void (*func_type)(void);
// ...
func_type functions[256];

어쨌든 배열에 할당할 수는 없지만 배열을 초기화하고 데이터를 복사할 수 있습니다.

static func_type functions[256] = { /* initializer */ };
memcpy(mystruct.functions, functions, sizeof(functions));

저도 같은 문제가 있었습니다. 이것은 솔루션을 테스트하기 위한 제 작은 프로그램입니다.아주 간단해 보여서 나중에 방문하는 분들께 나눠 드리려고 생각했습니다.

#include <stdio.h>

int add(int a, int b) {
    return a+b;
}

int minus(int a, int b) {
    return a-b;
}

int multiply(int a, int b) {
    return a*b;
}

typedef int (*f)(int, int);                 //declare typdef

f func[3] = {&add, &minus, &multiply};      //make array func of type f,
                                            //the pointer to a function
int main() {
    int i;
    for (i = 0; i < 3; ++i) printf("%d\n", func[i](5, 4));
    return 0;
}

역동적으로 할 수 있습니다...여기 malloc로 할당된 동적 함수 배열의 작은 예가 있습니다.

#include <stdio.h>
#include <stdlib.h>

typedef void (*FOO_FUNC)(int x);

void a(int x)
{
    printf("Function a: %d\n", x);
}

void b(int x)
{
    printf("Function b: %d\n", x);
}

int main(int argc, char **argv)
{
    FOO_FUNC *pFoo = (FOO_FUNC *)malloc(sizeof(FOO_FUNC) * 2);
    pFoo[0] = &a;
    pFoo[1] = &b;

    pFoo[0](10);
    pFoo[1](20);

    return 0;
}

내 머리 위에서, 그리고 검증되지 않은.

// create array of pointers to functions
void (*functions[256])(void) = {&function0, &function1, &function2, ..., };

// copy pointers to struct
int i;
for (i = 0; i < 256; i++) struct.functions[i] = functions[i];

수정: Chris Lutz가 말한 구문 오류 수정.

구조 인스턴스를 선언하면서 이를 수행할 수 있습니다.

function_structur fs = { struct_field1,
                         struct_field2,
                         {function0, function1, ..., function255},
                         struct_field3,
                         ... };

배열이 선언된 후에는 배열을 초기화할 때 이 바로 가기를 사용할 수 없습니다. 이렇게 해야 한다면 동적으로 수행해야 합니다(루프 사용, a).memcpy또는 다른 것).

다음과 같은 양식을 사용하여 배열을 사후 초기화하려면{func1, func2, ...}, GCC를 사용하여 다음과 같은 방법으로 이를 수행할 수 있습니다.

UPD (Chris Lutz의 발언에 감사드립니다)

다음과 같이 매크로를 정의합니다.

#define FUNCTION_VECTOR_COPY(destVec, sourceVec) memcpy(destVec, sourceVec, sizeof(sourceVec))

다음과 같이 Compound Literals를 사용하여 소스 벡터를 전달합니다.

#include <string.h>
...
void (*functions[256])();
...
FUNCTION_VECTOR_COPY (functions, ((void(*[])()) {func1, func2, func3}));

언급URL : https://stackoverflow.com/questions/5309859/how-to-define-an-array-of-functions-in-c

반응형