C语言接口的定义与实现

Python019

C语言接口的定义与实现,第1张

一个模块有两部分组成:接口和实现。接口指明模块要做什么,它声明了使用该模块的代码可用的标识符、类型和例程,实现指明模块是如何完成其接口声明的目标的,一个给定的模块通常只有一个接口,但是可能会有许多种实现能够提供接口所指定的功能。每个实现可能使用不同的算法和数据结构,但是它们都必须符合接口所给出的使用说明。客户调用程序是使用某个模块的一段代码,客户调用程序导入接口,而实现导出接口。由于多个客户调用程序是共享接口和实现的,因此使用实现的目标代码避免了不必要的代码重复,同时也有助于避免错误,因为接口和实现只需一次编写和调试就可多次使用

实现

一个实现导出一个接口,它定义了必要的变量和函数以提供接口所规定的功能,在C语言中,一个实现是由一个或多个.c文件提供的,一个实现必须提供其导出的接口所指定的功能。实现应包含接口的.h文件,以保证它的定义和接口的声明时一致的。

Arith_min和Arith_max返回其整型参数中的最小值和最大值:

int Arith_max(int x, int y) {

return x >y ? x : y

}

int Arith_min(int x, int y) {

return x >y ? y : x

}

Arith_div返回y除以x得到的商,Arith_mod返回相应的余数。当x与y同号的时候,Arith_div(x,y)等价于x/y,Arith_mod(x,y)等价于x%y

当x与y的符号不同的时候,C的内嵌操作的返回值就取决于具体的实现:

eg.如果-13/5=2,-13%5=-3,如果-13/5=-3,-13%5=2

标准库函数总是向零取整,因此div(-13,2)=-2,Arith_div和Arith_mod的语义同样定义好了:它们总是趋近数轴的左侧取整,因此Arith_div(-13,5)=-3,Arith_div(x,y)是不超过实数z的最大整数,其中z满足z*y=x。

Arith_mod(x,y)被定义为x-y*Arith_div(x,y)。因此Arith_mod(-13,5)=-13-5*(-3)=2

函数Arith_ceiling和Arith_floor遵循类似的约定,Arith_ceiling(x,y)返回不小于实数商x/y的最小整数

Arith_floor(x,y)返回不超过实数商x/y的最大整数

完整实现代码如下:

arith.c

抽象数据类型

抽象数据类型(abstract data type,ADT)是一个定义了数据类型以及基于该类型值提供的各种操作的接口

一个高级类型是抽象的,因为接口隐藏了它的表示细节,以免客户调用程序依赖这些细节。下面是一个抽象数据类型(ADT)的规范化例子--堆栈,它定义了该类型以及五种操作:

stack.h

实现

包含相关头文件:

#include <stddef.h>

#include "assert.h"

#include "mem.h"

#include "stack.h"

#define T Stack_T

Stack_T的内部是一个结构,该结构有个字段指向一个栈内指针的链表以及一个这些指针的计数:

struct T {

int count

struct elem {

void *x

struct elem *link

} *head

}

Stack_new分配并初始化一个新的T:

T Stack_new(void) {

T stk

NEW(stk)

stk->count = 0

stk->head = NULL

return stk

}

其中NEW是一个另一个接口中的一个分配宏指令。NEW(p)将分配该结构的一个实例,并将其指针赋给p,因此Stack_new中使用它就可以分配一个新的Stack_T

当count=0时,Stack_empty返回1,否则返回0:

int Stack_empty(T stk) {

assert(stk)

return stk->count == 0

}

assert(stk)实现了可检查的运行期错误,它禁止空指针传给Stack中的任何函数。

Stack_push和Stack_pop从stk->head所指向的链表的头部添加或移出元素:

void Stack_push(T stk, void *x) {

struct elem *t

assert(stk)

NEW(t)

t->x = x

t->link = stk->head

stk->head = t

stk->count++

}

void *Stack_pop(T stk) {

void *x

struct elem *t

assert(stk)

assert(stk->count >0)

t = stk->head

stk->head = t->link

stk->count--

x = t->x

FREE(t)

return x

}

FREE是另一个接口中定义的释放宏指令,它释放指针参数所指向的空间,然后将参数设为空指针

void Stack_free(T *stk) {

struct elem *t, *u

assert(stk &&*stk)

for (t = (*stk)->headtt = u) {

u = t->link

FREE(t)

}

FREE(*stk)

}

完整实现代码如下:

#include <stddef.h>

#include "assert.h"

#include "mem.h"

#include "stack.h"

#define T Stack_T

struct T {

int count

struct elem {

void *x

struct elem *link

} *head

}

T Stack_new(void) {

T stk

NEW(stk)

stk->count = 0

stk->head = NULL

return stk

}

int Stack_empty(T stk) {

assert(stk)

return stk->count == 0

}

