abplc7用户自定义数据类型

abplc7用户自定义数据类型
abplc7用户自定义数据类型

UDT----用户自定义数据类型(看不懂也要坚持一下,理解了这部分就不是新手了)

在本章中,我们将介绍如何通过用户自定义数据类型和数据范围划定来规划标签数据库。这里将学到

§ 了解使用 UDT 的优势

§ 学习如何优化 UDT 规划

§ 使用数据范围划定帮助简化并加快开发工作

我们现在将重点关注 Logix 控制器中的数据规划。

打开现有控制器文件

1. 在计算机桌面上,双击Lab Files文件夹。

2. 双击名为Conveyor_Program_S

3.ACD的现有项目。

这样将在 RSLogix 5000 中启动该项目。

为传送带创建用户自定义数据类型

您已重新组织了程序规划以更好地利用 Logix,现在已准备好开始对数据规划进行重新组织。可注意到,工程师规划数据的方式仍像使用带有整数、实数和定时器数据表的传统 PLC 一样。问题是,当与设备关联的数据分布到控制器内存中的各处时便很难进行跟踪。您已再次决定充分利用 Logix,使用用户自定义数据类型。

用户自定义数据类型

用户自定义数据类型也称为 UDT 或结构,借此按逻辑方式对数据进行组织或分组,以便所有与设备关联的数据都可组合在一起。

例如,每个传送带都有 8 个整数值、3 个实数值、2 个定时器和 11 个与其关联的布尔值。在传统PLC 中,可能需要 4 个不同的数据表。然后,当您具有多条传送带时,您可能需要详细地将传送带映射到各个数据表中。这样就会变得很难管理。

通过 UDT 能够实现的是将不同的数据类型(整数、实数、定时器、布尔等)组合到一起,共同作为用户自定义数据类型。然后便可创建该 UDT 类型的数组。这可使得编程工作、代码的记录和数据的跟踪都更加轻松。

1. 在控制器项目管理器中,双击"控制器标签"(Controller Tags)。

将出现标签编辑器。可注意到,标签数据库的外观与传统 PLC 非常类似。

Logix 标签数据库

在传统 PLC 中,用物理地址标识各个数据项,例如 N7:0 或 B3:0/0。不使用地址注释或符号,就很难阅读逻辑。

在 Logix 控制器中没有固定的内存 N7:0 或 B3:0/0。Logix 内存是基于标签的系统。标签名称本身就可以标识数据。借此便能够组织数据以模拟机器。您可在实际中

使用分配的标签名称记录代码,例如 Nozzle_1_Temperature。

参考信息

创建 Logix 项目标签的指导原则

2. 在标签编辑器中单击N7旁边的+。

这将展开 N7 数组,显示其中的所有元素。可注意到从 N7[0] 到 N7[7] 的数据已定义。然后是从 N7[20]到 N7[27] 和从 N7[40] 到 N7[47]。这些区域分别对应 3 个传送带,是传统的 PLC 数据表布局。

3. 也仔细查看 B3、F8 和 T4。

它们都将采用相同的格式:传送带 1 从 [0] 开始,传送带 2 从 [20] 开始,传送带 3 从 [40] 开始。这样做的目的是使得在标签数据库中查找传送带数据更加容易。这样确实有一定作用,但是您为传送带使用了4 个数据表,浪费内存。

而通过创建 UDT 可更好地实现这一点。我们现在就来创建 UDT。

4. 在控制器项目管理器中的"数据类型"(Data Types) 文件夹下,单击"用户自定义"(User-Defined)旁边的+。

您将注意到这里有一个名为 Conveyor 的 UDT(已为您启动 UDT 的创建)。

5. 双击Conveyor。

这将为 Conveyor 数据类型打开 UDT 编辑器。可以看到,UDT 混合不同的数据类型。在编程时这是非常有用的工具。

用户自定义数据类型的指导原则

§ 创建用户自定义数据类型时,记住以下指导原则:

§ 如果包括表示 I/O 设备的数据,则必须使用逻辑将数据复制到 UDT 中。UDT 中不可为 I/O 指定别名。

§ 如果要在 UDT 中包括数组,应将数组限制为一维。UDT 不支持多维数组。

§ 创建 UDT 时,将类似的数据类型组合到一起。这将创建更为紧凑的 UDT。

查看 UDT 后,您会注意到,类似的数据类型并未组合到一起。BOOL 和 REAL 数据类型混在一起。UDT的当前大小是 52 个字节。将 BOOL 组合在一起可降低这一数字。

6. 要进行此操作,单击Motor_Overload的左侧。这样将选中整行。

7. 单击"向上移动"(Move Up)按钮。

这会在 UDT 中将 Motor_Overload 标签向上移动。

8. 对其它 BOOL 标签重复此操作,直到它们均组合到一起。

9. 单击"应用"(Apply)。

现在请注意一下 UDT 的大小。您已节省了 12 个字节。

10. 完成对 BOOL 标签的移动后,验证 UDT 的显示如下:

11. 回到"控制器标签"(Controller Tags),展开N7标签并注意 N7[0] 到 N7[7] 及其描述。

12. 使用标签的描述将这些标签添加到 UDT。手动执行行此操作(并要记住参考前文中的指导原则 4)。

13. 完成后,单击"应用"(Apply)接受所做更改并验证 UDT 应类似下图。

您现在已拥有一个在程序中定义传送带的完整 UDT。

14. 单击"确定"(OK)关闭 UDT 编辑窗口。

15. 在"文件"(File)菜单中选择"关闭"(Close)。软件将询问您是否要保存对文件所做的更改,选择"否"(No)。

使用传送带UDT

现在您将使用刚创建的 UDT 传送带。您意识到 UDT 将帮助优化标签数据库,并使代码的故障处理和开发更容易。

1. 在 RSLogix 5000 的工具栏菜单中,选择"文件> 打开"(File > Open)。

2. 双击名为Conveyor_Program_S4.ACD的现有项目文件。

