函数指针

Day04 (一)_TCP传输服务器端设计

给你一囗甜甜゛ 提交于 2020-01-31 14:37:08
前言 IP 地址的作用是唯一识别网络中的主机, IP 位于网络层 协议 + 端口号:可以唯一识别主机中的应用程序(进程) 这样,利用三元组( IP 地址,协议、端口)就可以标识网络的进程,网络中的进程通信就可以利用这个标识与其他进程进通信。 套接字 Socket 的来龙去脉: socket 即是一种特殊的文件,一些 socket 函数就是对其进行的操作(打开、读 / 写 IO 、关闭),这些函数我们在后面进行介绍。在组网领域的首次使用是在 1970 年 2 月 12 日发布的文献 IETF RFC33 中发现的,撰写者为 Stephen Carr 、 Steve Crocker 和 Vint Cerf 。根据美国计算机历史博物馆的记载, Croker 写道:“命名空间的元素都可称为套接字接口。一个套接字接口构成一个连接的一端,而一个连接可完全由一对套接字接口规定。”计算机历史博物馆补充道:“这比 BSD 的套接字接口定义早了大约 12 年。 8.1 TCP/IP TCP/IP :传输控制协议 / 网络协议是指能在多个不同网络间实现信息传输的协议簇。本协议不仅仅指的是 TCP 和 IP 两个协议,还有 FTP 、 SMTP 、 TCP 、 UDP 、 IP 等协议构成的协议簇。 根据以上介绍,可以看出 TCP/IP 协议中包含有 UDP 协议,姑且可以这样认为: UDP 是 TCP

Power up C++ with the Standard Template Library: Part I[翻译]

隐身守侯 提交于 2020-01-31 12:39:35
Power up C++ with the Standard Template Library: Part I 【原文见: http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=standardTemplateLibrary 】 作者 By DmitryKorolev Topcoder 成员 翻译 农夫三拳@seu Containers Before we begin Vector Pairs Iterators Compiling STL Programs Data manipulation in Vector String Set Map Notice on Map and Set More on algorithms String Streams Summary 也许你已经使用C++作为主要编程语言来解决Topcoder中的问题了,这就意味着你已经在简单的使用 STL了,因为数组和字符串都是以STL对象的方式传入到你的函数中的。也许你已经注意到了,有许多 程序员他们写代码要比你快并且代码也比你的简洁。 也许你不是一个C++程序员,但是因为C++的强大功能以及它的库(或者因为你在Topcoder practice 房间和比赛里面看到的简短的解决方案),你想成为一个这样的程序员。 不管你来自哪里,这篇文章将会帮助你掌握它

Leetcode(中文)笔记

纵饮孤独 提交于 2020-01-31 05:01:09
Leetcode(中文)笔记 最近在刷leetcode,顺便整理一下笔记,用于自我梳理。目前第一遍仅使用Python。 持续更新中。。。 双指针 26.删除排序数组中的重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 暴力求解: class Solution : def removeDuplicates ( self , nums : List [ int ] ) - > int : i = 0 while i < len ( nums ) - 1 : if nums [ i ] == nums [ i + 1 ] : nums . pop ( i + 1 ) else : i += 1 return len ( nums ) 双指针法: 第一个指针:遍历数组,每遇到nums[j] != nums[i],就说明遇到了新的不同数字,记录之; 第二个指针:每遇到新的不同数字时,执行i += 1, i指针有两个作用:记录数组中不同数字的数量;作为修改数组元素的索引index。 最终,返回i+1即可。 class Solution : def removeDuplicates ( self , nums : List [ int ] ) -

C++知识点汇总文档