void Stack_push(T stk, void *x) {

struct elem *t

assert(stk)

NEW(t)

t->x = x

t->link = stk->head

stk->head = t

stk->count++

}

void *Stack_pop(T stk) {

void *x

struct elem *t

assert(stk)

assert(stk->count >0)

t = stk->head

stk->head = t->link

stk->count--

x = t->x

FREE(t)

return x

}

void Stack_free(T *stk) {

struct elem *t, *u

assert(stk &&*stk)

for (t = (*stk)->headtt = u) {

u = t->link

FREE(t)

}

FREE(*stk)

}

什么叫C/CS接口?

单词“C”的来历是“cinema”(电影)的打头字母,C接口的起源是摄影机镜头。目前,C接口是由 从16毫米摄影机、电视摄像机、三目显微镜的标准接口。C接口镜头提供一个公口的螺纹与相机的母口配合。螺纹的直径是1英寸(25毫米),每英寸32圈螺纹,根据“ANSI B1.1”标准设计的。

*C接口的焦平面距离是17.526毫米。

*CS接口是焦平面距离12.52毫米,其余参数同 C接口 (C-Mount Adapter)。

所以使用一个“C/CS的5mm接环”就可以将“C口镜头”转换成“CS接口”

镜头C接口和CS接口的简单区分

以镜头安装分类所有的摄象机镜头均是螺纹口的, CCD 摄象机(CCD Microscope Camera)的镜头安装有两种工业标准,即C安装座和CS安装座。两者螺纹部分相同,但两者从镜头到感光表面的距离不同。两种主要的镜头安装标准,分别是C-mount 和 CS-mount。

他们都有一个1英寸长的螺纹并且看起来很相似。他们的不同在于镜头安装到摄像机后,镜头到传感器之间的距离:

CS-mount: 图像传感器到镜头之间的距离应为12.5 mm

C-mount: 图像传感器到镜头之间的距离应为17.5 mm。一个5 mm的垫圈(C/CS 连接环) 可用于将C-mount 镜头转换为CS-mount 镜头

C-mount是最初的标准,而CS-mount是对其的升级,该升级可降低制造成本并减小传感器尺寸。现在市场上销售的绝大多数摄像机和镜头都使用CS-mount标准。可以通过使用C/CS连接环将一个老的C-mount镜头安装到带有CS-mount接口的摄像机上。如果摄像机无法聚焦,则可能是因为使用了错误的镜头类型。

C型接口的特点

C型接口在国际上有严格的规格要求,根据“ANSI B1.1”国际标准设计,C型接口的每个螺纹的直径是1英寸(25毫米),也就是每英寸32圈螺纹,而C型接口的安装基准面到焦平面距离也严格规定为17.526mm。

显微镜接口特点

1.适用性广,适用任何品牌的显微镜; 

2.新对焦技术,使用中心对焦工艺和光学技术,使更快,更容易地对焦 ;

3.图像质量高,使系统摄像更加固定,不会产生振动而影响图像质量 ;

4.外型设计小巧,外型小巧、美观。

C型接口的应用

C型接口主要分为U-TV1.0XC、U-TV0.63XC、U-TV0.5XC。现主要用于三目显微镜的第三目镜筒的安装,目的在于实现光学显微镜与数码成像设备的耦合。显微摄像头、数码单反相机、数码卡片相机都可以通过C型接口连接在显微镜上,实现显微图像的拍摄

应用程序编程接口,简称API(Application Programming Interface),就是软件系统不同组成部分衔接的约定。

随着软件规模的日益庞大,我们需要把复杂系统划分成小的组成部分,编程接口的设计十分重要。程序设计的实践中,编程接口的设计首先要使系统的职责得到合理划分。良好的接口设计可以降低系统各部分的相互依赖,提高组成单元的内聚性,降低组成单元间的耦合程度,从而提高系统的维护性和扩展性。

API之主要目的是提供应用程序与开发人员以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。提供API所定义的功能的软件称作此API的实现。API是一种接口,故而是一种抽象。 A reference implementation of an API is the implementation created by the designer of the API, or one which other implementations of the API are expected to be compared against.

例如,图形库中的一组API定义调用绘制图标函数的方式,以于屏幕上显示图标。程序中调用,编译时连接到这组API,执行时便调用API的实现(库)来显示图标。

操作系统的API可用来分配内存或访问文件。许多系统与应用程序提供API接口与实现,比如图形系统,数据库,网络,Web服务,甚至于某些游戏。

一组API经常是一套软件开发工具包(SDK)的一部分。SDK亦可包含其它工具亦或至于硬件,两个术语并不完全等同.

API有诸多不同设计。用于快速执行的接口通常包括函数,常量,变量与数据结构。也有其它方式,如通过解释器,或是提供抽象层以遮蔽同API实现相关的信息,确保使用API的代码无需更改而适应实现变化。