我试图在C ++程序中使用一个简单的命令行参数来触发不同的程序行为-当您包含“ y”(或以y开头的任何字符串-我不在乎)时,程序会显示一些中间结果。
当我与


  ccal pix.txt


一切正常。

当我使用


  ccal pix.txt是


它运行正常,显示我的pix并最终崩溃。

也,


  ccal pix.txt否


运行一切正常,但不显示pix(应该如此),但最后仍然崩溃。

这是相关的代码-我在做什么错?

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')


我仍然得到相同的行为。我无法为自己的生活弄清楚原因。

最佳答案

抱歉,但这纯粹是疯狂:

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


调用10字节数组的new / delete将占用16-32字节的内存,外加您想要的十个字节(可能舍入为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,则它不会溢出[您的布局看起来会有些有趣]。

10-08 11:36