这样将在 RSLogix 5000 中启动该项目。

3. 在控制器项目管理器中,双击"控制器标签"(Controller Tags)。

这将打开标签编辑器。

查看标签编辑器,您将发现数据库中有一个新标签Conveyor_1。

4. 单击Conveyor_1旁边的+展开该标签。

您可注意到标签的格式与刚创建的 UDT 相同。这可通过查看"类型"(Type) 列进行确认。

5. 在控制器项目管理器中,单击各个程序的+,展开连续任务中的 3 个传送带程序。

6. 双击例程C2_Start_Stop。这将打开该例程,并可进行查看和编辑操作。

7. 现在显示的是梯形图例程C2_Start_Stop。

您可注意到,在此实例中 Conveyor_2 的寻址方式仍使用的是传统 PLC 的的寻址方式。例如,在梯级 0上,定时器的地址为 T4[20]。

8. 双击例程C1_Start_Stop。

这将打开该例程,并可进行查看和编辑操作。

9. 现在显示的是梯形图文件C1_Start_Stop。

可注意到传送带 1 的寻址方式使用的是 UDT。如您所见,代码现在可以自文档化,而且标签名称可描述其具体的意义。您无需再像传统 PLC 中一样添加地址描述。代码中仍有一些较早样式的地址;我们将稍后处理它们。

现在我们来继续更新其它两个传送带程序以使用 UDT。首先我们需要创建两个新标签。

10. 在工具栏菜单中,选择"窗口> 控制器标签 - Conveyor_Program(控制器)"(Window > Controller Tags – Conveyor_Program(controller))。

这会将标签编辑器窗口置于顶层。

11. 在标签编辑器窗口的左下角处,单击"编辑标签"(Edit Tags)选项卡。

在这里我们将创建两个新标签,Conveyor_2 和 Conveyor_3。

12. 在标签编辑器中列表的底部,可注意到那里有一个开放空间,可创建一个新标签。

13. 在"名称:"(Name:)列中,输入"Conveyor_2"并在"类型"(Type) 列中输入"Conveyor"。

这样便会创建一个传送带类型的名称为 Conveyor_2 的标签。

只要记录中仍可看到铅笔图标,您便仍处于编辑模式下。

14. 要创建新标签,单击 Conveyor_2 下面的新空白行,并验证标签编辑器的显示如下:

15. 使用与上述相同的方法,为Conveyor_3创建标签。

16. 完成后,验证标签数据库的显示如下:

现在我们将需要更新梯形图代码以使用这些新标签。我们将从 Conveyor_2 开始。

我们将仅修改 Alarm_Status 和 Energy_Manag 例程。使用下表并参考 Conveyor_1 例程。

让我们从一个示例开始。

17. 在控制器项目管理器中,双击例程C2_Alarm_Status。

重要说明:我们目前将忽略任何在描述中包括文字"映射"的 B3 地址。18. 在梯级零上,注意描述为C2电机过载的 OTE 指令。

通过查看前一页中的图,您可发现此描述与 UDT 中的第二个成员相匹配。

19. 要更改地址,双击B3[28]。

这将打开一个下拉框,以便您可选择一个新标签。

20. 单击向下箭头(这将打开标签浏览器),滚动浏览列表直到您找到Conveyor_2。

21. 单击+展开该标签,然后选择Conveyor_2.Motor_Overload,如下所示:

22. 双击Conveyor_2.Motor_Overload。

这会令 Conveyor_2.Motor_Overload 成为 OTE 指令的新标签。

23. 单击标签编辑器的空白处,验证梯级的显示如下(请再次注意自文档化的代码):

24. 现在,继续并完成此例程的更新。然后更新传送带 2 的 Energy_Manag 例程。

25. 为传送带 3 重复相同的步骤。

26. 可注意到标签 Conveyor_2.Motor_Overload 确实具有描述。对于版本 V12 和较早版本的 RSLogix 5000,在 UDT 编辑器中输入的描述并不会在 UDT 编辑器以外显示。

UDT 传递和附加描述选项

从 RSLogix 5000 的

版本 13开始,"工作站选项"(Workstation Options) 下提供 2 个

新设置。

如果启用传递描述,则只要不为标签提供显式描述:

§ 在标签是别名时将会显示基础标签的描述,或者

§ 在标签是成员时将会显示定义的数据类型的成员描述,或者

§ 在标签是位、数组元素或成员时将会显示基础标签的描述,或者

§ 将会显示定义的基本数据类型的描述。

如果选中此复选框,"附加到基础标签描述"(Append to Base Tag Descriptions) 复选框便会启用。如果要使传递描述中包含基础标签描述,则选中"附加到基础标签描述"(Append to Base Tag Descriptions) 复选框。根据传递描述规则添加任意附加描述。在提供此功能之前,用户必须手动从 UDT 编辑器中剪切描述,并在标签编辑器里手动将这些描述粘贴到标签中。这样会使编程工作多花费许多个小时的时间。

我们来了解一下此新功能的工作方式。

27. 在控制器项目管理器中的"数据类型"(Data Types) 文件夹下,单击"用户自定义"(User-Defined)旁边的+。

您将注意到有一个名为 Conveyor 的 UDT。

28. 双击文字Conveyor。

这将为 Conveyor 数据类型打开 UDT 编辑器。

C题库--自定义数据类型(精)

