2015-01-05 1 views
0

내가 가지고있는 나는 GUI에서 사용자에게 값을 표시하기 위해 사용하고 내 코드의 경우-else 문 다음C++ 모두 '경우'와 '다른'문 호출을 한 것으로 나타났습니다

if (data.steering.fpTTGValid) 
    { 
     pFlightPlanTTGReadout->setValid(); 
     pFlightPlanTTGReadout->update((int)data.steering.flightPlanTTG); 
    } 
else 
    { 
     pFlightPlanTTGReadout->setInvalid(); 
    } 

디버그에서 프로그램을 실행하고 Visual Studio에서 프로세스에 연결할 때 커서가 'if'문에서 data.steering.fpTTGValid 변수 위로 커서를 이동하면 그 값이 참임을 알 수 있습니다. 내 이해는이 후속 {} 내부 코드를 실행해야하지만, else 문을 실행해서는 안됩니다.

그러나 코드를 단계별로 계속 진행하면 data.steering.flightPlanTTG 변수 값이 0으로 유지되어 전달되는 update() 함수가 실행되지 않았 음을 알 수 있습니다. 이 변수는 GUI에 표시된 0에도 그대로 있으며 if 문의 else 절이 호출되었음을 나타냅니다.

fpTTGValid 변수가 처음에 사실 때문에, 내 생각 엔 내가 실제로 GUI에 표시되는 값을 보지 못할 수 있도록 모두 ifelse 절, called-되는 것을 때문에이 설정되어 표시 할 것 변수 0 setInvalid() 함수에 의해.

아무도 내가 여기서 잘못하고있는 것을 지적 할 수 있습니까? data.steering.fpTTGValid 값이 true인데도 update() 함수가 data.steering.flightPlanTTG 변수의 값을 업데이트하지 않는 이유는 무엇입니까?

update() 기능으로 정의됩니다

void ElapsedTimeReadout::update(const int total_seconds_) 
{ 
SESL_FUNCTION_BEGIN(update) 

int seconds, minutes, hours; 
int update_delta = total_seconds_; 

seconds = update_delta % 60; 
update_delta = (update_delta - seconds)/60; 

minutes = update_delta % 60; 
update_delta = (update_delta - minutes)/60; 

hours = update_delta % 24; 

channel.Hours = hours; 
channel.Minutes = minutes; 
channel.Seconds = seconds; 

SESL_FUNCTION_END() 
} 
+2

당신은 단지 if를 평가 한 다음 else를 치는 것이 아니라고 확신합니까? 나는 그것이 주요한 버그를 대표 할 것이기 때문에 둘 다 의심되고있다. 당신의 진술에서 당신은 그것이 if로 들어가야한다고 생각하지만 실제로는 주로 논리 오류로 인한 else에 들어가고있는 것처럼 보입니다. – jgr208

+0

간단한 테스트 : 디버그 문을 두 경로에 넣고 다른 텍스트를 출력합니다. 만약 당신이 두 문장을 얻었다면 반짝이는 페니를 먹을 것입니다 ... –

+7

이'pFlightPlanTTGReadout-> update ((int) data.steering.flightPlanTTG);'* 매개 변수 * 값이 바뀔 것으로 예상하십니까? 캐스팅이 아닙니다. – crashmstr

답변

3

당신이 업데이트되지 않는 확실한가요? 확률은 if/else의 두 절이 모두 실행되고 꽤 심각한 컴파일러 버그가 될 것이고 꽤 확신합니다. 누군가이 지금까지 알아 차렸을 것입니다. 업데이트 기능이 잘못되었거나 int로 캐스트 될 때 data.steering.flightPlanTTG가 0이 될 가능성이 훨씬 큽니다.

+0

버그 설명에 동의합니다. 그의 설명에서 논리 오류가 더 많이 발생했습니다. – jgr208

+0

그래, if 및 else 문 모두 호출되고 있다고 생각하지 않았을 것이다. 그러나 디버그에서 코드를 실행하는 것처럼 코드가 어떻게 나타나는지 보여줍니다. 이제'update()'함수에 대한 코드를 추가 할 것이다. – someone2088

+0

'update()'함수의 코드가 추가되었습니다. – someone2088

0

data.steering.fpTTGValid이 true/non-zero이면 첫 번째 블록 만 실행됩니다. data.steering.flightPlanTTG 값을 확인 했습니까? 이 값이 0이면 0 매개 변수를 사용하여 update을 호출하기 만하면됩니다. 귀하의 조건 블록은 괜찮아 보입니다. 대신에 setValidupdate 함수 자체를 살펴 보겠습니다. 0이 아닌 매개 변수로 update이 호출되는지 여부를 확인하십시오. update이 예상 한대로 작동하는지 확인하십시오. 엄밀히 말하면, 비 L 값 - - 그 값이 수정 될 수있는 식 아니다 수단

