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

 

 

 

 

 

 

 

 

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