【darknet 源码解析-02】utils.h 与 utils.c

本系列为darknet源码解析,本次解析src/utils.h 与 src/utils.c 两个。主要涉及到了读写文件操作,以及字符串基本操作,

utils.h 中包含的代码如下:

#ifndef UTILS_H
#define UTILS_H
#include <stdio.h>
#include <time.h>
#include "darknet.h"
#include "list.h"

#define TIME(a) \
    do { \
    double start = what_time_is_it_now(); \
    a; \
    printf("%s took: %f seconds\n", #a, what_time_is_it_now() - start); \
    } while (0)

#define TWO_PI 6.2831853071795864769252866f

double what_time_is_it_now(); //获得当前时间
void shuffle(void *arr, size_t n, size_t size); //对数组进行洗牌操作
void sorta_shuffle(void *arr, size_t n, size_t size, size_t sections); // 对每一个sections进行洗牌操作
void free_ptrs(void **ptrs, int n); // 释放二维指针的内存空间
int alphanum_to_int(char c); // 字符转整数
char int_to_alphanum(int i); //整数转字符
int read_int(int fd);  // 从文件fd中读取一个整数
void write_int(int fd, int n); // 向文件fd中写入一个整数
void read_all(int fd, char *buffer, size_t bytes); // 将内存中buffer起始的bytes个字节数据写入到fd文件中,一次性操作,若写不完,则报错

void write_all(int fd, char *buffer, size_t bytes); // 从fd文件中,读取bytes个字节数据到内存中buffer起始,一次性操作,若读不完,则报错
int read_all_fail(int fd, char *buffer, size_t bytes); // 从fd文件中,读取bytes个字节数据到内存中buffer起始,直到读完;
int write_all_fail(int fd, char *buffer, size_t bytes); // 将内存中buffer起始的bytes个字节数据写入到fd文件中,直到写完
void find_replace(char *str, char *orig, char *rep, char *output);// 判断str中是否出现子串,若出现则进行替代;
void malloc_error(); // 报错,内存分配出错
void file_error(char *s); // 报错,不能打开指定目录的文件
void strip(char *s); // 过滤掉字符数组中' '和'\t'以及'\n'三种字符
void strip_char(char *s, char bad); //过滤掉字符数组存在的指定字符 bad
list *split_str(char *s, char delim);
char *fgetl(FILE *fp); // 读取指定文件中的一行字符;
list *parse_csv_line(char *line); // 字符串切割,按照指定字符delim进行切割;
char *copy_string(char *s); //字符串拷贝操作
int count_fields(char *line); // 统计字符数组中有多少个 空格字符和','字符;
float *parse_fields(char *line, int n); // // 解析字符数组中的float实数
void translate_array(float *a, int n, float s); // 对向量进行平移操作,
float constrain(float min, float max, float a); // 判断小数a 与 区间小数[min, max]的关系,返回相应的值
int constrain_int(int a, int min, int max); // 判断整数a 与 区间整数[min, max]的关系,返回相应的值
float rand_scale(float s); // 随机采用的基础上,50%的概率返回S,50%的概率返回1/s
int rand_int(int min, int max); // 返回一个区间[min, max]内的一个整数
void mean_arrays(float **a, int n, int els, float *avg); // 求二维float数组,每一列的平均值,保存在avg一维float数组中
float dist_array(float *a, float *b, int n, int sub); // 当sub为1的时候,其实就是计算两个一维数组的欧式距离
float **one_hot_encode(float *a, int n, int k); // 进行one_hot 编码,根据,float数组a中的元素进行编码
float sec(clock_t clocks); // 获取秒数
void print_statistics(float *a, int n); // 计算向量的mean和var
int int_index(int *a, int val, int n); // 一维数组进行查找操作,若查找指定值,返回index,否则,返回-1;

#endif

详细的注解,见utils.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <assert.h>
#include <unistd.h>
#include <float.h>
#include <limits.h>
#include <time.h>
#include <sys/time.h>

#include "utils.h"


/*
// old timing. is it better? who knows!!
double get_wall_time()
{
    struct timeval time;
    if (gettimeofday(&time,NULL)){
        return 0;
    }
    return (double)time.tv_sec + (double)time.tv_usec * .000001;
}
*/

// 获得当前时间,到秒的时间戳,并对微秒进行四舍五入。
// tv_usrc 获取到微秒,需要10^-6转换为秒
double what_time_is_it_now()
{
    // 
    struct timeval time;
    if (gettimeofday(&time,NULL)){
        return 0;
    }
    return (double)time.tv_sec + (double)time.tv_usec * .000001;
}


// 读取初始gpu_list,获得gpu id编号
int *read_intlist(char *gpu_list, int *ngpus, int d)
{
    int *gpus = 0;
    // 如果gpu_list不为空,gpu_list = "*,*,*,*,"
    if(gpu_list){
        int len = strlen(gpu_list);
        *ngpus = 1;
        int i;
	// 通过计数","的个数来统计gpu的个数
        for(i = 0; i < len; ++i){
            if (gpu_list[i] == ',') ++*ngpus;
        }
	// 分配存储空间
        gpus = calloc(*ngpus, sizeof(int));
        // 将GPU编号保存到 gpus int型数组中
        for(i = 0; i < *ngpus; ++i){
	    //将gpu_list前面的字符转换成整数,atoi碰到不能转换的符号,停止转换,例: "123.45" 转换结果 "123";  "123,45" 转换结果 "123"
            gpus[i] = atoi(gpu_list);
	    // 更新gpu_list,已经保存到gpus中要过滤掉, strchr 查找某字符的index,返回从该index开始的子字符数组;
            gpu_list = strchr(gpu_list, ',')+1;
        }
    } else {// gpu_list 为空,
        gpus = calloc(1, sizeof(float));
        *gpus = d; 
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值