本题序号:118 当定义一个结构体变量时,系统分配给它的内存大小的理论值是__________。 A 各成员所需内存的总和 B 结构体中的第一个成员所需内存 C 成员中所需内存最大者的存储空间 D 结构体中的最后一个成员所需存储容量参考答案 A 本题序号:165 存放多个字符串,用________比较适合。 A 二维字符数组 B 一维字符数组 C 自定义结构体 D 自定义联合体 参考答案 A 本题序号:169 定义生成非静态变量时,将对变量进行_______。 A 自动赋初值 B 自动赋0 C 不会自动赋初值 D 自动赋-1 参考答案 C 本题序号:180 x为int型,s为float型,x=3,s=2.5。表达式s+x/2的值为________。 A 4 B 3.5 C 2.5 D 3 参考答案 B 本题序号:182 x、y为整数,x=15,y=-2。表达式x>10 and y<2 or x*y==10 and x的值为_________。 A 0 B 15 C 1 D 2 参考答案 C 本题序号:211 以下定义, struct st1{int a,b;float x,y;}; struct st2{int a,b;st1 s1; } ss; 对成员变量x的引用形式正确的是:_________ 。 A ss.s1.x B st2.st1.x C st2.s1.x D ss.x 参考答案 A 本题序号:215 对任意整型数据数据m,n(m>n>0), 则 C 语言表达式m-m/n*n的值为:_______________。 A 0 B m%n C 1 D n%m 参考答案 B 本题序号:223 设有以下定义: enum t1 {a1,a2=7,a3,a4=15} time; 则枚举常量a1和a3的值分别是 A 1和2 B 6和3 C 1和8 D 0和8 参考答案 D 本题序号:225 设有类型说明:enum color{red,yellow=3,white,black}; 则执行语句cout<

自定义数据类型习题及答案(C语言)

第7章自定义数据类型习题 一.选择题: 1.当定义一个结构体变量时,系统分配给它的内存空间是【】。 A) 结构中一个成员所需的内存量B) 结构中最后一个成员所需的内存量 C) 结构体中占内存量最大者所需的容量D) 结构体中各成员所需内存量的总和2.若有以下说明,对初值中整数2的正确引用方式是【】。 static struct { char ch; int i; double x; } a[2][3]={{…a?,1,3 .45,?b?,2,7.98,?c?,3,1.93I} {…d?,4,4.73,?e?,5,6.78,?f?,6,8.79 }}; A) a[1][1].i B) a[0][1].i C) a[0][0].i D) a[0][2].i 3.根据以下定义,能打印字母M的语句是【】。 struct p { char name[9]; int age; }c[10]={“Jobn”,17,”Paul”,19,”Mary”,18,”Adam”,16}; A) printf(“%c”,c[3].name);B) printf(“%c”,c[3].name[1]); C) printf(“%c”,c[2].name);D) printf(“%c”,c[2].name[0]); 4.以下说明和语句中,已知int型数据占两个字节,则以下语句的输出结果是【】。 struct st { char a[l0]; int b; double c; }; printf(“%d”,sizeof(struct st)); A) 0 B) 8 C) 20 D) 2 5.以下说明和语句中,对结构体变量std中成员id的引用方式不正确的是【】。 struct work { int id; int name; } std, *p; p=&std; A) std.id B) *p.id C) (*p).id D) &std.id 6.如设有如下定义,若要使px指向rec中的成员x,正确的赋值语句是【】。 struct aa

AB PLC编程软件RSLOGIX5000入门7——UDT用户自定义大数据类型

AB PLC编程软件RSLOGIX5000入门7——UDT用户自定义数据类型 在本章中,我们将介绍如何通过用户自定义数据类型和数据围划定来规划标签数据库。 这里将学到 § 了解使用 UDT 的优势 § 学习如何优化 UDT 规划 § 使用数据围划定帮助简化并加快开发工作 我们现在将重点关注 Logix 控制器中的数据规划。 打开现有控制器文件 1. 在计算机桌面上,双击 Lab Files 文件夹。 2. 双击名为 Conveyor_Program_S 3.ACD 的现有项目。 这样将在 RSLogix 5000 中启动该项目。 为传送带创建用户自定义数据类型 您已重新组织了程序规划以更好地利用 Logix,现在已准备好开始对数据规划进行重新组织。可注意到,工程师规划数据的方式仍像使用带有整数、实数和定时器数据表的传统 PLC 一样。问题是,当与设备关联的数据分布到控制器存中的各处时便很难进行跟踪。您已再次决定充分利用 Logix,使用用户自定义数据类型。 用户自定义数据类型 用户自定义数据类型也称为 UDT 或结构,借此按逻辑方式对数据进行组织或分组,以便所有与设备关联的数据都可组合在一起。 例如,每个传送带都有 8 个整数值、3 个实数值、2 个定时器和 11 个与其关联的布尔值。在传统PLC 中,可能需要 4 个不同的数据表。然后,当您具有多条传送带时,您可能需要详细地将传送带映射到各个数据表中。这样就会变得很难管理。 通过 UDT 能够实现的是将不同的数据类型(整数、实数、定时器、布尔等)组合到一起,共同作为用户自定义数据类型。然后便可创建该 UDT 类型的数组。这可使得编程工作、代码的记录和数据的跟踪都更加轻松。 1. 在控制器项目管理器中,双击"控制器标签"(Controller Tags)。

VISUAL BASIC数据类型的定义

一、数据类型概述 数据:计算机能够处理数值、文字、声音、图形、图像等信息,均称为数据。 数据类型:根据数据描述信息的含义,将数据分为不同的种类,对数据种类的区分规定,称为数据类型。数据类型的不同,则在内存中的存储结构也不同,占用空间也不同 VB的基本数据类型: 数值型数据(主要数据类型)日期型字节型 货币型逻辑型字符串型对象型变体型 二、数值数据类型 数值类型分为整数型和实数型两大类。 1、整数型 整数型是指不带小数点和指数符号的数。 按表示范围整数型分为:整型、长整型 (1)整型(Integer,类型符%) 整型数在内存中占两个字节(16位) 十进制整型数的取值范围:-32768~+32767 例如:15,-345,654%都是整数型。而45678%则会发生溢出错误。 (2)长整型(Long,类型符&) 长整数型在内存中占4个字节(32位)。 十进制长整型数的取值范围: -2147483648~+2147483647 例如:123456,45678&都是长整数型。 2、实数型(浮点数或实型数) 实数型数据是指带有小数部分的数。 注意:数12和数12.0对计算机来说是不同的,前者是整数(占2个字节),后者是浮点数(占4个字节) 实数型数据分为浮点数和定点数。 浮点数由三部分组成:符号,指数和尾数。 在VB中浮点数分为两种: 单精度浮点数(Single) 双精度浮点数(Double) (1)单精度数(Single,类型符!) 在内存中占4个字节(32位),,有效数字:7位十进制数 取值范围:负数-3.402823E+38~-1.401298E-45 正数 1.401298E-45~3.402823E+38 在计算机程序里面不能有上标下标的写法,所以乘幂采用的是一种称为科学计数法的表达方法 这里用E或者e表示10的次方(E/e大小写都可以) 比如:1.401298E-45表示1.401298的10的负45次方

