2014-09-16 6 views
-1

가변 인수를 사용하는 C 함수가 있는데 매우 긴 인수 목록으로 호출해야합니다. 여기서 인수는 모두 정렬. 예 :C에서 배열을 통해 반복되는 긴 인수 목록을 우아하게 만드는 방법

myFunction(A[0], B[0], A[1], B[1], A[2], B[2], A[3], B[3], ..... A[N], B[N]); 

여기서 N은 일반적으로 100-200입니다.

N을 더 크게 만들 때마다이 호출을 수동으로 생성하지 않아도되고, 생각할 수있는 우아한 방법이 있습니까? 실패

i=0; 
myFunction(A[i], B[i++], A[i], B[i++], A[i], B[i++], A[i], B[i++], ..... A[i], B[++]); 

하지만 물론 :

내가 좋아하는 뭔가를 시도했다. 그러나 N을 더 크게 만들 때마다 선호되는 점은 각 배열 인덱스가 올바른지 확인하는 대신 동일한 행을 반복해서 복사 할 수 있다는 점입니다. 이는 상당히 지루합니다.

myFunction()을 변경하는 것은 옵션이 아닙니다. 나는 C 기능을 구성 할 수있는 방법이 있었으면 좋겠다

처럼, 즉시 호출 정확히 내가 원하는 것

for(i = 0 ; i <= N ; i++) 
{ 
    CONSTRUCT_CALL(myFunction, A[i], B[i]); 
} 

하지만, 물론 옵션이 아니다 그.

더 쉽고 우아할만한 것이 있습니까?

대단히 감사합니다.

+5

4 5 중 단지 프로그래머 헤드에 자신을 촬영. –

+0

미안하지만, 왜'myFunc (type * A, type * B)'를이 경우에 할 수 없으며 두 배열을 통해 내부적으로 반복 할 수 없다. – RedX

+1

같은 줄에 여러 개의 '++'가있는 것은 downvote에 의해 처벌 될 수 있습니다;) – Borgleader

답변

2

(런타임시 가변 호출을 합성하는) 표준 C 방법은 없습니다. 하지만 ...

  • 당신이 이러한 문제를 처리 할 수 ​​있도록 설계되어있는 libffi을 사용할 수 있습니다
  • 은 당신이 인수에 대응에 대한 몇 가지 고정 된 한계를 가질 수
  • Builtins for Constructing Calls 특정 GCC를 고려할 수 있습니다 (그래서 추천) (예를 들어, 500), 일부 ar (awk, Python, ...) 스크립트로 생성 된 C 파일을 각 경우에 하나씩 500 가지 경우에 switch으로 생성합니다.
  • 당신은
  • 당신에게 (리눅스 또는 POSIX에 dlopen(3)으로) 그 플러그인을로드 (예를 들어, 리눅스에 대한 몇 가지 gcc -shared -fPIC -Wall -O _gen123.c -o _gen123.so 명령을 분기) 동적으로로드 가능한 플러그인로 컴파일, _gen123.c런타임에서 약간의 C 코드를 생성하는 것이 좋습니다 일부 just-in-time compilation 라이브러리를 고려해 볼 수 있습니다 (예 : libjit, llvm, GNU lightning, asmjit, ...)

은 물론, 하나의 호출로 여러 i++을 피하십시오. bad things이 발생할 수 있기 때문에 undefined behavior을 피하십시오.

+0

포괄적 인, 광기의 증가하는 수준 +1. – user1666959

0

디자인에 뭔가 나쁜 점이 있습니다.

myFunction을 다시 써서 두 개의 배열 (A와 B)을 취하고 사용하기 위해 여러 개의 인덱스가 필요합니다.

이러한 함수 호출의 간단한 예 :

int A[100]; 
int B[100]; 
int c = myFunction(A, B, 100); 

myFunction의 가능한 구현 :

int myFunction(int* A, int* B, int count) 
{ 
    int result = 0; 
    for(int j = 0; j < i; j++) 
     result += A[j] + B[j]*2; 

    return result; 
} 
+0

하지만 그는 말했다 : * myFunction() 변경은 옵션이 아니다. * –

+1

그래, 주목하지 않았다. 어쨌든 여전히 올바르게 할 수있는 다른 옵션은 없습니다.) 좋은 해결책은 myFunction2가 더 좋은 방법으로 같은 것을하는 것을 준비하는 것입니다. –

+0

'va_list'를 취하는 함수의 변종이 없으면 "더 좋음"(그리고 표준화 된) 방법이 없습니다. 이처럼 실제로 함수 인터페이스를 생성하는 사람들이 있다는 것은 매우 슬픈 일입니다. –