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
'programing' 카테고리의 다른 글
루프에 대한 클릭 핸들러 할당 (0) | 2023.10.29 |
---|---|
속성 변경 시 중단점 (0) | 2023.10.29 |
함수 선언의 최대 매개 변수 수 (0) | 2023.10.29 |
PowerShell 스크립트를 어디에 놓을 것입니까? (0) | 2023.10.29 |
Next.js: getInitialProps()에서 데이터 가져오기: 서버 측 대 클라이언트 측 (0) | 2023.10.29 |