蓝咒 提交于 2020-01-29 03:14:26
C++知识点汇总文档 持续更新 朝花夕拾. 不写下来, 仿佛一切都没了见证. 编程来源于生活, 无非是对现实的抽象. 整理这份文档的时候我才发现, 自己对C++的了解无非是冰山一角 另, C++11真的 太恐怖了 , 新"特性"真的是"恐怖如斯" 另注: 本人才疏学浅, 难免有错漏之处, 还望不吝赐教 1.基本概念 内存管理 C++中的内存划分(内容来自 博客 ): 堆 由用户使用new delete关键字管理的内存区域 栈 栈中用来存放临时变量, 比如函数中的局部变量, 在代码块结束时会自动清除 自由存储区 由malloc等分配的内存块, 他和堆是十分相似的, 不过它是用free来结束自己的生命的 全局/静态存储区 全局变量和静态变量被分配到同一块内存中 常量存储区 比较特殊的存储区, 他们里面存放的是常量(不太了解, 有空扫下盲) new 关键字 用来在内存(堆)中开辟一块空间, 用户获得一个指向内存中目标位置的指针 用法 参考示例 //申请一块指向单个int对象的内存, 并将值初始化为"5" int *ptr_0 = new int(5); //申请一块指向5个连续int类型对象的内存 //使用C++11统一的花括号初始化, 直观地对内存进行初始化 int * ptr_1 = new int[5]{1,2,3,4,5}; delete 关键字 删除 使用new申请的内存 用法

最全面的C/C++编码规范总结

牧云@^-^@ 提交于 2020-01-28 20:02:33
C语言是面向过程的,而C++是面向对象的 对于不同的编程语言来说,具体的编码规范可以有很大的不同,但是其宗旨都是一致的,就是保证代码在高质量完成需求的同时具备良好的可读性、可维护性。例如我们可以规定某个项目的C语言程序要遵循这样的规定:变量的命名,头文件的书写和#include 等等。 下面是一些广为采用的编码规范: GNU Coding Standards Guidelines for the Use of the C Language in Vehicle Based Software C++ Coding Guidelines SUN Code Conventions for Java 以下是一些介绍编码、编码规范的书籍: C++编码规范,陈世忠,人民邮电出版社,2002 高质量程序设计指南:C++/C语言,林锐等,电子工业出版社,2003 注:以下只是根据课题组已有的经验给出的总结,并非对所有场景均适用。 对于高质量的工程,一般会做到: 代码简洁精炼,美观,可读性好,高效率,高复用,可移植性好,高内聚,低耦合,没有冗余,不符合这些原则,必须特别说明。 规范性,代码有规可循。特殊排版、特殊语法、特殊指令,必须特别说明。 小编推荐一个学C语言/C++的学习裙【 二六三,六八八,二七六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具

std cpp、std c模块通过函数指针调用qt的功能

