darknet中常用的函数

最近在看darknet源码,发现其中有很多很实用的函数,而这些函数在python中直接当做是封装好的函数供我们使用,能够了解这些函数低层源码,我觉得不但能够提高自己对darknet网络的理解,并且还能够加强对python函数的理解,够提高自己的编程能力。

1 strip_args()函数

strip()函数能够删除一个字符串中所包含的空格、制表符和换行符,这正好也对应python中的strip()函数(python中的strip()函数只能够函数开头或者结尾的空格,不能够删除中间的空格)

void strip_args(char *s)
{
    size_t i;
    size_t len = strlen(s);
    size_t offset = 0;
    for(i = 0; i < len; ++i){
        char c = s[i];

        // offset为要剔除的字符数,比如offset=2,说明到此时需要剔除2个空白符,
        // 剔除完两个空白符之后,后面的要往前补上,不能留空
        if(c==' '||c=='\t'||c=='\n') ++offset;
        else s[i-offset] = c;   // 往前补上
    }

    // 依然在真正有效的字符数组最后紧跟一个terminating null-characteristic '\0'
    s[len-offset] = '\0';
}

其中offset表示的是到目前为止遇到了几个空格、制表符或者换行符。但是本质上表示两个数组之间,对应元素之间的偏移量。这句话怎么理解?可以看下面这幅图理解:

原数组表示字符串在之前字符串数组中的位置,新数组表示我们去掉空格、制表符和换行符应该得到的新数组。offset就表示原数组和新数组对应字符之间索引的差异。

算法的流程图如下:

这个算法中还涉及到字符串常量和字符串数组的问题,有关问题我就不在这里赘述了,可以参考一下下面这一个博客。

[1] https://www.cnblogs.com/tongye/p/10688941.html

 

 

2 find_arg()函数

find_argv()函数能够查找某个二维数组中是否包含某个参数,如果有的话,就返回1,否则返回0。这对应着python中的find函数。

void del_arg(int argc, char **argv, int index)
{
    int i;
    // 我们遍历到倒数第二个元素,然后将倒数第一个元素置为0
    for(i = index; i < argc-1; ++i) argv[i] = argv[i+1];
    // 数字0
    argv[i] = 0;
}

int find_arg(int argc, char* argv[], char *arg)
{
    int i;
    for(i = 0; i < argc; ++i) {
        // 一般来说这边是break;但是这里使用continue更好一些,不对其进行处理
        if(!argv[i]) continue;
        if(0==strcmp(argv[i], arg)) {
            // 删除函数就是将这个元素覆盖,多余的位置用0表示
            del_arg(argc, argv, i);
            return 1;
        }
    }
    return 0;
}

(1) del_arg函数是说,我们要“删除”指定位置上的元素。这里的删除并不是真的删除,而是将这个位置上的数据置为0。当在find_arg函数中遍历到0的时候,我们跳过该元素,并不进行处理。

(2) find_arg函数是说,我们遍历整个数组,如果遍历到的字符串和要寻找的字符串相同,我们就返回1;如果遍历完整个数组都没有找到,那么我们就返回0.

在测试二维数据的时候,遇到了二维数据初始化的问题。主要就是将如何初始化二维指针,参考下面的博客

[2] https://www.cnblogs.com/shadowfish/p/11750438.html

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章