C/C++主调函数从被调函数中获取(各种类型)数据内容方式的梳理归纳

简介: C/C++主调函数从被调函数中获取(各种类型)数据内容方式的梳理归纳

在做图像处理过程中往往存在着需要获取到许多的信息,然后放到后续步骤中应用的场景。这样的场景可以概括为:主调函数获取被调函数中的数据内容,然后在后续流程中应用。而每次处理过程中,该场景的使用总是让自己需要考虑一会儿怎么设计函数和怎么实现。在这里就统一的梳理归纳一遍,加深印象也方便自己查阅。


基础数据类型(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");

1.png


总结:


第一种方法是最方便、最好理解的,也是适用全部函数传值操作的,但是缺点就是一个函数只有一个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

1.png

针对字符串这个问题,结合以上的总结进行了以下的尝试和测试,并最终解决该问题。设计的函数有:

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来获取,然后在主调函数中转换数据格式即可。

目录
相关文章
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
291 2
|
存储 C++
UE5 C++:自定义Http节点获取Header数据
综上,通过为UE5创建一个自定义HTTP请求类并覆盖GetResult方法,就能成功地从HTTP响应的Header数据中提取信息。在项目中使用自定义类,不仅可以方便地访问响应头数据,也可随时使用这些信息。希望这种方法可以为你的开发过程带来便利和效益。
602 35
|
存储 算法 安全
c++模板进阶操作——非类型模板参数、模板的特化以及模板的分离编译
在 C++ 中,仿函数(Functor)是指重载了函数调用运算符()的对象。仿函数可以像普通函数一样被调用,但它们实际上是对象,可以携带状态并具有更多功能。与普通函数相比,仿函数具有更强的灵活性和可扩展性。仿函数通常通过定义一个包含operator()的类来实现。public:// 重载函数调用运算符Add add;// 创建 Add 类的对象// 使用仿函数return 0;
382 0
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
350 0
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
1059 6
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
728 12
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
372 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
532 5
|
存储 编译器 程序员
C++类型参数化
【10月更文挑战第1天】在 C++ 中,模板是实现类型参数化的主要工具,用于编写能处理多种数据类型的代码。模板分为函数模板和类模板。函数模板以 `template` 关键字定义,允许使用任意类型参数 `T`,并在调用时自动推导具体类型。类模板则定义泛型类,如动态数组,可在实例化时指定具体类型。模板还支持特化,为特定类型提供定制实现。模板在编译时实例化,需放置在头文件中以确保编译器可见。
327 12
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。