函数指针

深入Delphi下的DLL编程

夙愿已清 提交于 2019-11-28 00:24:32
深入Delphi下的DLL编程 作者:岑心 引 言 相信有些计算机知识的朋友都应该听说过“DLL”。尤其是那些使用过windows操作系统的人,都应该有过多次重装系统的“悲惨”经历——无论再怎样小心,没有驱动损坏,没有病毒侵扰,仍然在使用(安装)了一段时间软件后,发现windows系统越来越庞大,操作越来越慢,还不时的出现曾经能使用的软件无法使用的情况,导致最终不得不重装系统。这种情况常常是由于dll文件的大量安装和冲突造成的。这一方面说明DLL的不足,另一方面也说明DLL的重要地位,以至我们无法杜绝它的使用。 DLL(动态链接库,Dynamic Link Library)简单来说是一种可通过调用执行的已编译的代码模块。DLL是windows系统的早期产物。当时的主要目的是为了减少应用程序对内存的使用。只有当某个函数或过程需要被使用时,才从硬盘调用它进入内存,一旦没有程序再调用该DLL了,才将其从内存中清除。光说整个windows系统,就包括了成百上千个dll文件,有些dll文件的功能是比较专业(比如网络、数据库驱动)甚至可以不安装的。假如这些功能全部要包括在一个应用程序(Application program)里,windows将是一个数百M大小的exe文件。这个简单的例子很容易解释DLL的作用,而调用DLL带来的性能损失则变得可被忽略不计。 多个应用程序调用同一个DLL

C语言程序设计(十二)

浪子不回头ぞ 提交于 2019-11-27 23:57:50
第十二章 结构体和共用体 当需要表示复杂对象时,仅使用几个基本数据类型显然是不够的 根本的解决方法是允许用户 自定义数据类型 构造数据类型(复合数据类型)允许用户根据实际需要利用已有的基本数据类型来构造自己所需的数据类型 它们是由基本数据类型派生而来的,用于表示链表、树、堆栈等复杂的数据对象 抽象数据类型不再单纯是一组值的集合,还包括作用在值集上的操作的集合 即在构造数据类型的基础上增加了对数据的操作,且类型的表示细节和操作的实现细节是对外不可见的 结构体类型数据存储的优点: 结构紧凑,易于管理 局部数据的相关性强,便于查找 赋值时只针对某个具体的对象,局部的输入错误不会影响全局 结构体:对关系紧密、逻辑相关、具有相同或者不同属性的数据进行处理 共用体:数据成员的情形是互斥的,每一时刻只有一个数据成员起作用 结构体模板的定义格式: struct 结构体名 { 数据类型 成员1的名字; 数据类型 成员2的名字; …… 数据类型 成员n的名字; }; 结构体的名字,称为结构体标签 构成结构体的变量,称为结构体成员 结构体模板只是声明了一种数据类型,定义了数据的组织形式,并未声明结构体类型的变量 typedef定义数据类型: typedef用于为系统固有的或程序员自定义的数据类型定义一个别名 typedef int INTEGER; typedef struct student

go 学习笔记之数组还是切片都没什么不一样

泄露秘密 提交于 2019-11-27 19:39:07
上篇文章中详细介绍了 Go 的基础语言,指出了 Go 和其他主流的编程语言的差异性,比较侧重于语法细节,相信只要稍加记忆就能轻松从已有的编程语言切换到 Go 语言的编程习惯中,尽管这种切换可能并不是特别顺畅,但多加练习尤其是多多试错,总是可以慢慢感受 Go 语言之美! 在学习 Go 的内建容器前,同样的,我们先简单回顾一下 Go 的基本语言,温度而知新可以为师矣! 上节知识回顾 如需了解详情,请于微信公众号[雪之梦技术驿站]内查看 go 学习笔记之值得特别关注的基础语法有哪些 文章,觉得有用的话,顺手转发一下呗! 内建类型种类 bool 布尔类型,可选 true|false ,默认初始化零值 false . (u)int , (u)int8 , (u)int16 , (u)int32 , (u)int64 , uintptr 2^0=1 , 2^1=2 , 2^2=4 个 字节 长度的整型,包括有符号整型和无符号整型以及 uintptr 类型的指针类型,默认初始化零值 0 . byte(uint8) , rune(int32) , string byte 是最基础 字节 类型,是 uint8 类型的 别名 ,而 rune 是 Go 中的 字符 类型,是 int32 的别名.最常用的字符串类型 string 应该不用介绍了吧? float32 , float64 ,

C语言程序设计(十)

