2013-05-31 2 views
2

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

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

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

Спасибо!

ответ

5

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

  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] является общей идиомой, потому что это unsafe для доступа за пределами конца argv массива.

+0

Стоит отметить, что «если это» в пункте 2 относится к тому факту, что оператор '&&' является короткозамкнутым, т. Е. Оценка остановится, если 'argc == 2' является ложным. – unwind

+0

Хорошая точка; изм. – Chowlett

+0

Спасибо, что помогло. Меня это смутило, потому что я никогда раньше этого не видел. Итак, мой следующий вопрос: зачем использовать синтаксис? – Moirae

Смежные вопросы