【问题标题】:OpenCV argc and argv confusionOpenCV argc 和 argv 混淆
【发布时间】:2013-05-27 03:54:36
【问题描述】:

我正在查看一些 OpenCV 教程,并在开头找到了这一行(这是链接,代码在 CalcHist 部分下http://opencv.willowgarage.com/documentation/c/histograms.html)

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

我以前从未见过这个,真的不明白。我检查了一些关于这个主题的问答,但仍然不明白。 谁能给我解释一下这条线是什么意思?

谢谢!

【问题讨论】:

    标签: c opencv argv argc


    【解决方案1】:

    该行按顺序执行以下操作:

    1. 测试是否有argc == 2 - 即是否只有一个命令行参数(第一个“参数”是可执行文件名)
    2. 如果是这样(因为如果argc 不是2,短路&& 将中止测试而不评估右侧),将src 设置为cvLoadImage 调用的结果命令行参数
    3. 测试结果(因此src)是否不为零

    argc 和 argv 是 C 中 main 函数采用的两个参数的名称(几乎总是)。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 首先检查除了可执行文件名称 (argc == 2) 之外是否正好有 1 个命令行参数。然后它继续使用该参数 (cvLoadImage(argv[1], 1))

    检查argc 然后使用argv[n] 是一种常见的习惯用法,因为它是unsafe 访问超出argv 数组的末尾。

    【讨论】:

    • 值得指出的是,第2点中的“如果是这样”是指&&运算符短路,即如果argc == 2为假,则评估将停止。
    • 谢谢你,这有帮助。这让我很困惑,因为我以前从未见过这种情况。所以我的下一个问题是——为什么要使用这样的语法?
    • 喜欢哪个? argc和argv的使用,或者(src = cvLoadImage()) != 0的赋值然后测试?
    • 是的,就像那样。能解释一下为什么要用arc和argv,图片读取部分在哪里?
    • @Moirae - 好了,关于 argc 的更多细节,添加了 argv。一切都清楚了吗?
    猜你喜欢
    • 2013-09-08
    • 1970-01-01
    • 2011-04-15
    • 2012-04-20
    • 2020-11-03
    • 2015-03-27
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多