用户定义数据类型与自定义函数

数据库系统原理实验报告 实验名称:__用户定义数据类型与自定义函数_ 指导教师:_叶晓鸣刘国芳_____ 专业:_计算机科学与技术_ 班级:__2010级计科班_ 姓名:_文科_____学号: 100510107 完成日期:_2012年11月10日_成绩: ___ ___一、实验目的: (1)学习和掌握用户定义数据类型的概念、创建及使用方法。 (2)学习和掌握用户定义函数的概念、创建及使用方法。 二、实验内容及要求: 实验 11.1 创建和使用用户自定义数据类型 内容: (1)用SQL语句创建一个用户定义的数据类型Idnum。 (2)交互式创建一个用户定义的数据类型Nameperson。 要求: (1)掌握创建用户定义数据类型的方法。 (2)掌握用户定义数据类型的使用。 实验 11.2 删除用户定义数据类型 内容: (1)使用系统存储过程删除用户定义的数据类型Namperson。 (2)交互式删除用户定义的数据类型Idnum。 要求: (1)掌握使用系统存储过程删除用户定义的数据类型。 (2)掌握交互式删除用户定义的数据类型。 实验 11.3 创建和使用用户自定义的函数 内容: (1)创建一个标量函数Score_FUN,根据学生姓名和课程名查询成绩。 (2)创建一个内嵌表值函数S_Score_FUN,根据学生姓名查询该生所有选课的成绩。 (3)创建一个多语句表值函数ALL_Score_FUN,根据课程名查询所有选择该课程学生的成绩信息。

要求: (1)掌握创建标量值函数的方法。 (2)掌握创建内嵌表值函数的方法。 (3)掌握创建多语句表值函数的方法。 实验 11.4 修改用户定义的函数 内容: (1)交互式修改函数Score_FUN,将成绩转换为等级输出。 (2)用SQL修改函数S_Score_FUN,要求增加一输出列定义的成绩的等级。要求: (1)掌握交互式修改用户定义函数的方法。 (2)掌握使用SQL修改用户定义函数的方法。 实验 11.5 输出用户定义的函数 内容: (1)交互式删除函数Score_FUN。 (2)用SQL删除函数S_Score_FUN。 要求: (1)掌握交互式删除用户定义函数的方法。 (2)掌握使用SQL删除用户定义函数的方法。

C语言自定义数据类型

自定义数据类型 结构体 结构体是程序员在程序中自定义的一种数据类型,在说明和使用之前必须先定义它,也就是构造它。定义一个结构体的语法格式如下: Struct 结构体类型名 { 成员1的数据类型名成员1名称; 成员2的数据类型名成员2名称; . . 成员n的数据类型名成员n名称; }结构体变量表={成员初始化}; 注意成员可以由若干个不同的数据类型组成,每个成员也可以是结构体,即可以嵌套定义。 例如: Struct student { Long num; Char name; Char sex; Float score; }; 已经定义的某种结构体类型可以视为一种标准的数据类型,它的使用方法与标准数据类型使用方法相同,可以用来定义变量、数组、指针。 结构体变量说明 结构体变量的说明在程序的变量说明部分给出,一般在结构定义之后,它的语法格式如下: Struct 结构类型名结构变量名表; 例如: Struct student stu; 指出了结构变量stu是student类型的变量,它由四个成员组成,每个成员的数据类型和名字都与student结构定义中给出的相同。系统完全按照结构定义时制定的内存模式为结构变量分配内存空间。 可以在定义结构体类型的同时给出结构体变量。 Struct student { Long num; Cha name[20]; Cha sex; Float score; }stu1,stu2; 这种形式与前面给出的结构定义和结构说明分开处理效果相同。

结构体成员访问 结构体成员是通过结构体变量名和成员名进行访问的,不能把他作为一个整体进行访问。其访问格式如下: 结构体变量名.成员名 其中运算符.是成员访问运算符,其运算级别是最高的,和圆括号运算符()、下标运算符[]是同一级别的。如果结构体成员是指针变量,则访问格式为: *https://www.360docs.net/doc/732697501.html, 如果某个结构体变量的成员数据类型又是一个结构体,则访问方式为: 外层结构体变量名.外层成员名.内层成员名 可以在定义结构体变量的同时对结构体变量初始化。 {结构体成员}结构体变量={初始数据}; struct student { long num; char name[20]; char sex; float score; } stu1={200401L,"ZhangHong",'f',92.5f}; 对于嵌套的结构体类型数据,访问格式为: 结构体变量名1.结构体变量名2.成员名 结构体变量初始化的格式如下: struct 结构体名 {结构体成员}结构体变量={初始数据}; 初始数据类型必须与结构成员的数据类型相匹配,并且先后顺序一一对应赋值。 要对结构体变量的成员地址进行访问,其语法格式为: &结构体变量.成员名 当一个指针变量用来指向一个结构变量时,称为结构体指针变量。结构体指针变量中的值是所指向的结构体变量的首地址。 结构体指针变量: Struct 结构名*结构体指针变量名 Struct student *pstu; 必须先赋值后使用,把结构体变量的首地址赋给指针变量,不能把结构名或结构体变量名赋给指针变量。 pstu=&stu1; 结构体名和结构体变量是两个不同的概念,结构体名只能表示一个结构形式,编译系统并不对它分配内存空间,只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。这是因为结构体变量被定义后相当于标准数据类型被使用。 利用结构体指针变量访问成员如下: (*结构体指针变量).成员名 或者: 结构体指针变量->成员名 后一种形式较为方便,容易区分。

