在做图像处理过程中往往存在着需要获取到许多的信息,然后放到后续步骤中应用的场景。这样的场景可以概括为:主调函数获取被调函数中的数据内容,然后在后续流程中应用。而每次处理过程中,该场景的使用总是让自己需要考虑一会儿怎么设计函数和怎么实现。在这里就统一的梳理归纳一遍,加深印象也方便自己查阅。
基础数据类型(int,double,float等)从函数中获取并传出数据内容方式,以int为例主要有以下几种情况:
1、调用函数return传出
2、int作为函数参数使用&获取内容传出
3、使用数组作为参数获取内容传出
4、使用指针作为参数获取内容传出
基于此设计的函数有:
int Func1() { return 1; } void Func2(int &value) { value = 2; } void Func3(int value[],int n) { for(int i = 0;i < n;i++) { value[i] = 3; } } void Func4(int *value,int len) { for(int i = 0;i < len;i++) { *(value+i) = 4; } }
调用测试:
//1、调用函数return传出 int a = 0; a = Func1(); printf("Func1--return a :%d \n",a);//1 //2、int作为函数参数使用&获取内容传出 Func2(a); printf("Func2--& a :%d \n",a);//2 //3、使用数组作为参数获取内容传出 int b[1] = {0}; Func3(b,1); printf("Func3--b[] :%d \n",b[0]);//3 //4、使用指针作为参数获取内容传出 int *c = new int[10]; Func4(c,10); printf("Func4--*c :"); for(int i = 0;i < 10;i++) { printf("%d",*(c+i)); }//4444444444 printf("\n");
总结:
第一种方法是最方便、最好理解的,也是适用全部函数传值操作的,但是缺点就是一个函数只有一个return只能传出一个内容,遇到复杂和传出内容多的情况往往还是需要使用参数方式。
后三种都是使用的参数传值方式,其中均是通过操作数据的内存地址来获取数据内容。区别在于第2、3两种则是直接使用了栈区的内存,第4种则是手动在堆区创建内存。第2种也只适合传递单值,而第3、4两种方式需要明确数据内容长度。
所以总体来说,这些方式均有优劣,具体使用需要结合具体需求来使用。
对于复杂的数据内容将需要更高级的参数形式去获取数据内容,比如二级指针,二维数组等等多级指针/数组。这些用法类似于一级指针和一维数组的,但可能需要考虑组织形式就更复杂些。
最近在处理图像过程出现的一个具体问题是:如何从函数中传出需要获得的字符串内容。
对于单个字符(char)的获取,也是基础数据类型,以上四种也适用,其自身的取址符&获取实现有:
void Func7(char &value) { value = 'a'; } test char t;//单个字符的获取 Func7(t); printf("Func7--char& :%c \n",t);//a
针对字符串这个问题,结合以上的总结进行了以下的尝试和测试,并最终解决该问题。设计的函数有:
void Func5(char *buf) { const char* p = "a*10+a*b*10+c*5+ABC"; strcpy(buf,p);//拷贝 } void Func6(string &buf) { const char* p = "a*10+a*b*10+c*5+ABC"; buf = p; }
一是使用return传出需要的字符串,可声明函数string fun();char* fun();但实际案例中return需要用于其他数据内容。
二是使用了数组和指针传递数据内容:
char array[1024] = {0}; Func5(array); printf("Func5--char[] :%s \n",array); char*array1 = new char[512]; Func5(array1); printf("Func5--char* :%s \n",array1); delete []array1;array1=NULL;
这两种形式其实是可共用一个函数的,弊端是两者都需要自己定义数据长度,如果数据内容未知或者变化的,
那么往往需要增加内存开销去使用大的内存空间来保证能够全部将数据内容获取到而不是部分,也不会导致内存溢出报错; 另外,手动创建的内存也需要重新将其手动释放。
三是使用string&来获取数据内容:
string buf = ""; Func6(buf); printf("Func6--string& :%s \n",buf.c_str());
而对于拿到的string数据则可以与char*,char []等进行互相转换,具体参考这篇文章。
这样的话以后对于字符串的数据内容的传值问题均可以通过string来获取,然后在主调函数中转换数据格式即可。