孤者浪人 提交于 2019-11-27 18:47:41
第十章 字符串 字符串常量是由一对双引号括起来的一个 字符串序列 字符串实际就是由若干个有效数字构成且以字符'\0'作为结束的一个字符序列 C语言没有提供字符串数据类型,因此字符串的存取要用 字符型数组 来实现 字符型数组是由字符构成的数组,仅当其最后一个元素是'\0'时才表示字符串 字符串结束标志'\0'也占一个字节的内存,但 它不计入字符串的实际长度,只计入数组的长度 正确写法: char str[6] = {'H','e','l','l','o','\0'}; char str[] = {'H','e','l','l','o','\0'}; char str[] = {"hello"}; char str[] = "hello"; 编译系统会根据字符串中字符的个数来确定数组的大小 数组的大小为字符串中实际字符的个数加1 多个字符串需要存放在二维字符数组中 数组第一维的长度代表要存储的字符串的个数,可以省略 但是 第二维的长度不能省略 字符指针:指向字符型数据的指针变量 只要将字符串的首地址赋值给字符指针,即可让字符指针指向一个字符串 字符串常量本身代表的就是存放它的常量存储区的首地址,是一个地址常量 char *ptr = "Hello"; 等价于 char *par; ptr = "Hello"; /* 将保存在常量存储区中的"Hello"的首地址赋值给ptr

返回值为函数的函数

不羁的心 提交于 2019-11-27 16:31:41
1、 int (*pfun)(int, int); --通过括号强行将pfun首先与“*”结合,也就意味着,pfun是一个指针,接着与后面的“()”结合,说明该指针指向的是一个函数,然后再与前面的int结合,也就是说,该函数的返回值是int。由此可见,pfun是一个指向返回值为int的函数的指针。 来源: https://www.cnblogs.com/ArChieve/p/11370288.html

Go开发中的十大常见陷阱[译]

▼魔方 西西 提交于 2019-11-27 15:56:54
原文: The Top 10 Most Common Mistakes I’ve Seen in Go Projects 作者: Teiva Harsanyi 译者: Simon Ma 我在Go开发中遇到的十大常见错误。 顺序无关紧要。 未知的枚举值 让我们看一个简单的例子: type Status uint32 const ( StatusOpen Status = iota StatusClosed StatusUnknown ) 在这里,我们使用iota创建了一个枚举,其结果如下: StatusOpen = 0 StatusClosed = 1 StatusUnknown = 2 现在,让我们假设这个 Status 类型是JSON请求的一部分,将被 marshalled/unmarshalled 。 我们设计了以下结构: type Request struct { ID int `json:"Id"` Timestamp int `json:"Timestamp"` Status Status `json:"Status"` } 然后,接收这样的请求: { "Id": 1234, "Timestamp": 1563362390, "Status": 0 } 这里没有什么特别的,状态会被 unmarshalled 为 StatusOpen 。 然而

go 学习笔记之值得特别关注的基础语法有哪些

a 夏天 提交于 2019-11-27 15:17:20
在上篇文章中,我们动手亲自编写了第一个 Go 语言版本的 Hello World ,并且认识了 Go 语言中有意思的变量和不安分的常量. 相信通过上篇文章的斐波那契数列,你已经初步掌握了 Go 语言的变量和常量与其他主要的编程语言的异同,为了接下来更好的学习和掌握 Go 的基础语法,下面先简单回顾一下变量和常量相关知识. 有意思的变量和不安分的常量 变量默认初始化有零值 func TestVariableZeroValue(t *testing.T) { var a int var s string // 0 t.Log(a, s) // 0 "" t.Logf("%d %q", a, s) } int 类型的变量初始化默认零值是零 0 , string 类型的变量默认初始化零值是空字符串 ` `,其他类型也有相应的零值. 多个变量可以同时赋值 func TestVariableInitialValue(t *testing.T) { var a, b int = 1, 2 var s string = "hello Go" // 1 2 hello Go t.Log(a, b, s) } 其他主要的编程语言大多支持多个变量初始化,但极少数有像 Go 语言这样,不仅支持同时初始化,还可以同时赋值. 多个变量可以用小括号 () 统一定义 func

Linux内核中双向链表struct list_head

不羁的心 提交于 2019-11-27 10:22:48
一、双向链表list_head Linux内核驱动开发会经常用到Linux内核中经典的双向链表list_head,以及它的拓展接口和宏定义:list_add、list_add_tail、list_del、list_entry、list_for_each等。 在内核源码中,list_head结构体的定义在文件source_code/include/linux/types.h文件中,结构体定义如下: 通过这个结构体开始构建链表,然后插入、删除节点,遍历整个链表等,内核已经提供好了现成的调用接口。 1、创建链表 Linux内核中提供了下面的接口来进行双向链表初始化: 可以通过LIST_HEAD(my_lsit)来进行一个双向链表的初始化,初始化后,my_list的prev和next指针都将指向自己,如下: struct list_head my_list = {&my_list, &my_list}; 正常的链表都是为了遍历结构体中其它有意义的字段而创建的,但是上面定义的my_list中只有prev和next指针,因此没有实际意义的字段数据,所以,需要创建一个宿主结构,然后在此结构中嵌套my_list字段,宿主结构中又有其它的字段,例如: struct my_task_lsit {   int val;   struct list_head my_list; }

函数指针数组的最佳实践

▼魔方 西西 提交于 2019-11-27 08:45:26
1 #include<iostream> 2 #include<fstream> 3 #include<string.h> 4 using namespace std; 5 6 class Student; 7 8 typedef void(CALL)(Student*,int); 9 10 class Student 11 { 12 public: 13 string name; 14 int age; 15 char sex; 16 public: 17 Student(){} 18 ~Student(){} 19 }; 20 21 void write_object(Student *students,int size) 22 { 23 ofstream ofs("text.bat"); 24 if(ofs) 25 { 26 for(int i=0;i<size;i++) 27 { 28 cin>>students[i].name>>students[i].age>>students[i].sex; 29 ofs.write(reinterpret_cast<const char*>(&students[i]),sizeof(students[i])); 30 } 31 } 32 else 33 { 34 cout<<"write failed"<<endl; 35 } 36

delphi 多线程编程

我是研究僧i 提交于 2019-11-27 05:02:44
开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解. 先试试这个: procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := 0 to 500000 do begin Canvas.TextOut(10, 10, IntToStr(i)); end; end; View Code 上面程序运行时, 我们的窗体基本是 "死" 的, 可以在你在程序运行期间拖动窗体试试... Delphi 为我们提供了一个简单的办法(Application.ProcessMessages)来解决这个问题: procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := 0 to 500000 do begin Canvas.TextOut(10, 10, IntToStr(i)); Application.ProcessMessages; end; end; View Code 这个 Application.ProcessMessages; 一般用在比较费时的循环中, 它会检查并先处理消息队列中的其他消息. 但这算不上多线程, 譬如: 运行中你拖动窗体, 循环会暂停下来...