2013-01-12 99 views
0

我想在一個簡單的命令行參數在C++程序中觸發不同的程序行爲 - 當你包含一個「Y」(或任何字符串以Y開頭 - 我不真的很在意)程序顯示一些中間結果。
當我有趣的字符串比較崩潰

CCAL pix.txt運行

一切工作正常。

當我使用

CCAL pix.txt是

它運行正常,說明我的PIX和崩潰在最後。

此外,

CCAL pix.txt沒有

運行的一切,而不顯示PIX OK(像它應該),以及仍然崩潰在最後。

下面是相關的代碼 - 我做錯了什麼?

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切換測試是這樣的:

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

我仍然得到同樣的行爲。我不能爲了我的生活找出原因。

+6

該問題可能在代碼中的其他地方;請構建一個[最小測試用例](http://sscce.org)。 –

+0

到目前爲止,沒有看起來越野車。我們可能需要更多的代碼。 – 2013-01-12 20:21:11

+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; 
} 

調用了new/delete一個10字節數組將花費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; 
    } 
}