第七章 自定义数据类型模板

第七章用户自定义数据类型 7.1 结构体类型 7.1.1 结构体的概述 一个学生的学号、姓名、性别、年龄、成绩、家庭住址 num name sex age score addr 10010 Li Fun M 18 87.5 BeiJing 声明一个新的结构体的类型: struct Student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; 7.1.2 结构体类型变量的定义方法及其初始化 1.定义结构体变量的方法 (1)先声明结构体的类型再定义变量名 Student student1,student2; (2)声明类型的同时定义变量 struct Student { int num; char name[20]; char sex; int age; float score; char addr[30]; }std1,std2; (3)直接定义结构体类型变量 struct { int num; char name[20]; char sex; int age; float score; char addr[30]; }std1,std2; (4)成员也可以是一个结构体变量 struct Date { int month; int day; int year; }; struct Student { int num; char name[20]; char sex; int age;

Date birthday; float score; char addr[30]; }; 2.结构体变量的初始化 struct Student { int num; char name[20]; char sex; int age; float score; char addr[30]; }student1={10001,"Zhang Xin",'M',19,90.5,"shanghai"}; Student student2={10002,"Wang Li",'F',20,98,"Beijing"}; 7.1.3 引用结构体变量 (1)可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量。 student1=student2; (2)可以引用一个结构体变量中的一个成员的值。 student1.num=10010; "."是成员运算符,它的优先级最高。(3)对于结构体嵌套,要逐级引用。 student1.birthday.month=11;(引用student1中birthday中的month成员)。 (4)不能将一个结构体变量作为一个整体进行输入和输出。(5)对于结构体变量的成员可以像普通变量一样进行各种运算。(6)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。 cout<<&student1; cout<<&student1.age; 例7.1 引用结构体变量中的成员 P199 #include using namespace std; struct Date { int month; int day; int year; }; struct Student { int num; char name[20]; char sex; Date birthday; float score; char addr[30]; }student1,student2={10002,"Wang Li",'F',5,23,1982,89.5}; void main() { student1=student2;

第10章 合理使用数据类型

第10章合理使用数据类型 在进一步讨论更深的主题之前,我们需要先停一停,快速地回顾一下可移植问题。Linux1.2版本和2.0版本之间的不同就在于额外的多平台能力;结果是,大多数源代码级的移植问题已经被排除了。这意味着一个规范的Linux驱动程序也应该是多平台的。 但是,与内核代码相关的一个核心问题是,能够同时存取各种长度已知的数据项(例如,文件系统数据类型或者设备卡上的寄存器)和利用不同处理器的能力(32位和64位的体系结构,也有可能是16位的)。 当把x86的代码移植到新的体系结构上时,核心开发者遇到的好几个问题都和不正确的数据类型相关。坚持强数据类型以及编译时使用-Wall-Wstrict-prototypes选项能够防止大部分的臭虫。 内核使用的数据类型划分为三种主要类型:象int这样的标准C语言类型,象u32这样的确定数据大小的类型和象pid_t这样的接口特定类型。我们将看一下这三种类型在何时使用和如何使用。本章的最后一节将讨论把驱动器代码从x86移植到其它平台上可能碰到的其它一些典型问题。 如果你遵循我提供的这些准则,你的驱动程序甚至可能在那些你未能进行测试的平台上编译并运行。 使用标准C类型 大部分程序员习惯于自由的使用诸如int和long这样的标准类型,而编写设备驱动程序就必须细心地避免类型冲突和潜在的臭虫。 问题是,当你需要“2个字节填充单位(filler)”或“表示4个字节字符串的某个东西”时,你不能使用标准类型,因为通常的C数据类型在不同的体系结构上所占空间大小并不相同。例如,长整数和指针类型在Alpha上和x86上所占空间大小就不一样,下面的屏幕快照表明了这一点: morgana%./datasize system/machine:Linux i486 sizeof(char)=1 sizeof(short)=2 sizeof(int)=4 sizeof(long)=4 sizeof(longlong)=8 sizeof(pointer)=4

vb用户自定义的数据类型

用户自定义的数据类型------记录 保存多个相同或不同类型数值的结构称为记录(record)。 在VISUAL BASIC 中定义记录,用Type语句,其语法如下: Type varType Variable1 As varType Variable2 As varType … Variablen As varType End Type 例如定义一个名为CheckRecord的记录: Type CheckRecord CheckNumber as Integer CheckDate as Date CheckAmount as Single End Type CheckRecord结构可以像普通变量类型一样使用。要定义这个类型的变量,使用如下语句: Dim check1 As CheckRecord 要对结构的各个字段访问,可使用如下语句: check1. CheckNumber=123 check1. CheckDate=#08/14/1996# check1. CheckAmount=240.00 例: 简单例(自定义类型1.frm) 数组自定义类型1.FRM 用一维数组存放学生年龄。并可通过学生姓名输入或显示该学生的年龄。 Private Type StudentInformation StudentAge As Integer StudentName As String End Type Dim N As Boolean Dim Information(1 To 4) As StudentInformation Dim infIndex As Integer Dim stuName As String Private Sub cmdInputname_Click() For i = 1 To 4 Information(i).StudentName = InputBox("PL input name") Next i End Sub Private Sub cmdInput_Click() infIndex = 1 N = False

sql自定义数据类型

