OpenCV argc и argv путаница

Я проверяю учебник по OpenCV и нашел эту строку в начале (вот ссылка, код находится в разделе CalcHist http://opencv.willowgarage.com/documentation/c/histograms.html)

if (argc == 2 && (src = cvLoadImage(argv[1], 1)) != 0)

Я никогда раньше такого не видел и действительно не понимаю. Я проверил несколько вопросов и ответов по этому поводу, но все еще не понимаю. Может ли кто-нибудь объяснить мне, что означает эта строка?

Спасибо!


person Moirae    schedule 31.05.2013    source источник


Ответы (1)


Строка выполняет следующие действия по порядку:

  1. Проверяет, есть ли argc == 2 - то есть был ли ровно 1 аргумент командной строки (первый «аргумент» - это имя исполняемого файла)
  2. Если это так (потому что, если argc не 2, короткое замыкание && прервет тест без оценки правой части), устанавливает src на результат cvLoadImage, вызванного в этом аргументе командной строки
  3. Проверяет, равен ли этот результат (и, следовательно, src) нулю

argc и argv - это имена (почти всегда), присвоенные двум аргументам, принимаемым функцией main в C. argc является целым числом и равно количеству аргументов командной строки, присутствующих при вызове исполняемого файла. argv - это массив char* (представляющий массив строк с завершающим NULL), содержащий фактические значения этих аргументов командной строки. Логически он содержит argc записей.

Обратите внимание, что argc и argv всегда имеют имя исполняемого файла в качестве первой записи, поэтому следующий вызов команды:

$> my_program -i input.txt -o output.log

... поместит 5 в argc, а argv будет содержать пять строк my_program, -i, input.txt, -o, output.log.

Таким образом, ваш процитированный if-test сначала проверяет, был ли в командной строке ровно 1 аргумент, кроме имени исполняемого файла (argc == 2). Затем он использует этот аргумент (cvLoadImage(argv[1], 1))

Проверка argc, а затем использование argv[n] - распространенная идиома, потому что небезопасно получить доступ за пределами массив argv.

person Chowlett    schedule 31.05.2013
comment
Стоит отметить, что если это так, в пункте 2 относится к тому факту, что оператор && выполняет короткое замыкание, т.е. оценка прекращается, если argc == 2 ложно. - person unwind; 31.05.2013
comment
Спасибо, это помогло. Это сбило меня с толку, потому что я никогда раньше такого не видел. Итак, мой следующий вопрос будет - зачем использовать такой синтаксис? - person Moirae; 31.05.2013
comment
Какая? Использование argc и argv, или "назначение, затем проверка" (src = cvLoadImage()) != 0? - person Chowlett; 31.05.2013
comment
Да вот так. Вы можете объяснить, зачем использовать arc и argv, где находится часть для чтения изображений? - person Moirae; 03.06.2013
comment
@Moirae - вот и все, подробности по argc, добавлен argv. Это все проясняет? - person Chowlett; 03.06.2013
comment
@Moirae - Не беспокойся. Помните, что вы можете Принять мой ответ (зеленая галочка), чтобы сказать, что это помогло. - person Chowlett; 05.06.2013