2013-01-12 1 views
0

다른 프로그램 동작을 트리거하는 C++ 프로그램의 간단한 명령 줄 인수를 사용하려고합니다. "y"(또는 y로 시작하는 문자열 - 포함하지 않을 때 - 나는 포함하지 않습니다. 정말로주의) 프로그램은 몇 가지 중간 결과를 표시합니다.
내가C++ : 재밌는 문자열 비교 충돌

ccal의 pix.txt 실행

모든 것이 잘 작동합니다.

내가 맨 끝에

ccal pix.txt

그것은 확인을 실행 예, 보여줍니다 내 PIX와 충돌을 사용하는 경우. 또한

ccal pix.txt 더

는 맨 끝에 충돌 여전히 (그것이해야처럼) PIX를 표시하지 않고 OK 모든 것을 실행하지 않으며,.

다음은 관련 코드입니다. 내가 뭘 잘못하고 있니?

 if(argv[2][0] == 'y') 

나는 여전히 같은 동작을 얻을 :

void dumpFloatMatrix(Mat m){ 
for(int i = 0; i < m.cols; i++){ 
    for(int j = 0; j < m.rows; j++){ 
     char *buff = new char[10]; 
     sprintf(buff, "%5.1f ", m.at<float>(i,j)); 
     cout << buff; 
     delete buff; 
    } 
    cout << endl; 
} 
} 
int main(int argc, char *argv[]){ 
char* outFile; 
bool showPix = false; 

// Take in command line args 
switch(argc){ 
case 3: 
    if(strncmp(argv[2], "y", 1) == 0) 
     showPix = true; 
    outFile = argv[1]; 
    break; 
case 2: 
    outFile = argv[1]; 
    break; 
default: 
    cout << "Usage: ccal INPUT_LIST_FILE" << endl; 
    return -1; 
} 
Mat cameraMatrix(3, 3, CV_32FC1); 
dumpFloatMatrix(cameraMatrix); 
return 0; 
} 

이상한 것은 내가 이런 식으로 경우 3에서 테스트를 전환 할 때도 있다는 것입니다. 나는 왜 내 인생에 대해 생각할 수 없다.

+6

문제는 아마도 코드의 다른 부분에있을 수 있습니다. [최소 테스트 케이스] (http://sscce.org)를 작성하십시오. –

+0

지금까지 아무 것도 버그가 없다. 우리는 더 많은 코드가 필요할 것이다. –

+3

디버거를 사용하여 충돌이 실제로 어디인지 확인할 수 있습니다. –

답변

1

죄송합니다, 그러나 이것은 순수한 광기입니다 : 새로운 호출

for(int j = 0; j < m.rows; j++){ 
    char *buff = new char[10]; 
    sprintf(buff, "%5.1f ", m.at<float>(i,j)); 
    cout << buff; 
    delete buff; 
} 

가/메모리의 16 ~ 32 바이트 + 당신이 원하는 열 바이트 비용 10 바이트 배열에 대해 삭제 [아마 16로 반올림 , 32 또는 64 바이트]. 그리고 new와 delete 각각에 대한 호출. 예, 확신합니다. cout << buff은 더 많은주기가 소요되지만, 어떤 방식 으로든 필요합니다.

사용 다음 중 하나를

for(int j = 0; j < m.rows; j++){ 
    char buff[10]; 
    sprintf(buff, "%5.1f ", m.at<float>(i,j)); 
    cout << buff; 
} 

또는 사용 C++ 스타일 서식 : 배열이 매우 큰 경우

for(int j = 0; j < m.rows; j++){ 
    cout << precision(1) << setw(5) << m.at<float>(i,j); 
} 

, 당신은 루프에서이 이동하는 것이 좋습니다 :

cout.precision(1); 
cout.setw(5); 

내가 마지막 방법을 선호합니다. 계산 결과가 1210121281.9 인 경우 오버플로가 발생하지 않으므로 [레이아웃은 좀 웃겨 봐].

+0

불행히도 마지막 방법은 실제로 느리고 실제로 중첩 루프를 넣는 데는 적합하지 않습니다 (여러 번 호출되는 경우). 여기서는 행렬이 그리 크지 않은 것처럼 보이므로 문제가되지 않아야합니다. –

+0

또한 괄호의 균형을 맞 춥니 다. –

+0

수천 개의 부동 소수점 수를 인쇄하는 것과 비교해 느린가요? –

1

고정 크기 버퍼는 경고 기호입니다.

는 문제 해결 단계로,

sprintf(buff, "%5.1f ", m.at<float>(i,j)); 

게다가

int const used = sprintf(buff, "%5.1f ", m.at<float>(i,j)); 
assert(used < 10); 

에 동적 할당을 사용하여 일반 우스운가 변경. 고정 크기 버퍼로 충분하다면 로컬 자동 배열 변수를 사용하십시오. 버퍼 공간을 확보하는 동안 스택 공간이 저렴하기 때문에 버퍼를 충분히 크게 만들어 오버플로를 방지하십시오.

void dumpFloatMatrix(Mat m) 
{ 
    char buff[400]; 
    for(int i = 0; i < m.cols; i++){ 
     for(int j = 0; j < m.rows; j++){ 
      int const used = sprintf(buff, "%5.1f ", m.at<float>(i,j)); 
      assert(used * sizeof *buff < sizeof buff); 
      cout << buff; 
     } 
     cout << endl; 
    } 
}