6.2 用户自定义数据类型 6.2.1 创建用户自定义数据类型 可以使用T-SQL语句或企业管理器来完成用户自定义数据类型的创建。 1. 使用T-SQL语句 可以使用系统存储过程sp_addtype来创建用户自定义数据类型。语法是:sp_addtype type_name[,system_type] {'NULL'|'NOT NULL'|'NONULL'}-默认为'NULL' 其中: type_name为用户定义数据类型名,这个名称在数据库中必须是惟一的。 system_type 为用户定义的数据类型所基于的系统数据类型,可以包括数据的长度、精度等。当系统数据类型中包括标点符号(例如括号、逗号)时,应用引号括起来。 例如,创建一个“号码”数据类型可使用如下代码: USE 学生图书借阅管理 EXEC sp_addtype 号码,'varchar(8)','NULL' 在查询分析器中执行上述语句,结果窗口显示如下信息: (所影响的行数为1行) 类型已添加。 2. 使用企业管理器 使用企业管理器创建用户自定义数据类型的操作步骤如下: (1)在企业管理器中展开要创建用户自定义数据类型的数据库,用鼠标右键单击“用户定义的数据类型”目录,在弹出的快捷菜单中选择“新建用户定义数据类型”命令,如图6-14所示。 图6-14 新建用户自定义数据类型 (2)打开的用户自定义数据类型属性对话框如图6-15所示。在图6-15所示对话框的名

称文本框中输入用户自定义数据类型的名称,如“号码”。 图6-15 用户自定义数据类型属性对话框 图6-16 创建用户自定义数据类型“号码” (3)在图6-15所示对话框的“数据类型”下拉列表框中,选择该用户自定义数据类型所基于的系统数据类型,如varchar。 (4)如果选择的基类型是可以设定长度的(如varchar、char等),则还需要在长度文本框中设定数据类型的长度。 (5)如果允许空值,则选中“允许NULL值”复选框。 (6)如果希望该数据类型与规则或默认值捆绑,则分别在“规则”和“默认值”下拉列表框中选择要绑定的规则和默认值,否则选择“无”,如图6-16所示。规则和默认值将在 6.3节和6.4节中介绍。 (7)单击“确定”按钮,关闭对话框。 6.2.2 查看用户自定义数据类型 要查看用户自定义数据类型,可以使用sp_help 系统存储过程来查看用户自定义数据

第十章-CO10-作业类型主数据维护流程.

第十章-CO10_作业类型主数据维护流程 1.流程说明 此流程描述对作业类型在SAP系统中之维护(创建、修改、删除、冻结),以利于成本进行分摊。 家具公司实际业务中,作业类型仅作为计算生产成本,不作其他任何用途。因此,作业类型只有与生产部门之工作中心相关。另外,哪一类成本中心之费用及该费用通过作业类型分摊至哪个次级成本要素中去均须于创建作业类型时予以确定。 作业类型编码原则以及作业类型与次级成本要素之对应关系(参见附件一),由主数据专职维护人员统一定义、维护。 维护时,财务主数据维护专职人员须填写“作业类型主数据维护申请表”,作为SAP系统维护之依据。 注意事项: 通常,作业类型于SAP上线后即可交付使用,一般不需要创建、修改、删除或冻结。 因系统的高度集成,故创建作业类型前,必须与生产部门(PP模组)达成共识后方可进行,否则将引起前端部门作业困扰,冻结时亦然(若仅在CO模组已创建作业类型但不能与PP模组集成,则该作业类型是无用的)。 修改作业类型时,亦应事先与生产部门取得共识后方可进行。 2.流程图

3.系统操作 3.1.操作范例 例1:因公司内部核算需要,生技部门于2000/12/01起实行独立核算,各生产车间凡涉及之维 修费用均透过生技部门进行,生技部门按实际维修工时(维修内部价格按公司制定标准执行)结 算各生产车间费用。为此,财务部门决定创建一个作业类型——维修工时(代码:AMAINT),以 满足依维修工时核算所需。 例2:上述作业类型创建后,发现中文名称定义不够恰当,变更为生技维修工时。 例3:生技部门试运行后,未能继续推行下去,故将作业类型冻结。 例4:将作业类型——维修工时(代码:AMAINT)删除 3.2.系统菜单及交易代码 案例1:会计→控制→成本中心会计→主数据→作业类型→单个处理→创建 交易代码:KL01 案例2:会计→控制→成本中心会计→主数据→作业类型→单个处理→更改 交易代码:KL02

SQL_用户自定义的数据类型、规则、默认

