char *train_images = option_find_str(options, "train", "data/train.list");
这是darknet中训练yolo模型时读取保存在链表中文件的函数,这里详细解析一下其内部结构;
前面已经写过了如何存入链表的博客;现在分析一下如何从链表中读取需要的数据;其函数主体如下所示:
//其参数分别为链表头指针、关键字和默认数据
char *option_find_str(list *l, char *key, char *def)
{
char *v = option_find(l, key);//从链表中获取关键字的键值,其函数主体见下
if(v) return v;//如果输出的键值存在则输出
if(def) fprintf(stderr, "%s: Using default '%s'\n", key, def);//当键值不存在时,输出def
return def;
}
option_find函数
char *option_find(list *l, char *key)
{
node *n = l->front;//创建一个node结点并将其赋上l->front指向的地址,l->front就是头指针,其指向链表第一个结点,则新建结点n的地址就是链表第一个结点所在地址;
while(n)//链表不为空会一直查询,直到内部找到跳出
{
kvp *p = (kvp *)n->val;//创建一个kvp结构体,并将结点n的val赋给它,n->val中所保存的就是保存数据的kvp结构体指针地址,其指向保存数据的kvp结构体,这样新建p的地址和保存数据的kvp结构体地址相同了。
if(strcmp(p->key, key) == 0)//对比关键字是否相同,若相同则返回关键字对应的键值
{
p->used = 1;
return p->val;
}
n = n->next;//指向链表的下一个结点
}
return 0;
}