2010-03-07 4 views
1

일부 라이브러리는 설정 및 실행을 분리 할 수있는 기능을 제공합니다. 설정 부분에 제한되지 않은 대기 시간과 같은 바람직하지 않은 특성이있는 경우에는 특히 그렇습니다. setup + execute 모델을 사용하는 라이브러리의 반복 방지

프로그램이이 구조에 반영해야 할 필요가있는 경우

은, 가지고 자연 :

void setupXXX(...); // which calls the setup stuff 
void doXXX(...); // which calls the execute stuff 

이 문제는 setupXXX 및 doXXX의 구조에 (매우 유사 될 것입니다 것입니다 최소한의 텍스트 - 제어 흐름은 doXXX에서 더 복잡 할 것입니다.)

이 문제를 방지 할 수있는 방법이 있는지 궁금 할 때가 있습니다.


예 : 주파수 영역에서 알려진 커널로 필터링 :

하는의 우리가 신호 처리를하고있는 가정 해 봅시다.

그래서, setupXXX 및 doXXX 아마 내가 당신의 코드가 어떻게 보이는지 잘 모르겠지만,

void doFilter(FilterStuff *c) { 
    for (int i = 0; i < c->N; ++i) { 
     doFFT(c->x[i], c->fft_forward_setup, c->tmp); 
     doMultiplyVector(c->tmp, c->filter); 
     doFFT(c->tmp, c->fft_inverse_setup, c->x[i]); 
    } 
} 

void setupFilter(FilterStuff *c) { 
    setupFFT(..., &(c->fft_forward_setup)); 
    // assign the kernel to c->filter 
    ... 
    setupFFT(..., &(c->fft_inverse_setup)); 
} 
+0

"setupXXX의 구조와 doXXX의 의미가 무엇인지 설명 할 수 있습니까?" 왜 그렇게해야합니까? 적어도 객체 지향 언어에서, 당신이 설정 한 객체는 이미 저장되어있는 정보의 대부분을 셋업 할 것이므로 매우 다른 정보가 필요합니까? 당신이 의미하는 바를 잘 모르겠어요. – mnemosyn

+0

내가 무슨 뜻인지 예를 추가했습니다. – lijie

답변

0

... 뭔가 같은 것 당신이 당신의 계산에 사용하는 데이터 구조를 횡단 유사한 경우, 어쩌면 당신은 함수 포인터를 사용하여 OOP 없이도 C/C++로 구현할 수있는 "템플릿 메서드 디자인 패턴"방식으로 트래버스 메서드를 작성하고 계산을 수행 할 수 있습니다.

0

무엇을 피하려고합니까? 당신은 몇 가지를 사용하여 일련의 진술을하고, 그 진술을 초기화하는 일련의 진술을 가지고 있습니다. 두 세트가 유사하면 시각적 인 검증을 통해 일관성이 있다고 볼 수 있습니다.

반복하지 않으려 고합니다. 나는 함수 포인터의 배열을 사용하는 접근법을 고려 중이므로 for() 루프에서 초기화를 수행하는 것이 더 좋을 수도있다. 하지만 아마도 배열의 값이 일치해야하는 초기 인수에 가변성이있을 것입니다. 반복 될 것입니다.

setupFFT(fftarg1[i],fftarg2[i], &(c.ffts[i])); 

은 fftarg1 등을 설정해야하므로 실제로 많이 개선 된 것으로 생각하지 않습니다.