Advertisement

关于枚举与函数返回值的使用总结——工作经验分享

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:PDF


简介:
本篇文章是作者对于工作中有关枚举类型和函数返回值处理的经验总结,旨在帮助开发者优化代码结构和提高程序可读性。 ### 枚举与函数返回值详解 #### 枚举类型概述 枚举是一种C语言中的数据类型,用于定义一组具有固定范围的常量集合。这种类型的使用能够使代码更加清晰且易于维护。 **定义及使用方法** 1. **定义枚举类型** - 定义一个枚举的基本语法如下: ```c enum 枚举名 { 枚举值列表 }; ``` - 其中`枚举值列表`由一系列具有特定含义的常量组成,每个元素之间用逗号分隔。 - 示例代码: ```c enum weekday { sun, mon, tue, wed, thu, fri, sat }; ``` 2. **声明枚举变量** - 定义完一个枚举类型后,可以通过以下方式来声明枚举变量: ```c // 先定义再声明 enum weekday { sun, mon, tue, wed, thu, fri, sat }; enum weekday a, b, c; // 同时定义和声明 enum weekday { sun, mon, tue, wed, thu, fri, sat } a,b,c; // 直接声明枚举变量 enum { sun ,mon,tue,wed,thu,fri,sat}a,b,c; ``` - 这几种方式在功能上是等价的,可以根据个人喜好或代码规范选择使用。 3. **赋值与使用枚举** - 枚举元素一旦定义便不可更改。它们被视作常量。 - 默认情况下,第一个枚举项为0,后续依次递增1。 - 示例: ```c enum weekday { sun, mon, tue, wed, thu, fri, sat }; enum weekday a = sun; printf(%d,a); // 输出 0 ``` - 若要给枚举变量赋特定的整数值,需要进行显式类型转换: ```c enum weekday a = (enum weekday)2; // 等同于 a=tue; ``` 4. **实际应用示例** - 枚举不仅限于表示星期几。例如,在IC卡状态管理的应用中枚举可以这样使用: ```c typedef enum { ICC_ERROR, ICC_NO_EXIST, ICC_EXIST, ICC_POWER_OFF, ICC_POWER_ON, ICC_IN_DIR_1001 } t_IccStatus; t_IccStatus geIccStatus; ``` #### 函数返回值 函数执行完成后,会将一个结果或状态信息以形式化的方式传递给调用者。在C语言中,这通常通过指定的数据类型来实现。 **使用方法** 1. **定义和理解** - 每个函数可以有一个返回值用来报告其运行状况。 - 返回值的类型可以在函数声明时明确指出,常用的类型包括`int`, `float`, `char`等。对于不需返回任何信息的函数,则指定为`void`。 2. **枚举作为返回值** - 使用枚举来定义可能的返回状态可以增强代码可读性和维护性。 - 例如: ```c typedef enum { OK = 0, ERROR, NOT_FOUND, ALREADY_EXISTS } Status; Status doSomething() { // 执行某些操作... if (* 成功 *) return OK; else if (* 错误 *) return ERROR; ... } ``` 3. **实际应用** - 在开发过程中,经常需要判断函数执行是否成功。通过定义特定的枚举值来表示不同的结果状态有助于快速定位问题。 - 使用枚举作为返回值还减少了硬编码数字的使用,使代码更清晰易懂。 #### 总结 掌握枚举类型和函数返回值是编写高质量C程序的关键。合理利用这些特性能够提高代码质量和可维护性。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • 使——
    优质
    本篇文章是作者对于工作中有关枚举类型和函数返回值处理的经验总结,旨在帮助开发者优化代码结构和提高程序可读性。 ### 枚举与函数返回值详解 #### 枚举类型概述 枚举是一种C语言中的数据类型,用于定义一组具有固定范围的常量集合。这种类型的使用能够使代码更加清晰且易于维护。 **定义及使用方法** 1. **定义枚举类型** - 定义一个枚举的基本语法如下: ```c enum 枚举名 { 枚举值列表 }; ``` - 其中`枚举值列表`由一系列具有特定含义的常量组成,每个元素之间用逗号分隔。 - 示例代码: ```c enum weekday { sun, mon, tue, wed, thu, fri, sat }; ``` 2. **声明枚举变量** - 定义完一个枚举类型后,可以通过以下方式来声明枚举变量: ```c // 先定义再声明 enum weekday { sun, mon, tue, wed, thu, fri, sat }; enum weekday a, b, c; // 同时定义和声明 enum weekday { sun, mon, tue, wed, thu, fri, sat } a,b,c; // 直接声明枚举变量 enum { sun ,mon,tue,wed,thu,fri,sat}a,b,c; ``` - 这几种方式在功能上是等价的,可以根据个人喜好或代码规范选择使用。 3. **赋值与使用枚举** - 枚举元素一旦定义便不可更改。它们被视作常量。 - 默认情况下,第一个枚举项为0,后续依次递增1。 - 示例: ```c enum weekday { sun, mon, tue, wed, thu, fri, sat }; enum weekday a = sun; printf(%d,a); // 输出 0 ``` - 若要给枚举变量赋特定的整数值,需要进行显式类型转换: ```c enum weekday a = (enum weekday)2; // 等同于 a=tue; ``` 4. **实际应用示例** - 枚举不仅限于表示星期几。例如,在IC卡状态管理的应用中枚举可以这样使用: ```c typedef enum { ICC_ERROR, ICC_NO_EXIST, ICC_EXIST, ICC_POWER_OFF, ICC_POWER_ON, ICC_IN_DIR_1001 } t_IccStatus; t_IccStatus geIccStatus; ``` #### 函数返回值 函数执行完成后,会将一个结果或状态信息以形式化的方式传递给调用者。在C语言中,这通常通过指定的数据类型来实现。 **使用方法** 1. **定义和理解** - 每个函数可以有一个返回值用来报告其运行状况。 - 返回值的类型可以在函数声明时明确指出,常用的类型包括`int`, `float`, `char`等。对于不需返回任何信息的函数,则指定为`void`。 2. **枚举作为返回值** - 使用枚举来定义可能的返回状态可以增强代码可读性和维护性。 - 例如: ```c typedef enum { OK = 0, ERROR, NOT_FOUND, ALREADY_EXISTS } Status; Status doSomething() { // 执行某些操作... if (* 成功 *) return OK; else if (* 错误 *) return ERROR; ... } ``` 3. **实际应用** - 在开发过程中,经常需要判断函数执行是否成功。通过定义特定的枚举值来表示不同的结果状态有助于快速定位问题。 - 使用枚举作为返回值还减少了硬编码数字的使用,使代码更清晰易懂。 #### 总结 掌握枚举类型和函数返回值是编写高质量C程序的关键。合理利用这些特性能够提高代码质量和可维护性。
  • numpy.where()说明
    优质
    本文档详细解释了Python库NumPy中的where()函数的工作原理及其返回值。通过实例帮助读者理解其在数组条件选择的应用。 `numpy.where()` 函数是 Python 的 NumPy 库中的一个非常实用的函数,它用于根据提供的条件返回数组中元素的索引。这个函数通常用来在数组中查找满足特定条件的元素,并返回这些元素的位置而非它们的值。 使用 `numpy.where()` 时的基本语法如下: ```python numpy.where(condition, [x, y]) ``` 这里,`condition` 是一个布尔类型的数组,用于表示需要检查的具体条件。如果 `condition` 中的某个位置为 `True` ,则返回对应位置在数组 `x` 或者 `y` 的元素;若为 `False` ,则返回另一个数组中的相应值。当仅提供参数 `condition` 时,此函数将输出满足该条件的所有元素的位置。 例如,在以下情况中: ```python x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) ``` 如果我们想找出所有大于5的数值在数组中的位置,可以使用 `numpy.where()` 函数如下所示: ```python indices = np.where(x > 5) ``` 在这种情况下,`indices` 是一个元组,其中包含两个数组。这两个数组分别代表满足条件元素所在的行索引和列索引。对于上述的 `x` 数组,执行此操作后得到的结果是 `(array([1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2]))` ,这表示元素 (6、7、8 和9) 在 `x` 中的位置。 对于以下的数组: ```python x = np.arange(9.).reshape(3, 3) result = np.where(x > 5) ``` 这里的输出结果是 `(array([2, 2, 2]), array([0, 1, 2]))`,表示 `x` 中满足条件 `x>5` 的元素位置为 (2,0)、(2,1) 和 (2,2),即数组中的6、7和8。 需要注意的是,在仅提供一个参数给 `numpy.where()` 函数时,返回的结果是满足条件的元素的位置索引而非它们的具体值。如果需要获取这些具体的数值,则可以结合使用其他 NumPy 方法如切片操作等来实现。 总结来说,`numpy.where()` 是处理数组中特定条件下查询的重要工具之一,它能够帮助我们高效地定位到数据中的目标位置,并在实际应用中与其它函数配合使用以进行更加复杂的条件赋值。
  • SpringMVC图片方法
    优质
    本文档详细探讨了使用SpringMVC框架时如何有效地返回图片。通过分析不同的方法和应用场景,为开发者提供实用的指导和技术解决方案。适合希望优化其Web应用中图像处理能力的技术人员阅读。 在SpringMVC框架内返回图片的方式多样,常见的包括直接通过响应对象输出二进制数据、提供指向图片的HTTP链接地址、以Base64编码形式传输或直接发送原始图像文件等方法。 I. 采用HttpServletResponse输出二进制格式 这种方式利用了`@RequestMapping`注解来定义请求映射,并结合`HttpServletResponse`对象设置响应头为特定类型的多媒体内容(如PNG),随后将图片的字节数据写入到该响应的对象流中。示例代码如下: ```java @RequestMapping(value = {/imgrender}, method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.OPTIONS}) @CrossOrigin(origins = *) @ResponseBody public String execute(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { byte[] imgData = xxx; // 假设xxx为获取图片字节数据的代码片段 httpServletResponse.setContentType(image/png); OutputStream os = httpServletResponse.getOutputStream(); os.write(imgData); os.flush(); os.close(); return success; } ``` 上述示例中,我们首先通过`@RequestMapping`注解定义了请求处理方法,并使用了跨域访问的支持。接着设置响应类型为PNG格式图像,并将图片的二进制数据写入到输出流中。 注意事项: 1. 设置正确的ContentType值。 2. 将图片字节序列正确地传递给HttpServletResponse对象中的OutputStream属性进行写操作。 3. 写完后记得刷新和关闭流以确保所有内容都被传输完毕且不会导致资源泄漏问题。 II. 多种返回方式的封装 为了灵活支持多种输出形式,例如HTTP链接、Base64编码或直接二进制数据等,可以定义一个请求参数模型类来集中管理这些选项。比如创建一个`BaseRequest`对象: ```java public class BaseRequest { private static final long serialVersionUID = 1146303518394712013L; private String outType; private String mediaType; public ReturnTypeEnum getReturnType() { return ReturnTypeEnum.getEnum(outType); } public MediaTypeEnum getMediaType() { return MediaTypeEnum.getEnum(mediaType); } } ``` 这里定义了`BaseRequest`类,其中包含了用于指定输出类型和媒体类型的属性。同时使用枚举来简化逻辑处理: ```java public enum ReturnTypeEnum { URL(url), STREAM(stream), BASE64(base); private String type; ReturnTypeEnum(String type) { this.type = type; } public static Map getMap() { if (null == map) { synchronized(ReturnTypeEnum.class){ if(null==map) map = new HashMap<>(3); for(ReturnTypeEnum e: values()) map.put(e.type,e); } } return map; } public static ReturnTypeEnum getByType(String type) { if(type == null) return null; return getMap().get(type); } } ``` III. 实现多种返回方式 通过使用`BaseRequest`类,可以在控制器方法中根据请求参数选择合适的图像输出策略。例如: ```java @Controller public class ImageController { @RequestMapping(value = /imgrender, method = RequestMethod.GET) public void execute(BaseRequest baseRequest, HttpServletResponse response) throws IOException{ byte[] imgData = xxx; // 假设xxx为获取图片字节数据的代码片段 if(baseRequest.getReturnType() == ReturnTypeEnum.URL){ // 返回指向图像资源的URL链接 }else if(baseRequest.getReturnType() == ReturnTypeEnum.BASE64){ // 输出Base64编码后的字符串表示形式 }else if(baseRequest.getReturnType() == ReturnTypeEnum.STREAM) { OutputStream os = response.getOutputStream(); response.setContentType(getMediaType().getMimeType()); os.write(imgData); } } ``` 此示例中,根据`outType`属性来决定具体采用哪种方式返回图像资源。
  • 带参
    优质
    本文章介绍了如何在编程中定义并使用不返回值但接受参数的函数。通过实例讲解了函数的设计原则及其应用场景。 本段落讨论的是有参数但无返回值的函数。
  • C/C++中
    优质
    本文将探讨C/C++编程语言中函数调用的基本概念和机制,包括参数传递、控制转移以及如何正确设置并使用返回值。 函数参数与函数调用: 1. 函数调用的作用: - 通过实参向形式参数传递数据; - 分配存储空间给传入的数据及在被调用的函数体内声明的变量; - 中断当前(即调用)的程序流程,将控制权转移到被调用函数的入口处,并开始执行该函数。 当没有实际参数时,表示此函数不会从其调用者那里接收数据。 2. 数值参数 传值调用:形式参数仅在函数被调用期间分配内存空间,并一直保留到返回为止。尽管形参和实参可能同名,但它们各自拥有独立的存储区域及生命周期,因此无法修改主程序中的变量。 3. 地址参数 传址调用:传递的是变量地址而非值本身,虽然主函数与被调函数分别在其各自的变量上进行操作,但由于使用相同的内存位置(即相同地址),这使得对一个地方的操作直接影响到另一个。
  • C语言中语句
    优质
    本文档旨在为学习者提供一份简洁明了的指南,专注于解析和总结C语言中的返回语句。通过深入浅出地讲解其用法与规则,帮助编程初学者更好地掌握这一基础而关键的概念。 关于C语言中的return语句总结如下: 1. 在C语言函数中使用`return`关键字可以终止当前执行的函数,并将控制权返回给调用该函数的地方。 2. `return`后面可跟一个表达式,其值会被传递回调用者。如果不需要返回任何具体的值,则可以在不带参数的情况下直接使用`return;` 3. 在主程序(main())中使用`return 0;`表示正常结束程序的执行;非零数值则用于标识异常终止。 4. 应该注意的是,当函数中有多个退出点时,应当确保所有可能路径上都正确处理了资源释放等善后工作。 以上是对C语言中关于`return`语句的一些总结。
  • GD32使和资料
    优质
    本专栏汇集了围绕GD32微控制器的学习资源与实战经验分享,旨在为开发者提供详实的技术支持和应用案例参考。 关于GD32的一些使用经验资料分享如下:该内容主要涉及实际操作中的经验和技巧,包括环境配置、Flash相关知识以及错误处理等方面的信息。希望这些材料能够对大家有所帮助。
  • 使STM32驱动TM1812
    优质
    本文将分享作者在使用STM32微控制器驱动TM1812 LED灯串时的心得与经验,包括硬件连接、代码编写和调试技巧。 STM32 驱动 TM1812 的一些经验是指在使用 STM32 单片机驱动全彩 LED 驱动芯片TM1812的过程中遇到的问题及解决方法的总结。 一、硬件电路设计问题 TM1812 是一款串行输入的LED驱动器,需要为每个颜色(红、绿和蓝)串联合适的限流电阻。根据笔者的经验,在红色LED上采用一个180欧姆的电阻,并在绿色与蓝色LED上各使用一个150欧姆的电阻可以达到较好的效果。设计电路时应注意参考TM1812的数据手册,以便进行适当的调整。 二、时序问题 由于TM1812需要串行数据输入,所以确保准确稳定的时序非常重要。芯片对高低电平保持时间的要求非常严格(只有几百纳秒),因此使用定时器延时效果不佳。笔者最初尝试通过系统定时器实现延时功能,但结果出现咬尾现象。之后改用空操作指令`__nop()`和for循环进行微小的延迟调整。 为了保证更好的时序控制,在实际编程中可以采用宏定义来完成简单的延时期望: ```c #define DIN_BIT_0() do{ // 定义IO口置零,插入若干个空操作指令,再将IO口置高。 GPIOA->BSRR = (uint16_t)0x0040; _nop(); _nop(); GPIOA->BRR = (uint16_t)0x0040; __nop(); }while(0) #define DIN_BIT_1() do{ // 定义IO口置零,插入若干个空操作指令,再将IO口置高。 GPIOA->BSRR = (uint16_t)0x0040; _nop(); _nop(); GPIOA->BRR = (uint16_t)0x0040; __nop(); }while(0) ``` 三、电平转换问题 根据TM1812的数据手册,其高电平输入的最低电压为3.8V。然而STM32的工作电压是3.3V,而TM1812则需要5V电源供给。起初笔者考虑了使用外部电路进行电平转换以适应这个需求,但后来发现两者实际上是可以直接兼容的——无需额外增加硬件来实现电平匹配。 总结来说,在使用STM32驱动TM1812时需注意三方面:合理设计LED驱动器和单片机之间的连接、严格控制数据传输的时序以及确保正确的电压水平。这些问题的有效解决能够保障两者的通信更加稳定可靠。