1

는 I는 r- 수치 (http://en.wikipedia.org/wiki/Value_(computer_science)#lrvalue)를 될 flightPlanTTG 발생할 (int)의 값 타입 캐스팅 믿는다. 또한 update 함수가 전달 된 매개 변수가 참조로 전달되는 방식으로 작성되어야합니다. 그렇지 않으면 원래 값에 영향을 미치지 않고 값의 로컬 복사본을 수정합니다. 반환 값을 사용하지 않으므로 가장 간단하고 읽기 쉬운 수정은 update 함수가 매개 변수를 직접 수정하지 않고 값을 반환하도록하는 것입니다. 그런 다음 결과를 다시 flightPlanTTG 값에 할당하십시오.

+0

'int'에 캐스트를 제거하려고 시도했지만 여전히 같은 문제가 있습니다 ... – someone2088

+0

또한 업데이트 문이 매개 변수가 참조로 전달되는 방식으로 작성되어야한다고 말한 것을 기억하십시오. bames53의 예를 보라. 업데이트 기능을 살펴보면 매개 변수 값이 업데이트 될 것으로 예상되는 시점을 정확하게 알 수 있습니다. 매개 변수를 업데이트하지 않습니다. – BlueMonkMN

2

data.steering.fpTTGValid의 값이 true 인 경우에도 update() 기능에 의해 업데이트 된 data.steering.flightPlanTTG중인 변수의 값이 아닙니다?

update() 함수가 실제로 매개 변수를 업데이트한다고 가정하면 코드가 올바르지 않습니다. data.steering.flightPlanTTG을 캐스팅하면 임시 변수가 생성되고 해당 임시 변수에 대한 업데이트는 원래 data.steering.flightPlanTTG에 반영되지 않습니다. 사실

, update()가 그 매개 변수를 갱신하도록되어 있다면, 그것은 아마도 참조에 의해 매개 변수를 복용 :

void update(int &param) 

C++은이 같은 함수에 임시을 통과하는 것을 허용하지 않습니다. 오류가 발생합니다. 그 이유는 작성한 버그를 정확히 방지하기 위해서입니다.

불행히도 Visual Studio에는 임시 함수를 이와 같은 함수로 전달할 수있는 확장 기능이 있습니다. 그러나이를 가능하게 할 수있는 경고가 있습니다. 컴파일러의 경고 수준을 최대 3 또는 4로 설정하고 결과 경고를 모두 수정해야합니다.

가장 즉각적인 변화 오류를 해결하기 위해 할 수는 다음과 같습니다 이제 update()에 대한 코드를 게시 한 것을

int updated_flightplan; 
pFlightPlanTTGReadout->update(updated_flightplan); 
data.steering.flightPlanTTG = updated_flightplan; 

, 문제가 update()이 작동하지 않는 것 같습니다 당신이 기대하는대로. 참조로 매개 변수를 사용하거나 매개 변수를 업데이트하는 작업을 수행하지 않습니다. 대신 함수는 어떤 것이 든간에 부작용의 형태로 출력을 생성하는 것처럼 보입니다. channel.

여기 결말 인 경우-else 문은 정상적으로 작동하고 문제는 update() 사용하는 방법에 대한 이해에 있음 :

pFlightPlanTTGReadout->update(data.steering.flightPlanTTG); 

data.steering.flightPlanTTG을 수정 안되는 코드를, 당신의 기대 그 잘못된 것입니다. 나는 내 코드를 단계별로 계속

0

그러나, 나는 data.steering.flightPlanTTG 변수 값이 전달되는되는 업데이트() 함수가 실행되지 것을 건의 0-에서 유지 볼 . 이 변수는 GUI에 표시된 0에 머무르며, 은 if 문의 else 절을 ​​ 이라고합니다.

이것은 코드가 분명히 버그이므로 완전히 잘못된 분석입니다.

data.steering.flightPlanTTG를 업데이트하려면 포인터를 사용하거나 참조를 사용하여 전달해야합니다. update() 함수는 두 메커니즘 중 하나를 사용하지 않습니다.

+0

나는 그에게 "if에서 말하면 진술서를 인쇄하고 else에 다른 진술서를 적어서 결과를 말해줘."라고 말하도록 요구했다. 그러나 그는 이것을하지 않았습니다. 따라서 그는 우리가 도울 수 없도록 만듭니다. – jgr208

관련 문제