2016-09-05 2 views
0

일부 데이터 배열에서 극한치를 검색하는 함수가 있습니다. 데이터에 대한 포인터, 일부 매개 변수 및 결과가 저장되는 구조체 배열에 대한 포인터를 사용합니다. 함수는 결과 struct 배열의 길이를 반환합니다.함수의 구조체 요소 필드의 배열에 대한 포인터

int FindPeaks(float *data, int WindowWidth, float threshold, struct result *p) 
{ 
    int RightBorder = 0; 
    int LeftBorder = 0; 

    bool flag = 1; 

    int i = 0; 
    int k = 0; 

    while(1) 
    { 
     flag = 1; 
     if (WindowWidth >= 200) cout << "Your window is larger than the signal! << endl"; 
     if (i >= 200) break; 
     if ((i + WindowWidth) < 200) RightBorder = i + WindowWidth; 
     if ((i - WindowWidth) >= 0) LeftBorder = i - WindowWidth; 
     for(int j = LeftBorder; j <= RightBorder; j ++) 
     { 
      if (*(data + i) < *(data + j)) 
      { 
       flag = 0; 
       break; 
      } 
     } 
     if (flag && *(data + i) >= threshold && i != 0 && i != 199) 
     { 
      struct result pointer = p + k; 
      pointer.amplitude = *(data + i); 
      pointer.position = i; 
      i = i + WindowWidth; 
      k++; 
     } 
     else 
     { 
      i ++; 
     } 
    } 

    return k; 
} 

i-th 구조체 필드에 대한 참조와 혼동되어 결과가 표시됩니다. 내가 뭔가 잘못하고 있는거야?

+0

*** "결과를 넣기 위해 i-th 구조체 필드에 대한 참조와 혼동합니다."*** - 그게 무슨 뜻입니까? –

+0

'struct result pointer = p + k;':는 다음과 같은 느낌이 들었습니다.'struct result * pointer = p + k; ' –

+0

이 줄을 컴파일 할 수 없습니다. i 번째 진폭 포인터 설정 문제 : pointer.amplitude = * (data + i); – Dankevich

답변

1

포인터를 사용하는 것이 너무 똑똑하기 때문에 코드가 컴파일되지 않습니다.

어디서나 *(data + i) 또는 *(data+j)을 사용하는 대신 data[i] 또는 data[j]을 사용하십시오. 그것들은 동등하고 두 번째 배열은 배열로 작업 할 때 종종 더 읽기 쉽습니다 (호출자가 전달한 data이 실제로는 (첫 번째 요소의 주소) float의 배열이라고 가정).

당신에 대해 묻는 문제는이 코드 p는 인수로 함수에 전달 struct result에 대한 포인터가

struct result pointer = p + k; 
pointer.amplitude = *(data + i); 
pointer.position = i; 

입니다. 이 경우 실제로는 pointer이 참 포인터 여야합니다. 당신은 당신이 코드는 컴파일 얻을 것이다

struct result *pointer = p + k; /* equivalently &p[k] */ 
pointer->amplitude = data[i]; 
pointer->position = i; 

을해야 할 수도 있습니다 (오히려 별도의 struct result 만드는 대신) p[k]에서 지적하고 싶어요 가정. 함수가 실제로 무엇을 성취해야하는지에 대해서는 설명하지 않았으므로 코드가 실제로 의미있는 일을하는지 확인하지는 않았다.

사실 C++에서 C 기술을 사용하고 있습니다. 현대 C++에는 표준 컨테이너 사용과 같은 훨씬 더 나은 대안이 있습니다.

+0

"너무 똑똑합니다"에 대해 몰라요. – StoryTeller

+0

예! 이제 작동합니다! 너무 감사합니다. – Dankevich

+0

@StoryTeller - "너무 똑똑한"것이 아니라 "시작하기 위해 노력하고있다"고 말했습니다. 의미는 완전히 다릅니다. – Peter

관련 문제