1## current param load api 2### Cons 3#### long and awful code 4#### three functions 5#### not extensible 6#### no default value 7#### no variable length array 8``` 9MyLayer mylayer 1 1 in out 100 1.250000 10``` 11``` 12binary 100 13binary 1.250000 14``` 15```cpp 16#if NCNN_STDIO 17#if NCNN_STRING 18int MyLayer::load_param(FILE* paramfp) 19{ 20 int nscan = fscanf(paramfp, "%d %f", &a, &b); 21 if (nscan != 2) 22 { 23 fprintf(stderr, "MyLayer load_param failed %d\n", nscan); 24 return -1; 25 } 26 27 return 0; 28} 29#endif // NCNN_STRING 30int MyLayer::load_param_bin(FILE* paramfp) 31{ 32 fread(&a, sizeof(int), 1, paramfp); 33 34 fread(&b, sizeof(float), 1, paramfp); 35 36 return 0; 37} 38#endif // NCNN_STDIO 39 40int MyLayer::load_param(const unsigned char*& mem) 41{ 42 a = *(int*)(mem); 43 mem += 4; 44 45 b = *(float*)(mem); 46 mem += 4; 47 48 return 0; 49} 50``` 51 52## new param load api proposed 53### Pros 54#### clean and simple api 55#### default value 56#### extensible 57#### variable length array 58``` 597767517 60MyLayer mylayer 1 1 in out 0=100 1=1.250000 -23303=5,0.1,0.2,0.4,0.8,1.0 61``` 62``` 63binary 0xDD857600(magic) 64 65binary 0 66binary 100 67binary 1 68binary 1.250000 69binary -23303 70binary 5 71binary 0.1 72binary 0.2 73binary 0.4 74binary 0.8 75binary 1.0 76binary -233(EOP) 77``` 78```cpp 79int MyLayer::load_param(const ParamDict& pd) 80{ 81 // pd.get( param id (seq), default value ); 82 a = pd.get(0, 100); 83 b = pd.get(1, 1.25f); 84 85 // get default value for c if not specified in param file 86 c = pd.get(2, 0.001); 87 88 // get array 89 d = pd.get(3, Mat(len, array)); 90 return 0; 91} 92``` 93