Я пытаюсь взять простой аргумент командной строки в программе на C ++, чтобы вызвать другое поведение программы — когда вы включаете «y» (или любую строку, начинающуюся с y — мне все равно), программа отображает некоторые промежуточные результаты ,
Когда я бегу с
ccal pix.txt
все отлично работает
Когда я использую
ccal pix.txt да
Он работает нормально, показывает мой пиксель и вылетает в самом конце.
Также,
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;
}
Вызов new / delete для 10-байтового массива будет стоить 16-32 байта памяти плюс десять байтов, которые вы хотели [вероятно, округлено до 16, 32 или 64 байтов]. И звонок на новый и на удаление соответственно. Да, я уверен 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 в результате [ваш макет будет выглядеть немного забавно].
Буфер фиксированного размера является для меня предупреждающим знаком.
В качестве шага устранения неполадок измените
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;
}
}