2019独角兽企业重金招聘Python工程师标准>>>

关于面向过程编程与指针的一些思考

长期以来,虽然有C语言的基础,但对C的使用主要停留在书面例子的基础上,没有复杂的功能和调用关系,因此,对面向过程的理解并不深刻。而使用java、js编写功能的时候,通常都是面向对象的思想。

在本例中,会有大量使用指针的场景,使得多个函数作用于同一个变量,C中没有成员函数的概念,函数是公有的,靠指针区别变量。这一点也让我有些不适应。

既然是一些思考,并没有刻意组织结构,会非常杂乱无章,请看到的朋友谅解。

在开始阅读教程的时候,函数与函数之间的调用、输出都感觉异常的别扭。下面逐步的分析下这个程序。如果有同道朋友看到了这篇博文,请配合摘要中github库的代码阅读。

程序主要做了哪些事?

在教程中,包含一个解析库,和一个单元测试,单元测试会统计:

  1. 执行了多少次测试
  2. 通过了多少次
  3. 通过率
  4. 返回一个标记

解析库是实际上执行解析动作的部分,主要包含:

  1. 根据json的标准去分析传入的字符串
  2. 根据不同的数据类型,讲解析后的结果放入json结构体

程序执行过程

单元测试是怎么工作的?

本教程中,单元测试主要包含一个基础的比较和信息输出函数(宏),以及一个在此基础上的不同形式的比较函数。 单元测试会调用实际的处理函数。

测试解析string类型json值的流程

test_parse_string函数

这个函数是测试分割string单元的入口:

static void test_parse_string() {TEST_STRING("", "\"\"");TEST_STRING("Hello", "\"Hello\"");

TEST_STRING是一个宏,这里只是替换下代码:

#define TEST_STRING(expect, json)                                              \do {                                                                         \lept_value v;                                                              \lept_init(&v);                                                             \EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, json));                        \EXPECT_EQ_INT(LEPT_STRING, lept_get_type(&v));                             \EXPECT_EQ_STRING(expect, lept_get_string(&v), lept_get_string_length(&v)); \lept_free(&v);                                                             \} while (0)

注意在TEST_STRING函数的一开始,有一句lept_value v;这个变量会存在于整个解析过程中,使用指针对这个变量进行修改,而最终的结果,也在这个宏函数中进行比较。形参中的json同理。面向过程编程中,数据和方法是分离的

接下来是变量v的初始化,对我来说,这显得有些无章法,调用一个函数,传给它一个变量的指针,对其做出修改,显然,这是C语言中常用的方式。

lept_parse_string函数

static int lept_parse_string(lept_context *c, lept_value *v) {size_t head = c->top, len;const char *p;EXPECT(c, '\"');p = c->json;for (;;) {char ch = *p++;switch (ch) {case '\"':len = c->top - head;lept_set_string(v, (const char *)lept_context_pop(c, len), len);c->json = p;return LEPT_PARSE_OK;case '\0':c->top = head;return LEPT_PARSE_MISS_QUOTATION_MARK;default:PUTC(c, ch);}}
}

lept_parse_string函数是实际上分割字符串的函数,主要做了这些事:

  1. 往栈中压入字符
  2. 错误检测与处理
  3. 将解析成功的字符串放入lept_value *v

这个函数中仍然有很多疑难点,需要时刻牢记一点函数与数据是分离的,会有多个函数通过指针的方式对数据做出更改,因此关于这个函数第一句size_t head = c->top, len;head就是为了记录更改前的c->top的值,这一点应该是在设计的时候就确定的,遗憾的是我需要在后面需要用到的时候才想到。

转载于:https://my.oschina.net/alextuan/blog/801758

关于面向过程编程的一些思考相关推荐

  1. 面向对象编程 面向过程编程_面向对象的编程真的是死定了

    面向对象编程 面向过程编程 重点(Top highlight) Programming in the 1960s had a big problem: computers weren't that p ...

  2. Golang面向过程编程-函数

    Golang面向过程编程-函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是函数 简单的说函数的作用就是把程序里多次调用的相同的代码部分定义成一份,然后起个名字,所有的 ...

  3. Day9:yield的表达式形式、面向过程编程(grep -rl 'root' /etc)

    一.yield的表达式 def foo():print('starting')while True:x=yield None#return 2print('value :',x) g=foo() pr ...

  4. python迭代器-迭代器取值-for循环-生成器-yield-生成器表达式-常用内置方法-面向过程编程-05...

    迭代器 迭代器 迭代: # 更新换代(其实也是重复)的过程,每一次的迭代都必须基于上一次的结果(上一次与这一次之间必须是有关系的) 迭代器: # 迭代取值的工具 为什么用迭代器: # 迭代器提供了一种 ...

  5. java面向过程编程怎么写_从面向过程到面向对象,我的编程之路

    也许现在新一代的程序员一开始涉足的就是c++,C#,Java这类面向对象的语言,如果这样,这篇文章可能得不到他们的认同. 这里,我只想写写我从面向过程到面向对象开发成长中的一些感想而已. 我最初学习的 ...

  6. 面向对象与面向过程编程的区别

    一.面向对象 面向对象技术是目前流行的系统设计开发技术,它包括面向对象分析和面向对象程序设计.面向对象程序设计技术的提出,主要是为了解决传统程序设计方法--结构化程序设计所不能解决的代码重用问题. 面 ...

  7. Systemverilog:面向对象编程与面向过程编程区别

    在学习验证的同学中开始学习大家都很对"对象"这个概念一脸懵,尤其是这个概念在后续的学习中非常的重要.不理解的话,就是很难理解面向对象编程这个对象到底是什么?和面向过程的C语言到底有 ...

  8. 什么是面向接口编程、面向过程编程、面向对象编程?

    1.什么是面向接口编程?(IOP) 面向接口编程(Interface Oriented Programming:IOP)是一种编程思想,接口作为实体抽象出来的一种表现形式,用于抽离内部实现进行外部沟通 ...

  9. opp原则_面向过程编程(OPP) 和面向对象编程(OOP)的关系

    面向过程编程(OPP) 和面向对象编程(OOP)的关系 原文链接:http://blog.csdn.net/phphot/article/details/3985480 关于面向过程的编程(OPP)和 ...

最新文章

  1. 有n个学生选修了c语言程序设计这门课程,C语言程序设计报告学生选修课系统(18页)-原创力文档...
  2. select * 和 select 所有字段的区别
  3. 时间序列预测实例(prophet的血泪史)
  4. response.sendRedirect()重新定向的乱码问题
  5. Golang学习之GOROOT、PATH、GOPATH及go get
  6. c语言用fun求矩阵,C语言通过函数调用求n*n阶矩阵周边元素绝对值之和
  7. oracle xml文件是什么文件,介绍关于Oracle下存取XML格式数据的方式
  8. 如何复制或导出托管磁盘
  9. 数据结构课程设计- (二) 栈与队列(迷宫问题)
  10. leach算法的实现过程_LEACH算法的MATLAB代码.doc
  11. gcc怎么编写c语言程序,gcc如何编译C语言程序
  12. 如何下载国外硕博论文?
  13. ip地址解析,ip归属地识别
  14. 360卸载软件测试初学者,360软件管家如何卸载软件?360软件管家卸载软件的方法步骤...
  15. 拳头产品|海泰虎讯,新一代安全即时通讯系统
  16. 蚊虫叮咬后的去痒妙方大全
  17. word2010 标尺游标的微调
  18. perl mysql 数据推拉_用perl 从mysql取出数据做统计分析代码
  19. python玫瑰花数量的含义_玫瑰花的数量代表的意义
  20. HTML页面一键分享到QQ空间、QQ好友、新浪微博、微信代码

热门文章

  1. 一步一步教你在IEDA中快速搭建SpringBoot项目
  2. Navicat下载和破解以及使用
  3. 10、mybatis参数处理
  4. lbs的核心技术都有哪些?_哪些行业适合做小程序呢?
  5. php3.2手册中文版,Uploadify v3.2中文手册分享
  6. swoole mysql 并发_Swoole4 如何打造高并发的PHP7协程Mysql连接池?
  7. java 集合数组初始化_Java用Arrays.asList初始化ArrayList实例方法
  8. vue v-model 简单使用
  9. 【docker】docker基础原理,核心技术简介
  10. linux每日命令(26):Linux文件属性详解