用户自定义的数据类型、默认值、规则 一、用户自定义的数据类型 用户自定义数据类型可看做是系统数据类型的别名。 在多表操作的情况下,当多个表中的列要存储相同类型的数据时,往往要确保这些列具有完全相同的数据类型、长度和为空性(数据类型是否允许为空)。例如,对于student数据库中表student、grade和course三张表的xh,kh两个列必须具有相同的数据类型。 创建用户自定义数据类型时首先应考虑如下三个属性: (1)数据类型名称 (2)新数据类型所依据的系统数据类型(又称为基类型) (3)为空性 如果为空性未明确定义,系统将依据数据库或连接的ANSI NULL 默认设置进行指派。 1、创建用户自定义数据类型的方法如下: (1)利用企业管理器定义 (2)利用SQL命令定义数据类型 在SQL Server中,通过系统存储过程实现用户数据类型的定义。 语法格式如下: sp_addtype [@typename=] type, /*自定义类型名称*/ [@phystype=] system_data_type /*基类型*/ [,[@nulltype=] null_type /*为空性*/

[,[@owner=] owner_name] /*创建者或所有者*/ 其中: type:用户自定义数据类型的名称。 System_data_type:用户自定义数据类型所依据的基类型。如果参数中嵌入有空格或标点符号,则必须用引号将该参数引起来。 null_type:指明用户自定义数据类型处理空值的方式。取值可为’NULL’、’NOT NULL’、’NONULL’三者之一(注意:必须用单引号引起来)。如果没有用sp_addtype显式定义null_type,则将其设置为当前默认值,系统默认值一般为’NULL’。 例:定义学号字段的数据类型 sp_addtype ’student_xh’,’char(4)’,’not null’ 2、删除用户自定义数据类型 (1)利用企业管理器 (2)利用SQL语句 语法格式如下: sp_droptype [@typename=] type 其中type为用户自定义数据类型的名称,应用单引号括起来。 例:删除student_xh用户自定义数据类型 sp_droptype ’student_xh’ 说明: (1)如果在表定义内使用某个用户定义的数据类型,或者将

C++(练习)第5章,自定义数据类型

一,单选题 1. 已知枚举类型定义语句为: enum Token { NAME, NUMBER, PLUS=5, MINUS, PRINT=10 }; 则下列叙述中错误的是( )。 A 枚举常量NAME的值为1 B 枚举常量NUMBER的值为1 C 枚举常量MINUS的值为6 D 枚举常量PRINT的值为10 参考答案 A 2. 当定义一个结构体变量时,系统分配给它的内存大小的理论值是__________。 A 各成员所需内存的总和 B 结构体中的第一个成员所需内存 C 成员中所需内存最大者的存储空间 D 结构体中的最后一个成员所需存储容量 参考答案 A 3. 以下对枚举类型名的定义中正确的是()。 A enum a={“one”, “two”, “three”}; B enum a {“one”, “two”, “three”}; C enum a={one, two, three}; D enum a {one=9,two=-1,three}; 参考答案 D 4. 下面程序的正确的输出是()。 #include void main() { enum team{my,your=4,his,her=his+10}; cout<

5. 设有以下定义: enum t1 {a1,a2=7,a3,a4=15} time; 则枚举常量a1和a3的值分别是 A 1和2 B 6和3 C 1和8 D 0和8 参考答案 D 6. 设有类型说明: enum color{red, yellow=3, white, black}; 则执行语句cout<

abplc7用户自定义数据类型

UDT----用户自定义数据类型(看不懂也要坚持一下,理解了这部分就不是新手了) 在本章中,我们将介绍如何通过用户自定义数据类型和数据范围划定来规划标签数据库。这里将学到 § 了解使用 UDT 的优势 § 学习如何优化 UDT 规划 § 使用数据范围划定帮助简化并加快开发工作 我们现在将重点关注 Logix 控制器中的数据规划。 打开现有控制器文件 1. 在计算机桌面上,双击Lab Files文件夹。 2. 双击名为Conveyor_Program_S 3.ACD的现有项目。 这样将在 RSLogix 5000 中启动该项目。 为传送带创建用户自定义数据类型 您已重新组织了程序规划以更好地利用 Logix,现在已准备好开始对数据规划进行重新组织。可注意到,工程师规划数据的方式仍像使用带有整数、实数和定时器数据表的传统 PLC 一样。问题是,当与设备关联的数据分布到控制器内存中的各处时便很难进行跟踪。您已再次决定充分利用 Logix,使用用户自定义数据类型。 用户自定义数据类型 用户自定义数据类型也称为 UDT 或结构,借此按逻辑方式对数据进行组织或分组,以便所有与设备关联的数据都可组合在一起。 例如,每个传送带都有 8 个整数值、3 个实数值、2 个定时器和 11 个与其关联的布尔值。在传统PLC 中,可能需要 4 个不同的数据表。然后,当您具有多条传送带时,您可能需要详细地将传送带映射到各个数据表中。这样就会变得很难管理。 通过 UDT 能够实现的是将不同的数据类型(整数、实数、定时器、布尔等)组合到一起,共同作为用户自定义数据类型。然后便可创建该 UDT 类型的数组。这可使得编程工作、代码的记录和数据的跟踪都更加轻松。 1. 在控制器项目管理器中,双击"控制器标签"(Controller Tags)。

实验8--自定义数据类型1

实验8--自定义数据类型1

实验8 自定义数据类型 三、实验思考 1.有10名学生的数据,每个学生的数据包括学号、姓名、性别、三门课的考试成绩及平均成绩。要求: (1)编写一个input函数,用来输入10个学生的信息。 (2)编写一个output函数,用来输出10个学生的信息。 (3)计算每个学生的平均成绩,并按平均成绩由小到大进行排序后输出。 2.设有5个学生和教师的数据。学生的数据包括:姓名、年龄、性别、职业和年级。教师的数据包括:姓名、年龄、性别、职业和职务。现要求输入学生和教师的数据,并输出这些数据,要求当职业项为学生时,输出的最后一项为年级;当职业项为教师时,输出的最后一项为职务。3.利用结构体数组和结构体指针,根据从键盘输入的学生姓名,查找已给出数据的结构体数组,若找到该名学生,则输出其所有信息;若找不到该名学生,则输出相应提示信息。

4.编程实现,从红、黄、蓝、绿四种颜色中任取三种不同的颜色,共有多少种取法,并请输出所有的排列? 5.从键盘输入一批正整数(以-1作为输入结束标志),按插表尾形式把它们组成一个线性链表。然后,从表头开始,遍历所有结点并输出各结点中的数据。要求线性链表的生成与遍历均写成函数定义。 6.从键盘输入一系列非负整数,遇0时停止。对于输入的所有偶数和奇数,分别建立一个偶数链表和一个奇数链表,然后输出两个链表中的数据。 答案 1. #include #include using namespace std; const int n=2; //设置人数常量n,本例为2人 struct student { char num[6]; // 学号 char name[8]; // 姓名 char sex[2]; // 性别 int score[4]; // score[1]~score[3]存放3门课成绩,score[0]存放平均成绩 }stu[n]; void input() //输入函数input { int i,j,sum; for(i=0;i

第7章 用户自定义数据类型

第7章用户自定义数据类型7.1结构体类型 7.1.1为什么需要用结构体类型 图7.1 7.1.2结构体类型变量的定义方法及其初始化 1. 定义结构体类型变量的方法 图7.2 图7.3 2. 结构体变量的初始化 7.1.3引用结构体变量 7.1.4结构体数组 1. 定义结构体数组

C++程序设计(第2版) 图7.4 图7.5 2. 结构体数组的初始化 3. 结构体数组应用举例 图7.6 7.1.5指向结构体变量的指针 1. 通过指向结构体变量的指针引用结构体变量中的成员

C++程序设计(第2版) 图7.7 图7.8 图7.9 7.1.6结构体类型数据作为函数参数 图7.10 7.1.7用new和delete运算符进行动态分配和撤销存储空间 图7.11

C++程序设计(第2版) 7.2共用体类型 图7.12 7.3枚举类型 7.4用typedef声明新的类型名 习题 1. 定义一个结构体变量(包括年、月、日),编写程序,要求输入年、月、日,程序能计算并输出该日在本年中是第几天。注意闰年问题。 2. 编写一个函数days,实现上面的计算。由主函数将年、月、日传递给函数days,计算出该日在本年中是第几天并将结果传回主函数输出。 3. 编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据,每个学生的数据包括num(学号)、name(姓名)、score\[3\](3门课的成绩)。用主函数输入这些数据,用print函数输出这些数据。 4. 在第3题的基础上,编写一个函数input,用来输入5个学生的数据。 5. 有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生数据,要求打印出3门课总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩、平均分数)。 6. 编写一个函数creat,用来建立一个动态链表。所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相连的关系。各结点的数据由键盘输入。 7. 编写一个函数print,将第6题建立的链表中各结点的数据依次输出。 8. 编写一个函数del,用来删除动态链表中一个指定的结点(由实参指定某一学号,表示要删除该学生结点)。

