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-тест проверява първо дали има точно 1 аргумент от командния ред, освен името на изпълнимия файл (argc == 2). След това се използва този аргумент (cvLoadImage(argv[1], 1))

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

person Chowlett    schedule 31.05.2013
comment
Струва си да се отбележи, че if so в точка 2 се отнася до факта, че операторът && е късо съединение, т.е. оценката ще спре, ако argc == 2 е false. - 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