本小妞迷上赌 提交于 2020-01-27 02:30:33
需求 win、vs环境下开发cpp程序,多个库,有std cpp、qt、std c… 因为qt的ts、qm、QCoreApplication::translate、lupdate…这一套东西方便了多语言的实现,所以希望在标准c、cpp库中也能用到qt这一套东西,但又不希望在基础库中引入qt库。 实现 在一个std cpp库中定义一个函数指针pFunc, 在qt cpp log库中定义此函数Func,并在初始化时赋值给pFunc。 类似这种需求都可以考虑采用函数指针来实现,相当于汇编级别的跳转指令。 std cpp库中定义一个函数指针pFunc: namespace StdErrorLog { enum EnumLogLevel { kELL_TRACE = 0 , /**< 0,跟踪 */ kELL_DEBUG , /**< 1,调试 */ kELL_INFOR , /**< 2,信息 */ kELL_WARNG , /**< 3,警告 */ kELL_ERROR , /**< 4,错误 */ kELL_FATAL , /**< 5,致命问题 */ kELL_OFF , /**< 6,关闭所有错误输出 */ kELL_ALL = kELL_TRACE , /**< 0,打开所有错误输出 */ } ; } typedef void ( * StdWriteErrorFuncType

x264阅读记录-1

*爱你&永不变心* 提交于 2020-01-26 17:41:48
x264阅读记录-1 采用x264版本是x264-snapshot-20060316-2245。 1. main函数 x264的main函数位于x264.c中,下面是main函数调用情况: (1)_setmode函数和_fileno函数 这两个函数是微软提供的两个库函数。 _setmode函数位于io.h文件中,主要作用是设置特定模式匹配的文件。http://msdn.microsoft.com/zh-cn/library/vstudio/tw4k6df8.aspx _fileno函数位于stdio.h文件中,用于获取文件流所对应的描述符。http://msdn.microsoft.com/zh-cn/library/vstudio/zs6wbdhx.aspx 下面的语句主要实现的是将Windows下默认的Text模式,按需要设置为BINARY模式, _setmode ( _fileno ( stdin ), _O_BINARY ); 还有一点,这个语句位于预编译命令中,其中涉及到一个宏 _MSC_VER。这个宏是VC编译环境的预定义宏,主要是计算为编译器的主版本号和次版本号元素。 专业数字为句点分隔的版本号的第一个元素,并且该次版本号是第二个元素。 因此,如果Visual C++编译器的版本号为15.00.20706.01,_MSC_VER 宏计算结果为1500。在 Visual

Nginx学习笔记 ---高级数据结构

寵の児 提交于 2020-01-26 03:15:31
动态数组 ngx_array_t 表示一块连续的内存,其中存放着数组元素,概念上和原始数组很接近 // 定义在 core/ngx_array.h typedef struct { void * elts ; // 数组的内存位置,即数组首地址 ngx_uint_t nelts ; // 数组当前的元素数量 size_t size ; // 数组元素的大小 ngx_uint_t nalloc ; // 数组可容纳的最多元素容量 ngx_pool_t * pool ; // 数组可使用的内存池 } ngx_array_t ; elts 就是原始的数组,定义成 void*,使用时应强转成相应的类型 nelts 相当于 vector.size(); size 相当于 sizeof(T); nalloc 相当于 vector.capacity(); pool 数组使用的内存池,相当于 vector 的 allocator 数组里的元素不断增加,当 nelts > nalloc 时将引起数组扩容,ngx_array_t 会向内存池 pool 申请一块两倍原大小的空间————这个策略和 std::vector 是一样的 但 ngx_array_t 扩容成本太高,它需要重新分配内存并且将数据拷贝,所以最好一次性分配足够的空间,避免动态扩容 操作函数: 使用 ngx_array_t.elts

Linux网络驱动整理

大城市里の小女人 提交于 2020-01-26 00:54:26
网络设备是 完成用户数据包在网络媒介上发送和接收的设备 ,它将上层协议传递下来的数据包以 特定的媒介访问控制方式 进行发送,并将接收到的数据包传递给上层协议。应用程序使用 套接字(socket) 完成与网络设备的接口。 Linux网络设备驱动的结构 Linux 系统对网络设备驱动的驱动体系从上到下划分为4个层次,依次为为 网络协议接口层、网络设备接口层、提供实际功能的设备驱动功能层和网络设备与媒介层 ,4层的作用如下: 网络协议接口层 向 网络层协议提供统一的数据包收发接口 ,不论上层协议为 ARP 还是 IP,都通过 dev_queue_init()函数发送数据 ,并通过 netif_rx()函数接收数据 。这一层的存在使得上层协议独立于具体的设备。 网络设备接口层 向 协议接口层提供统一的用于描述具体网络设备属性和操作的结构体net_device ,该结构体是设备驱动功能层中各函数的容器。实际上,网络设备接口层从宏观上规划了具体操作硬件的设备驱动功能层的结构。 设备驱动功能层 各函数是 网络设备接口层 net_device 数据结构的具体成员 ,是驱使网络设备硬件完成相应动作的程序,它通过 hard_start_xmit()函数启动发送操作 ,并通过网络设备上的 中断触发接收操作 网络设备与媒介层 是完成数据包发送和接收的物理实体,包括网络适配器和具体的传输媒介

线性表顺序存储基本操作

左心房为你撑大大i 提交于 2020-01-24 18:52:26
线性表的基本操作 //线性表的基本操作 /* Status,自定义的一个枚举类型, enum Status{ success(成功),fail(失败),fatal(内存分配失败),range_error(连续空间访问失败越界) } */ Status List_Init(SqListPtr L);//初始化线性表 void List_Clear(SqListPtr L);//清空线性表 void List_Destory(SqListPtr L);//销毁线性表 bool List_Empty(SqListPtr L);//判断线性表是否为空 int List_Size(SqListPtr L);//线性表中元素的个数或线性表的长度 Status List_Retrival(SqListPtr L,int pos,ElemType *elem);//在线性表L中的pos那个位置取出数据放在elem指针中 Status List_Locate(SqListPtr L,ElemType elem,int *pos);//在线性表L中找出元素elem的位置放在pos指针中 Status List_Prior(SqListPtr L,int pos,ElemType *elem);//在线性表L中求出pos那个位置元素的直接前驱放在elem指针中 Status List_Next