用户自定义数据类型

用户自定义的数据类型复习题 一、选择题 1.下列程序的输出结果是()。 A) 5B) 6 C) 7 D) 8 struct abc { int a, b, c; }; main() { struct abc s[2]={{1,2,3},{4,5,6}}; int t; t=s[0],a+s[1],b; printf("%d \n",t); } 2.下列程序执行后的输出结果是()。 A) 6 B) 8C) 10D) 12 #define MA(x) x*(x-1) main() { int a=1,b=2; printf("%d \n",MA(1+a+b));} 3. 有以下结构体说明和变量的定义,则不能把结点b连接到结点a之后的语句是()。 A) a.next=q; B) p.next=&b; C) p->next=&b; D) (*p).next=q; struct node { char data; struct node *next; } a,b,*p=&a,*q=&b; 4.变量a所占内存字节数是()。 A) 4B) 5C) 6D) 8 union U { char st[4]; int i; long l; }; struct A { int c; union U u; }a; 5.有如下程序 #define N 2 #define M N+1 #define NUM 2*M+1 #main() { int i; for(i=1;i<=NUM;i++)printf(“%d\n”,i); }

该程序中的for循环执行的次数是()。 A) 5 B) 6C) 7D) 8 6.以下程序的输出结果是()。 A) 16 B) 2C) 9D) 1 #define SQR(X) X*X main() { int a=16, k=2, m=1; a/=SQR(k+m)/SQR(k+m); printf(“d\n”,a); } 7.以下程序的输出是()。 A) 10B) 11 C) 51D) 60 struct st { int x; int *y;} *p; int dt[4]={ 10,20,30,40 }; struct st aa[4]={ 50,&dt[0],60,&dt[0],60,&dt[0],60,&dt[0],}; main() { p=aa; printf(“%d\n”,++(p->x)); } 8.以下程序的输出结果是()。 struct HAR { int x, y; struct HAR *p;} h[2]; main() { h[0],x=1;h[0];y=2; h[1],x=3;h[1];y=4; h[0],p=&h[1],p=h; printf(“%d %d \n”,(h[0],p)->x,(h[1],p)->y); } A) 12 B) 23C) 14 D) 32 9. 以下程序的输出结果是()。 union myun { struct { int x, y, z; } u; int k; } a; main() { a.u.x=4; a.u.y=5; a.u.z=6; a.k=0; printf(%d\n”,a.u.x); } A) 4 B) 5C) 6D) 0 10. 以下程序的输出结果是()。 #define M(x,y,z) x*y+z

实验8 自定义数据类型1

实验8 自定义数据类型 三、实验思考 1.有10名学生的数据,每个学生的数据包括学号、姓名、性别、三门课的考试成绩及平均成绩。要求: (1)编写一个input函数,用来输入10个学生的信息。 (2)编写一个output函数,用来输出10个学生的信息。 (3)计算每个学生的平均成绩,并按平均成绩由小到大进行排序后输出。 2.设有5个学生和教师的数据。学生的数据包括:姓名、年龄、性别、职业和年级。教师的数据包括:姓名、年龄、性别、职业和职务。现要求输入学生和教师的数据,并输出这些数据,要求当职业项为学生时,输出的最后一项为年级;当职业项为教师时,输出的最后一项为职务。 3.利用结构体数组和结构体指针,根据从键盘输入的学生姓名,查找已给出数据的结构体数组,若找到该名学生,则输出其所有信息;若找不到该名学生,则输出相应提示信息。 4.编程实现,从红、黄、蓝、绿四种颜色中任取三种不同的颜色,共有多少种取法,并请输出所有的排列? 5.从键盘输入一批正整数(以-1作为输入结束标志),按插表尾形式把它们组成一个线性链表。然后,从表头开始,遍历所有结点并输出各结点中的数据。要求线性链表的生成与遍历均写成函数定义。 6.从键盘输入一系列非负整数,遇0时停止。对于输入的所有偶数和奇数,分别建立一个偶数链表和一个奇数链表,然后输出两个链表中的数据。 答案 1. #include #include using namespace std; const int n=2; //设置人数常量n,本例为2人 struct student { char num[6]; // 学号 char name[8]; // 姓名 char sex[2]; // 性别 int score[4]; // score[1]~score[3]存放3门课成绩,score[0]存放平均成绩 }stu[n]; void input() //输入函数input { int i,j,sum; for(i=0;i>stu[i].num; cout<<"name:"; cin>>stu[i].name; cout<<"sex:";

相关文档
最新文档