2014-11-10 2 views
0

정적 변수/비 큐 및 객체에 문제가 있습니다. 실시간 데이터 스트림에 대한 통계 (평균, 중간 값, 비뚤어 짐 등)를 계산하고 있습니다.이 데이터를 스트리밍하는 동안 정적 vars를 사용하거나이 버전의 정적 컨테이너 (deque)를 사용합니다. 여러 버전을 만들었지 만 모두 같은 문제가 있습니다. 동일한 메소드의 두 인스턴스를 만들지 만 정적 대기열은 공유되는 것처럼 보입니다. 내가 범위 오류 나가정적 변수/비 큐 및 객체

Stats s1, s2; 
s1.Mean(streamData, 20); 
s2.Mean(streamData, 30); 

:

double Mean(double& lastValue, const int& length) 
{ 
    static std::deque<double> buffer(length); 
    double sum = 0.0; 

    buffer.pop_back(); 
    buffer.push_front(lastValue); 

    for (int j = 0; j < length; j++) { 
     try { 
      sum += buffer.at(j); 
     } 
     catch (const std::out_of_range& oor) { 
      std::cerr << "Out of Range error: " << j << " - " << oor.what() << '\n'; 
     } 
    } 

    return length != 0 ? sum/length : 0; 
} 

내가 이런 두 인스턴스를 한 경우 : 내가 (가장 효율적인 만 읽을 수 없습니다) 다음과 같은 코드가 있습니다.

질문 :

out_of_range 예외의 원인이 무엇
  1. ?
  2. 내가 틀렸을 수도 있지만 정적 인 deque가 두 객체간에 공유되는 것처럼 보입니다. 어떻게 가능합니까?

도움을 주시면 감사하겠습니다.

+0

당신이하는 방법의 두 가지 또는 하나의 인스턴스를 어떻게해야합니까? – harper

+1

함수 - 정적 개체 또는 변수는 함수 당 하나의 인스턴스를 가지며 Stats 개체 당 하나의 인스턴스가 아닙니다. 큐를 모든 Stats 객체가 공유하도록하려면 대기열을 클래스의 정적 객체로 만듭니다. –

+0

@Erik OK, 개체 당 하나의 인스턴스가 아니라 함수 당 하나의 인스턴스입니다. 이제 왜 out_of_range 예외가 발생하는지 이해합니다. deque를 각 함수에 전달하는 경우를 제외하고는 어떻게 해결할 수 있을지 제안하십시오. – Joerg

답변

1

on 2 : C의 static variable은 프로그램의 수명 기간 동안 확장되는 수명을가집니다. 따라서 프로그램이 실행 중일 때 버퍼 변수의 인스턴스는 하나뿐입니다.

on 1 : 그래서 프로그램에서 : 먼저 s1 객체를 사용하여 크기가 20 인 deque 버퍼를 생성 한 다음 s2 객체를 사용하여 크기를 30으로 사용하려고 시도합니다. 변수가 정적으로 생성 된 변수이므로 20-29 범위에서 범위를 벗어난 오류가 발생합니다.

코드 안에 정적 변수를 사용하는 것은 일반적으로 좋지 않습니다.

편집 :

당신이 정말 원하는 것은 당신의 통계 클래스의 양단 멤버 변수를 가지고있다.

사용자는 Mean 함수에서이 변수 (객체 당)에 액세스합니다. (Stats의 생성자에서 초기화하는 것을 잊지 마세요). 당신이 양단 큐의 크기를 조정해야하는 경우

, 당신은 사용할 수 있습니다

buffer.resize(length); 
+0

내가 가진 한 가지 해결책은 다음과 같습니다. double Mean (double & lastValue, const int & length, std :: deque & buffer)? 다른 해결책? – Joerg

+0

일반적인 방법은 구성원 클래스 특성을 사용하는 것입니다. 내 편집을 참조하십시오. – chrphb

+0

OK, 이것에 대해 생각해 봤어야합니다 ...... 감사합니다! – Joerg