不同类型硅胶的定义

不同类型硅胶的定义
不同类型硅胶的定义

硅胶的定义

一.单组分室温硫化硅橡胶

单组分室温硫化硅橡胶的硫化反应是靠与空气中的水分发生作用而硫化成弹性体。随着链剂的不同,单组分室温硫化硅橡胶可为脱酸型、脱肟型、脱醇型、脱胺型、脱酰胺型和脱酮型等许多品种。单组分室温硫化硅橡胶的硫化时间取决于硫化体系、温度、湿度和硅橡胶层的厚度,提高环境的温度和湿度,都能使硫化过程加快。在典型的环境条件下,一般15~30分钟后,硅橡胶的表面可以没有粘性,厚度0.3厘米的胶层在一天之内可以固化。固化的深度和强度在三个星期左右会逐渐得到增强。

单组分室温硫化硅橡胶具有优良的电性能和化学惰性,以及耐热、耐自然老化、耐火焰、耐湿、透气等性能。它们在-60~200℃范围内能长期保持弹性。它固化时不吸热、不放热,固化后收缩率小,对材料的粘接性好。因此,主要用作粘合剂和密封剂,其它应用还包括就地成型垫片、防护涂料和嵌缝材料等。许多单组分硅橡胶粘接剂的配方表现出对多种材料如大多数金属、玻璃、陶瓷和混凝上的自动粘接性能。当粘接困难时,可在基材上进底涂来提高粘接强度,底涂可以是具有反应活性的硅烷单体或树脂,当它们在基材上固化后,生成一层改性的适合于有机硅粘接的表面。单组分室温硫化硅橡胶虽然使用方便,但由于它的硫化是依懒大气中的水分,使硫化胶的厚度受到限制,只能用于需要6毫米以下厚度的场合。单组分室温硫化硅橡胶的硫化反应是从表面逐渐往深处进行的,胶层越厚,固化越慢。当深部也要快速固化时,可采用分层浇灌逐步硫化法,每次可加一些胶料,等硫化后再加料,这样可以减少总的硫化时间。添加氧化镁可加速深层胶的硫化。

二.双组分缩合型室温硫化硅橡胶

双组分室温硫化硅橡胶硫化反应不是靠空气中的水分,而是靠催化剂来进行引发。通常是将胶料与催化剂分别作为一个组分包装。只有当两种组分完全混合在一起时才开始发生固化。双组分缩合型室温硫化硅橡胶的硫化时间主要取决于催化剂的类型、用量以及温度。催化剂用量越多硫化越快,同时搁置时间越短。在室温下,搁置时间一般为几小时,若要延长胶料的搁置时间,可用冷却的方法。双组分缩合型室温硫化硅椽胶在室温下要达到完全固化需要一天左右的时间,但在150℃的温度下只需要1小时。通过使用促进剂进行协合效应可显著提高其固化速度。

双组分室温硫化硅橡胶可在一65~250℃温度范围内长期保持弹性,并具有优良的电气性能和化学稳定性,能耐水、耐臭氧、耐气候老化,加之用法简单,工艺适用性强,因此,广泛用作灌封和制模材料。各种电子、电器元件用室温硫化硅橡胶涂覆、灌封后,可以起到防潮(防腐、防震等保护作用。可以提高性能和稳定参数。双组分室温硫化硅橡胶特别适宜于做深层灌封材料并具有较快的硫化时间,这一点是优于单组分室温硫化硅橡胶之处。双组分室温硫化硅橡胶硫化后具有优良的防粘性能,加上硫化时收缩率极小,因此,适合于用来制造软模具,用于铸造环氧树脂、聚酯树脂、聚苯乙烯、聚氨酯、乙烯基塑料、石蜡、低熔点合金等的模具。此外,利用双组分室温硫化硅橡胶的高仿真性能可以在文物上复制各种精美的花纹。双组分室温硫化硅橡胶在使用时应注意:首先把胶料和催化剂分别称量,然后按比例混合。混料过程应小心操作以使夹附气体量达到最小。胶料混匀后(颜色均匀),可通过静置或进行减压(真空度700毫米汞柱)除去气泡,待气泡全部排出后,在室温下或在规定温度下放置一定时间即硫化成硅橡胶。

三.双组分加成型室温硫化硅橡胶

双组分加成型室温硫化硅橡胶有弹性硅凝胶和硅橡胶之分,前者强度较低,后者强度较高。它们的硫化机理是基于有机硅生胶端基上的乙烯基(或丙烯基)和交链剂分子上的硅氢基发生加成反应(氢硅化反应)来完成的。在该反应中,不放出副产物。由于在交链过程中不放出低分子物,因此加成型室温硫化硅橡胶在硫化过程中不产生收缩。这一类硫化胶无毒、机械强度高、具有卓越的抗水解稳定性(即使在高压蒸汽下)、良好的低压缩形变、低燃烧性、可深度硫化、以及硫化速度可以用温度来控制等优点,因此是目前国内外大力发展的一类硅橡胶。双组分室温硫化硅橡胶可在一65~250℃温度范围内长期保持弹性,并具有优良的电气性能和化学稳定性, 能耐水、耐臭氧、耐气候老化,加之用法简单,工艺适用性强,因此,广泛用作灌封和制模材料。各种电子、电器元件用室温硫化硅橡胶涂覆、灌封后,可以起到防潮(防腐、防震等保护作用。可以提高性能和稳定参数。双组分室温硫化硅橡胶特别适宜于做深层灌封材料并具有较快的硫化时

间,这一点是优于单组分室温硫化硅橡胶之处。

双组分室温硫化硅橡胶硫化后具有优良的防粘性能,加上硫化时收缩率极小,因此,适合于用来制造软模具,用于铸造环氧树脂、聚酯树脂、聚苯乙烯、聚氨酯、乙烯基塑料、石蜡、低熔点合金等的模具。此外,利用双组分室温硫化硅橡胶的高仿真性能可以复制各种精美的花纹。例如,在文物复制上可用来复制古代青铜器,在人造革生产上可用来复制蛇、蟒、鳄鱼和穿山甲等动物的皮纹,起到以假乱真之效。

双组分室温硫化硅橡胶在使用时应注意几个具体问题:首先把基料、交联剂和催化剂分别称量,然后按比例混合。通常两个组分应以不同的颜色提供使用,这样可直观地观察到两种组分的混合情况,混料过程应小心操作以使夹附气体量达到最小。胶料混匀后(颜色均匀),可通过静置或进行减压(真空度700毫米汞柱)除去气泡,待气泡全部排出后,在室温下或在规定温度下放置一定时间即硫化成硅橡皮。

双组分室温硫化硅橡胶硅氧烷主链上的侧基除甲基外,可以用其它基团如苯基、三氟丙基、氰乙基等所取代,以提高其耐低温、耐热、耐辐射或耐溶剂等性能。同时,根据需要还可加入耐热、阻燃、导热、导电的添加剂,以制得具有耐烧蚀、阻燃、导热和导电性能的硅橡胶。

(一) 甲基室温硫化硅橡胶

甲基室温硫化硅橡胶为通用硅橡胶的老品种,具有耐水、耐臭氧、耐电弧、耐电晕和耐气候老化等优点。 它可一60~200℃温度范围内使用。因此,广泛用作电子电器元件的灌注和密封材料,仪器仪表的防潮、防震、耐高低温灌注和密封材料。也可用于制造模具,用于浇铸聚酯树脂、环氧树脂和低熔点合金零部件。也可用作齿科的印模材料。用甲基室温硫化硅橡胶涂布在棉布、纸袋上,可做成用于输送粘性物品的输送带和包装袋。

(二) 甲基双苯基室温硫化硅橡胶

甲基双苯基室温硫化硅橡胶除具有甲基室温硫化硅橡胶的优良性能外,比甲基室温硫化硅橡胶具有更宽的使用温度范围(-100~250℃)。苯基含量在 2.5~5%的低苯基室温硫化硅橡胶(108-1)可在-120℃低温条件下保持弹性,是目前硅橡胶中低温性能最好的一个品种;苯基含量在10~20%的室温胶(108-2)具有很好的耐辐照、耐烧蚀和自熄性,若在其中加入一定量的耐热添加剂如Fe2O3,等可提高热老化性能,适用于250℃以上高温下使用或做耐烧蚀腻子涂层和包封材料等。

甲基苯基室温胶与其它室温胶一样,可做浸渍、印模和脱膜使用。如欲增加与其它材料的粘着力,必须在使用该材料之前,对被粘着的材料进行表面处理,表面处理的步骤如下:用丙酮溶剂对材料表面清洗1~2次,然后用表面剂处理1~2次,在60℃烘箱内烘数分钟,此时在材料表面形成一层少有粘手的膜,就可上胶。

(三)甲基嵌段室温硫化硅橡胶

甲基嵌段室温硫化硅橡胶是甲基室温硫化硅橡胶的改性品种,它是由羟基封头的聚二甲基硅氧烷(107胶)和甲基三乙氧基硅烷低聚物(分子量3~5)的共聚体。在二丁基二月桂酸锡的催化下,聚二甲基硅氧烷中的羟基和聚甲基三乙氧基硅烷中的乙氧基缩合生成三向结构的聚合体,经硫化后的弹往体比甲基室温硫化硅橡胶具有较高的机械强度和粘接力,可在一70~200℃温度范围内长期使用。

甲基嵌段室温硫化硅橡胶具有防震、防潮、防水、透气、耐臭氧、耐气候老化、耐弱酸弱碱性能。它的电气绝缘性能很好,还具有很好的粘结性,而且成本低。因此,可广泛用于灌封、涂层、印模、脱模、释放药物载体等场合。用甲基嵌段室温胶灌封的电子元器件有防震、防潮、密封、绝缘、稳定各项参数等作用。把甲基嵌段室温胶直接涂布到扬声器上,可减少和消除扬声器的中频各点,经硫化后扬声器谐振频率性能可降低20赫芝左右。在甲基嵌段室温胶中配合入一定量的添加剂后可用作纸张防粘剂。在食品工业的糖果、饼干传送带上涂上一层薄薄的甲基嵌段室温胶后,可改善帆布的防粘性能,从而改善了食品的外观,提高原料的利用率。

在甲基嵌段室温胶中加入适量的气相法白炭黑,可用于安装窗户玻璃、幕墙、窗框、预制板的接缝、机场跑道的伸缩缝。此外,还可做电子计算机存贮器中磁芯和模板的粘合剂,还可做导电硅橡胶和不导电硅橡胶的粘合剂等。用甲基嵌段室温硫化硅橡胶处理织物可提高织物的手感、柔软和耐曲磨性。

(四)室温硫化睛硅橡胶

室温硫化腈硅橡胶是聚β-腈乙基甲基硅氧烷,室温硫化猜硅橡胶除具有硅橡胶的耐光、耐臭氧、耐潮、耐高低温和优良的电绝缘性能外,主要特点是耐非极性溶剂如耐脂肪族、芳香族溶剂的性能好,其耐油性能与普通耐油丁腈橡胶相接近,可用作油污染部件及耐油电子元件的密封注料灌。

(五)室温硫化氟硅橡胶

室温硫化氟硅橡胶是聚γ-三氟丙基甲基硅氧烷,它的主要特点是具有耐燃料油、耐溶剂和高温抗降解性能,还具有良好的挤出性能。主要用于超音速飞机整体油箱的密封、嵌缝,氟硅橡胶垫圈,垫片的粘结固定;硅橡胶和氟硅橡胶的粘合,以及化学工程和一般工业上耐燃料油;耐溶剂部位的粘结。

(六)室温硫化苯撑硅橡胶

室温硫化苯撑硅橡胶是硅苯(联苯)撑硅氧烷聚合物,它的突出优点是具有优异的耐高能射线性能。试验证明经受1x109伦琴γ-射线或1xl018中子/厘米2的中子照射后,仍可保持橡胶弹性,比室温硫化甲基硅橡胶大10~15倍,比室温硫化苯基硅橡胶大5~10倍。

室温硫化苯撑硅橡胶可适用原子能工业、核动力装置以及宇宙飞行等方面作为耐高温、耐辐射的粘接密封材料以及电机的绝缘保护层等。

室温硫化硅橡胶(RTV)是六十年代问世的一种新型的有机硅弹性体, 这种橡胶的最显著特点是在室温下无须加热、如压即可就地固化,使用极其方便。因此,一问世就迅成为整个有机硅产品的一个重要组成部分。现在室温硫化硅橡胶已广泛用作粘合剂、密封剂、防护涂料、灌封和制模材料,在各行各业中都有它的用途。

室温硫化硅橡胶由于分子量较低,因此素有液体硅橡胶之称,其物理形态通常为可流动的流体或粘稠的膏状物,其粘度在100~1000000厘沲之间。根据使用的要求,可把硫化前的胶料配成自动流平的灌注料或不流淌但可涂刮的腻子。室温硫化硅橡胶所用的填料与高温硫化硅橡胶类似,采用白炭黑补强,使硫化胶具有10~60公斤/厘米2 扯断强度。填加不同的添加剂可使胶料具有不同的比重、硬度、强度、流动性和触变性,以及使硫化胶具有阻燃、导电、导热、耐烧蚀等各种特殊性能。

室温硫化硅橡胶按其包装方式可分为单组分和双组分室温硫化硅橡胶,按硫化机理又可分为缩合型和加成型。因此,室温硫化硅橡胶按成分、硫化机理和使用工艺不同可分为三大类型,即单组分室温硫化硅橡胶、双组分缩合型室温硫化硅橡胶和双组分加成型室温硫化硅橡胶。

单组分和双组分缩合型室温硫化硅橡胶的生胶都是α,ω-二羟基聚硅氧烷; 加成型室温硫化硅橡胶则是含烯基和氢侧基(或端基)的聚硅氧烷,因为在熟化时,往往在稍高于室温的情况下(50~150℃)能取得好的熟化效果,所以,又称低温硫化硅橡胶(LTV)。

这三种系列的室温硫化硅橡胶各有其优缺点:单组分室温硫化硅橡胶的优点是使用方便,但深部固化速度较困难;双组分室温硫化硅橡胶的优点是固化时不放热, 收缩率很小,不膨胀,无内应力,固化可在内部和表面同时进行,可以深部硫化;加成型室温硫化硅橡胶的硫化时间主要决定于温度,因此,利用温度的调节可以控制其硫化速度。

单组分室温硫化硅橡胶 单组分室温硫化硅橡胶的硫化反应是靠空气中的水分来引发的。常用的交链剂是甲基三乙酰氧基硅烷,它的Si-O-C键很易被水解,乙酰氧基与水中的氢基结合成醋酸,而将水中的羟基移至原来的乙酰氧基的位置上,成为三羟基甲基硅烷。三羟基甲基硅烷极不稳定,易与端基为羟基的线型有机硅缩合而成为交链结构。平时,将含有硅醇端基的有机硅生胶与填料、催化剂、交链剂等各种配合剂装入密封的软管中,使用时由容器挤出,借助于空气中的水分而硫化成弹性体, 同时放出低分子物。

交链剂除甲基三乙酰氧基硅烷外,还可以是含烷氧基、肟基、胺基、酰胺基、酮基的硅烷。当与烷氧基交链后放出醇,称为脱醇型单组分室温硫化硅橡胶,当与肟基交链后生成肟,称为脱肟型室温硫化硅橡胶、因此,随着交链剂的不同,单组分室温硫化硅橡胶可为脱酸型、脱肟型、脱醇型、脱胺型、脱酰胺型和脱酮型等许多品种,但脱酸型是目前最广泛使用的一种。

单组分室温硫化硅橡胶的硫化时间取决于硫化体系、温度、湿度和硅橡胶层的厚度,提高环境的温度和湿度,都能使硫化过程加快。在典型的环境条件下,一般15~30分钟后,硅橡胶的表面可以没有粘性, 厚度0.3厘米的胶层在一天之内可以固化。固化的深度和强度在三个星期左右会逐渐得到增强。

单组分室温硫化硅橡胶具有优良的电性能和化学惰性,以及耐热、耐自然老化、耐火焰、耐湿、透气等性能。它们在-60~200℃范围内能长期保持弹性。它固化时不吸热、不放热,固化后收缩率小,对材料的粘接性好。因此,主要用作粘合剂和密封剂,其它应用还包括就地成型垫片、防护涂料和嵌缝材料等。许多单组分硅橡胶粘接剂的配方表现出对多种材料如大多数金属、玻璃、陶瓷和混凝上的自动粘接性能,例如对裸露的铝,抗剪强度可达200磅/吋2,撕裂强度可达20磅·呎/吋2(0.35焦耳/厘米2)。当粘接困难时,可在基材上进行底涂来提高粘接强度,底涂可以是具有反应活性的硅烷单体或树脂,当它们在基材上固化后,生成一层改性的适合于有机硅粘接的表面。

单组分室温硫化硅橡胶虽然使用方便,但由于它的硫化是依懒大气中的水分,使硫化胶的厚度受到限制,只能用于需要6毫米以下厚度的场合。

单组分室温硫化硅橡胶的硫化反应是从表面逐渐往深处进行的,胶层越厚,固化越慢。当深部也要快速固化时,可采用分层浇灌逐步硫化法,每次可加一些胶料,等硫化后再加料,这样可以减少总的硫化时间。添加氧化镁可加速深层胶的硫化。

耐高温硅橡胶耐温-70℃-+350℃,耐高低温.甲基苯基乙烯基硅橡胶是在甲基乙烯基硅橡胶的分子链中引入甲基苯基硅氧链节或二苯基硅氧链节而得的产品。

在聚硅氧烷的侧基上引入苯基,由于破坏了二甲基硅氧烷结构的规整性,大大降低了聚合物的结晶温度,扩大了该聚合物材料的低温应用范围。因此,甲基苯基乙烯基硅橡胶除了具有甲基乙烯基硅橡胶所有的压缩永久变形小、使用温度范围宽、抗氧化、耐候、防震、防潮和良好的电气绝缘性能外,还具有卓越的耐低温、耐烧蚀和耐辐照等性能.这些性能随分子链中苯基含量的不同而有所变化, 一般来说,苯基含量(苯基与硅原子之比)在5~10%时称低苯基硅橡胶,它具有独特的耐寒性能, 在-70~-100℃仍能保持橡胶的弹性,是所有橡胶中低温性能最好的一种,加之它兼有甲基乙烯基硅橡胶的优点且成本不高,因此大有取代甲基乙烯基硅橡胶趋势。苯基含量20~40%时称中苯基硅橡胶,它具有卓越的耐燃特性,一旦着火可以自熄。苯基含量在40~50%时称高苯基硅橡胶,它具有优异的耐辐射性能,耐γ- 射线为1xI08 伦琴。一般说来,随着苯基含量的增加,硅橡胶分子链的刚性逐渐增大,硅橡胶的耐低温性能逐渐下降,但随着苯基含量的增加,提高了硫化胶的耐燃性和耐辐照性。

甲基苯基乙烯基硅橡胶是宇航工业、尖端技术和国民经济其它部门的重要材料之一,可供制做各种模压和挤出制品用作航空工业的耐寒橡胶和用于耐烧蚀、耐热老化或耐辐射部位的密封圈、垫、管材和棒材等。

用途:

1.主要用于仪器、仪表、设备等在密闭条件下的吸潮防锈。

2.与普通硅胶干燥剂配合使用,指示干燥剂的吸潮程度和判断环境的相对湿度。作为包装用硅胶干燥剂,广泛用于精密仪器、皮革、服装、食品、药品和家用电器等。

硅溶胶

性状 :

硅溶胶属胶体溶液,无臭、无毒,分子式可表示为 mSiO2nH2O.

1.由于胶体粒子微细(10 - 20nm),有相当大的比表面积,粒子本身无色透明,不影响被覆盖物的本色。

2.粘度较低,水能渗透的地方都能渗透,因此和其它物质混合时分散性和渗透性都非常好。

3.当硅溶胶水份蒸发时,胶体粒子牢固地附着在物体表面,粒子间形成硅氧结合,是很好的粘合剂。

用途:

1.用作各种耐火材料粘结剂,具有粘结力强、耐高温(1500-1600°C), 等特点。

2.用于涂料工业,能使涂料牢固,又能抗污防尘、耐老化、防火等功能。

3.用于薄壳精密铸造,可使壳型强度大、铸造光洁度高。用其造型比水玻璃造型质量好,代替硅酸乙酯造型可降低成本和改善操作条件。

4.硅溶胶有较高的比表面积,可用于催化剂制造及催化剂载体。

5.用于造纸工业,可作为玻璃纸防粘剂、照相用纸前处理剂、水泥袋防滑剂等。

6.用作纺织工业上浆剂,它与油剂并用处理羊毛、兔毛的可纺性,减少断头,防止飞花,提

高成品率,增加经济效益。

7.用作矽钢片处理剂、显像管分散剂、地板蜡抗

7.

第十五讲 宏定义

第十五讲宏定义、文件包含和条件编译 ?C语言提供的预处理功能主要有三种: 宏定义 文件包含 条件编译 ?为了区别预处理命令和C语句、定义和说明语句,规定: 预处理命令行必须在一行的开头; 必须以#开始; 每行末尾不能加分号。 1、宏定义 宏定义 1.1不带参数的宏定义 不带参数的宏定义命令形式为: #define 宏名字符串 或#define 宏名 #define的作用是用指定的标识符(宏名)来代表字符串。其中#define是宏定义命令,宏名是一个标识符。 【例】输入一个圆的半径,计算并输出圆的面积和周长 #define PI 3.14159 main( ) {float l,s,r; /*l:周长,s:面积,r:半径*/ printf("Please input radius: "); scanf("%f",&r); /*输入半径*/ l=2.0*r*PI; /*计算周长*/ s=PI*r*r; /*计算面积*/ printf("l=%10.4f\ns=%10.4f\n",l,s); } 说明: 为了与变量名区别,建议宏名一般用大写字母。使用宏名代替一个 字符串,目的一是减少程序中某些重复使用字符串的书写量,其二 是增加程序的可读性。在编译预处理过程中会进行宏展开。 当宏定义在一行中写不下,需要在下一行继续时,只需在最后一个 字符后紧接一个反斜线“\”。注意在第二行开始不要有空格,否则空 格会一起被替换。 例如:#define LEAP_YEAR year % 4==0\ && year %100!=0 || year % 400==0 在C语言中,宏定义一般写在程序开头。宏名的有效范围为定义命 令之后到本源文件结束,除非用#undef命令终止宏名的作用域。 对程序中用双引号括起来的字符串内的子串和用户标识符中的成分 不做替换。例如已定义: 同一个宏名不能重复定义,除非两个宏定义命令行完全一致。 1.2带参数的宏定义 形参表中的不同形参之间用逗号隔开,字符串中包含形参表中的参数,带参

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删除用户定义函数的方法。

define宏定义中的#,##,@#及符号

d efine宏定义中的#,##,@#及\符号(ZT) C++ STL学习2011-04-24 18:04:03 阅读19 评论0 字号:大中小订阅 1、# (stringizing)字符串化操作符。其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。 如: #define example(instr) printf("the input string is:\t%s\n",#instr) #define example1(instr) #instr 当使用该宏定义时: example(abc);在编译时将会展开成:printf("the input string is:\t%s\n","abc"); string str=example1(abc);将会展成:string str="abc"; 注意: 对空格的处理 a。忽略传入参数名前面和后面的空格。 如:str=example1( abc );将会被扩展成str="abc"; b.当传入参数名间存在空格时,编译器将会自动连接各个子字符串,用每个子字符串中只以一个空格连接,忽略其中多余一个的空格。

如:str=exapme( abc def); 将会被扩展成str="abc def"; 2、## (token-pasting)符号连接操作符 宏定义中:参数名,即为形参,如#define sum(a,b) (a+b);中a和b 均为某一参数的代表符号,即形式参数。 而##的作用则是将宏定义的多个形参成一个实际参数名。 如: #define exampleNum(n) num##n int num9=9; 使用: int num=exampleNum(9); 将会扩展成int num=num9; 注意: 1.当用##连接形参时,##前后的空格可有可无。 如:#define exampleNum(n) num ## n 相当于#define exampleNum(n) num##n 2.连接后的实际参数名,必须为实际存在的参数名或是编译器已知的宏定义 // preprocessor_token_pasting.cpp

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

宏定义中#等的用法

C语言宏定义中"#","#@"和"##"的用法一、引言 #define macro(a)#a #define macro2(a,b)a##b #define macro3(a,b,c)a##b##c #a,表示a不再是一个变量,而变成了字符串"a" ##表示连接,a##b,表示输入的参数名为ab,a##b##c同理,代表变量名为:abc 测试例子: int x=3; int y=4; int xy=10; int xyz=20; CString str; OutputDebugString(macro(x)); str.Format("%d",macro2(x,y)); OutputDebugString(str); str.Format("%d",macro3(x,y,z)); OutputDebugString(str); 输出结果为: x 10 20 第一个为x,marco(x),x变成了"x"字符串 第二个为10,macro(x,y),就是变量xy 第三个为20,macro(x,y,z),就是变量xyz 二、一般用法 #把宏参数变为一个字符串,#@把宏参数变为一个字符,##把两个宏参数贴合在一起。

#include #include #define STR(s)#s//#与参数之间可以有空格 #define TOCHAR(c)#@c #define CONS(a,b)int(a##e##b)//##与参数之间可以有空格 int main(void) { printf(STR(pele));//输出字符串"pele" printf("%c\n",TOCHAR(z));//输出字符z printf("%d\n",CONS(2,3));//2e3输出:2000 return0; } 三、当宏参数是另一个宏的时候 需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开的。 #define A(2) #define STR(s)#s #define CONS(a,b)int(a##e##b) printf("int max:%s\n",STR(INT_MAX)); 这行会被展开为: printf("int max:%s\n","INT_MAX"); printf("%s\n",CONS(A,A)); 这一行被展开为: printf("%s\n",int(AeA)); INT_MAX和A都不会再被展开,然而解决这个问题的方法很简单,多加一层中间转换宏。加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数。 #define A(2) #define_STR(s)#s #define STR(s)_STR(s)//转换宏 #define_CONS(a,b)int(a##e##b) #define CONS(a,b)_CONS(a,b)//转换宏 printf("int max:%s\n",STR(INT_MAX)); 输出为:int max:0x7fffffff STR(INT_MAX)-->_STR(0x7fffffff)-->"0x7fffffff"

含参数的宏与函数的优缺点

1.函数调用时,先求出实参表达式的值,然后带入形参。而使用带参的宏只是进行简单的字符替换。 2.函数调用是在程序运行时处理的,分配临时的内存单元;而宏展开则是在编译时进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。 3.对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换;而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时带入指定的字符即可。宏定义时,字符串可以是任何类型的数据。 4.调用函数只可得到一个返回值,而用宏可以设法得到几个结果。 5.使用宏次数多时,宏展开后源程序长,因为每展开一次都使程序增长,而函数调用不使源程序变长。 6.宏替换不占运行时间,只占编译时间;而函数调用则占运行时间(分配单元、保留现场、值传递、返回)。 一般来说,用宏来代表简短的表达式比较合适。 内联函数和宏很类似,而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。 当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。内联函数是不能为虚函数的,但样子上写成了内联的,即隐含的内联方式。在某种情况下,虽然有些函数我们声明为了所谓“内联”方式,但有时系统也会把它当作普通的函数来处理,这里的虚函数也一样,虽然同样被声明为了所谓“内联”方式,但系统会把它当然非内联的方式来处理。

宏定义

一、#define的基本用法 #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能理解该命令的本质,总是在此处产生一些困惑,在编程时误用该命令,使得程序的运行与预期的目的不一致,或者在读别人写的程序时,把运行结果理解错误,这对 C语言的学习很不利。 1 #define命令剖析 1.1 #define的概念 #define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。 该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。 (1)简单的宏定义: #define<宏名><字符串> 例:#define PI 3.1415926 (2) 带参数的宏定义 #define<宏名>(<参数表>)<宏体> 例:#define A(x) x 一个标识符被宏定义后,该标识符便是一个宏名。这时,在程序中出现的是宏名,在该程序被编译前,先将宏名用被定义的字符串替换,这称为宏替换,替换后才进行编译,宏替换是简单的替换。 1.2 宏替换发生的时机 为了能够真正理解#define的作用,让我们来了解一下对C语言源程序的处理过程。当我们在一个集成的开发环境如Turbo C中将编写好的源程序进行编译时,实际经过了预处理、编译、汇编和连接几个过程。其中预处理器产生编译器的输出,它实现以下的功能: (1)文件包含 可以把源程序中的#include 扩展为文件正文,即把包含的.h文件找到并展开到#include 所在处。 (2)条件编译 预处理器根据#if和#ifdef等编译命令及其后的条件,将源程序中的某部分包含进来或排除在外,通常把排除在外的语句转换成空行。 (3)宏展开 预处理器将源程序文件中出现的对宏的引用展开成相应的宏定义,即本文所说的#define的功能,由预处理器来完成。

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)。

宏定义有参数跟没参数的区别

宏定义有无参数宏定义和带参数宏定义两种。 无参数的宏定义的一般形式为 # define 标识符字符序列 其中# define之后的标识符称为宏定义名(简称宏名),要求宏名与字符序列之间用空格符分隔。这种宏定义要求编译预处理程序将源程序中随后所有的定名的出现(注释与字符串常量中的除外)均用字符序列替换之。前面经常使用的定义符号常量是宏定义的最简单应用。如有:# define TRUE 1 # define FALSE 0 则在定义它们的源程序文件中,凡定义之后出现的单词TRUE将用1替代之;出现单词FALSE 将用0替代之。 在宏定义的#之前可以有若干个空格、制表符,但不允许有其它字符。宏定义在源程序中单独另起一行,换行符是宏定义的结束标志。如果一个宏定义太长,一行不够时,可采用续行的方法。续行是在键人回车符之前先键入符号"\"。注意回车要紧接在符号"\"之后,中间不能插入其它符号。 宏定义的有效范围称为宏定义名的辖域,辖域从宏定义的定义结束处开始到其所在的源程序文件末尾。宏定义名的辖域不受分程序结构的影响。可以用预处理命令#undef终止宏定义名的辖域。 在新的宏定义中,可以使用前面已定义的宏名。例如, # define R 2.5 # define PI 3.1415926 # define Circle 2*PI*R # define Area PI* R * R 程序中的Circle被展开为2*3.1415926* 2.5,Area被展开为3.1415926*2.5*2.5。 如有必要,宏名可被重复定义。被重复定义后,宏名原先的意义被新意义所代替。 通常,无参数的宏定义多用于定义常量。程序中统一用宏名表示常量值,便于程序前后统一,不易出错,也便于修改,能提高程序的可读性和可移植性。特别是给数组元素个数一个宏定义,并用宏名定义数组元素个数能部分弥补数组元素个数固定的不足。 注意:预处理程序在处理宏定义时,只作字符序列的替换工作,不作任何语法的检查。如果宏定义不当,错误要到预处理之后的编译阶段才能发现。宏定义以换行结束,不需要分号等符号作分隔符。如有以下定定义: # define PI 3.1415926; 原希望用PI求圆的周长的语句 c=2*PI*r; 经宏展开后,变成 c=2*3.1415926*r; 这就不能达到希望的要求。 带参数宏定义进一步扩充了无参数宏定义的能力,在字符序列替换同时还能进行参数替

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)如果在表定义内使用某个用户定义的数据类型,或者将某个规则或默认值绑定到这种数据类型,则不能删除该类型。 (2)要删除一用户自定义类型,该数据类型必须存在,否则返回一条错误信息。 3、执行权限

C语言中的宏定义

https://www.360docs.net/doc/3816110522.html,/24994073_d.html C语言中的宏定义 14.3 宏定义 我们从第2章以来使用的宏被称为简单的宏,它们没有参数。预编译器也支持带参数的宏。本节会先讨论简单的宏,然后再讨论带参数的宏。在分别讨论它们之后,我们会研究一下二者共同的特性。 14.3.1 简单的宏 简单的宏定义有如下格式: [#define指令(简单的宏)] #define 标识符替换列表 替换列表是一系列的C语言记号,包括标识符、关键字、数、字符常量、字符串字面量、运算符和标点符号。当预处理器遇到一个宏定义时,会做一个“标识符”代表“替换列表”的记录。在文件后面的内容中,不管标识符在任何位置出现,预处理器都会用替换列表代替它。 不要在宏定义中放置任何额外的符号,否则它们会被作为替换列表的一部分。一种常见的错误是在宏定义中使用 = : #define N = 100 /*** WRONG ***/ int a[N]; /* 会成为 int a[= 100]; */ 在上面的例子中,我们(错误地)把N定义成一对记号(= 和100)。 在宏定义的末尾使用分号结尾是另一个常见错误: #define N 100; /*** WRONG ***/ int a[N]; /* become int a[100;]; */ 这里N被定义为100和;两个记号。 在一个宏定义中,编译器可以检测到绝大多数由多余符号所导致的错误。但不幸的是,编译器会将每一处使用这个宏的地方标为错误, 而不会直接找到错误的根源——宏定义本身,因为宏定义已经被预处

理器删除了。 简单的宏主要用来定义那些被Kernighan和Ritchie称为“明示常量”(manifest constant)的东西。使用宏,我们可以给数值、字符和字符串命名。 #define STE_LEN 80 #define TRUE 1 #define FALSE 0 #define PI 3.14159 #define CR '\r' #define EOS '\0' 使用#define来为常量命名有许多显著的优点: l 程序会更易读。一个认真选择的名字可以帮助读者理解常量的意义。否则,程序将包含大量的“魔法数”,使读者难以理解。 l 程序会更易于修改。我们仅需要改变一个宏定义,就可以改变整个程序中出现的所有该常量的值。“硬编码的”常量会更难于修改,特别是有时候当他们以稍微不同的形式出现时。(例如,如果一个程序包含一个长度为100的数组,它可能会包含一个从0到99的循环。如果我们只是试图找到所有程序中出现的100,那么就会漏掉99。) l 可以帮助避免前后不一致或键盘输入错误。假如数值常量3.14159在程序中大量出现,它可能会被意外地写成3.1416或3.14195。 虽然简单的宏常用于定义常量名,但是它们还有其他应用。 l 可以对C语法做小的修改。实际上,我们可以通过定义宏的方式给C语言符号添加别名,从而改变C语言的语法。例如,对于习惯使用Pascal的begin和end (而不是C语言的{和})的程序员,可以定义下面的宏: #define BEGIN { #define END } 我们甚至可以发明自己的语言。例如,我们可以创建一个LOOP“语句”,来实现一个无限循环: #define LOOP for (;;) 当然,改变C语言的语法通常不是个好主意,因为它会使程序很难被其他程序员所理解。 l 对类型重命名。在5.2节中,我们通过重命名int创建了一个Boolean类型:#define BOOL int

第九章编译预处理与带参数的主函数

第九章编译预处理与带参数的主函数 一、单项选择题 1.C程序中,以#号带头的行是预编译(A)。 A.命令 B.语句 C.函数 D.字符串 2.下列正确的预编译命令是(B)。 A.define PI 3.14159 B.#define p(a,b) strcpy(a,b) C. #include stdio.h D. # define PI3.14159 3.下列命令或语句中,正确的是(C)。 A.#define MYNAME= “ABC” B.#include stdio.h C. for(i=0;i<10;i++); D.struct int stu{int name}; 4.下列命令或语句中,正确的是(A)。 A.#define PI 3.14159 B. include “stdio.h” C.for(i=0,i<10,i++)a++ D.static struct {int i;}b={2}; 5.下列命令或语句中,错误的是(B)。 A. #define PI 3.14159 B.#include C.if(2); D.for(; ;) if(1) break; 6.定义带参数的宏计算两式乘积(如x2+3x-5与x-6),下列定义中哪个是正确的(C)。 A.#define muit(u,v)u*v B.#define muit(u,v)u*v; C.#define muit(u,v)(u)*(v) D.#define muit(u,v)=(u)*(v) 7.宏定义#define div(a,b) a/b的引用div(x+5,y-5)替换展开后是(A)。 A.x+5/y-5 B.x+5/y-5; C.(x+5)/(y-5) D.(x+5)/(y-5); 8.定义带参数的宏“#define jh(a,b,t)t=a;a=b;b=t”,使两个参数a、b的值交换,下列表述中哪个是正确的(D)。 A.不定义参数a和b将导致编译错误 B.不定义参数a、b、t将导致编译错误 C.不定义参数t将导致运行错误 D.不必定义参数a、b、t类型 9.设有宏定义#define AREA(a,b) a*b,则正确的“宏调用”是(D)。 A.s=AREA(r*r) B.s=AREA(x*y) C.s=AREA D.s=c*AREA((x+3.5),(y+4.1)) 10.设有以下宏定义,则执行语句z=2*(N+Y(5+1));后,z的值为(C)。 #define N 3 #define Y(n) ((N+1)*n) A.出错 B.42 C.48 D.54 11.设有以下宏定义,int x,m=5, n=1时,执行语句IFABC(m+n,m,x);后,x的值为(B)。 #define IFABC(a,b,c) c=a>b?a:b A.5 B.6 C.11 D.出错 12.以下程序中的for循环执行的次数是(C)。 #include “stdio.h” #define N 2 #define M N+1 # define NUM (M+1)*M/2 void main( ) { int i,n=0;

用户自定义数据类型

用户自定义的数据类型复习题 一、选择题 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

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)。

ABB机器人用户定义的数据类型

ABB机器人用户定义的数据类型 1、数组 支持一维、二维和三维数组的成员数据类型。数组可在POU的声明部分和全局变量表中定义。 语法: lt;数组名>:ARRAY[..,..]OF ll1,ll2为数组维数的下限标识,ul1和ul2为数组维数的上限标识。数值范围必须为整数。 示例: Card_game:ARRAY[1..13,1..4]OFINT; 数组的初始化: 可以对数组中的所有元素进行初始化,或不进行初始化。 数组初始化示例: arr1:ARRAY[1..5]OFINT:=1,2,3,4,5; arr2:ARRAY[1..2,3..4]OFINT:=1,3(7);(*等同1,7,7,7*) arr3:ARRAY[1..2,2..3,3..4]OFINT:=2(0),4(4),2,3;(*等同0,0,4,4,4,4,2,3*) 结构化中的数组初始化示例: TYPESTRUCT1 TRUCT 1:int; 2:int; 3:dword; END_STRUCT ARRAY[1..3]OFSTRUCT1:=(p1:=1;p2:=10;p3:=4723),(p1:=2;p2:=0;p3:=299), 1:=14;p2:=5;p3:=112); 数组部分元素初始化示例: arr1:ARRAY[1..10]OFINT:=1,2; 数组中的元素如果没有初始化值,则用基本类型的缺省值初始化其值。在上例中,元素arr1[3]到元素arr1[10]均被初始化为0。 二维数组的元素存取,使用下列语法: lt;数组名>[Index1,Index2] 示例 Card_game[9,2] 注: 如果你在项目中定义了一个名为CheckBounds的功能,则可以自动检查数组的上下限超限错误!下图中给出了如何实现该功能的示例。

C语言里常用的宏定义

01: 防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 02: 重新定义一些类型 防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。 typedef unsigned char boolean; /* Boolean value type. */ typedef unsigned long int uint32; /* Unsigned 32 bit value */ typedef unsigned short uint16; /* Unsigned 16 bit value */ typedef unsigned char uint8; /* Unsigned 8 bit value */ typedef signed long int int32; /* Signed 32 bit value */ typedef signed short int16; /* Signed 16 bit value */ typedef signed char int8; /* Signed 8 bit value */ //下面的不建议使用 typedef unsigned char byte; /* Unsigned 8 bit value type. */ typedef unsigned short word; /* Unsinged 16 bit value type. */ typedef unsigned long dword; /* Unsigned 32 bit value type. */ typedef unsigned char uint1; /* Unsigned 8 bit value type. */ typedef unsigned short uint2; /* Unsigned 16 bit value type. */ typedef unsigned long uint4; /* Unsigned 32 bit value type. */ typedef signed char int1; /* Signed 8 bit value type. */ typedef signed short int2; /* Signed 16 bit value type. */ typedef long int int4; /* Signed 32 bit value type. */ typedef signed long sint31; /* Signed 32 bit value */ typedef signed short sint15; /* Signed 16 bit value */ typedef signed char sint7; /* Signed 8 bit value */ 03: 得到指定地址上的一个字节或字 #define MEM_B(x) (*((byte *)(x))) #define MEM_W(x) (*((word *)(x))) 04: 求最大值和最小值 #define MAX(x,y) (((x)>(y)) ? (x) : (y)) #define MIN(x,y) (((x) < (y)) ? (x) : (y)) 05: 得到一个field在结构体(struct)中的偏移量 #define FPOS(type,field) ((dword)&((type *)0)->field) 06: 得到一个结构体中field所占用的字节数

关于宏定义带参数可能会出现的分号错误问题

关于带参宏定义 By: T7 Date:20170917 (看此文章需要明白#define 的基础“替代”功能) #define add(A) (A)+(A) Int s; S = add(30); //s = (30)+(30) = 60 带参宏,是起到替代的作用 观察下列定义: 第一处: #define LED(a) if (a) \ GPIO_ResetBits(GPIOC, GPIO_Pin_13) \ else \ GPIO_SetBits(GPIOC, GPIO_Pin_13) 第二处: #define LED0(a) if (a) \ GPIO_SetBits(GPIOC,GPIO_Pin_0);\ else \ GPIO_ResetBits(GPIOC,GP IO_Pin_0) 当在函数中调用: LED(1); //此处将会出错,如下图

LED0(1); //不会出错 原因: 第一句:LED(1); 在程序中展开为: If(1) GPIO_ResetBits(GPIOC,GPIO_Pin_13) //此处被执行 Else GPIO_SetBits(GPIOC,GPIO_Pin_13) LED(1);相当于语句GPIO_ResetBits(GPIOC,GPIO_Pin_13) 第二句:LED0(1); If(1) GPIO_SetBits(GPIOC,GPIO_Pin_0); //此处被执行 Else GPIO_SetBits(GPIOC,GPIO_Pin_13) LED0(1);相当于语句GPIO_ResetBits(GPIOC,GPIO_Pin_13); 观察上述展开后的标红被执行的语句,可以看到第一句少了一个分号,故出错“expected a “;””而第二句则正常。 同理当调用 第一句:LED(0); 在程序中展开为: If(0) GPIO_ResetBits(GPIOC,GPIO_Pin_13) Else GPIO_SetBits(GPIOC,GPIO_Pin_13) //此处被执行 “LED(0)”相当于语句GPIO_ResetBits(GPIOC,GPIO_Pin_13) 同时又由于#defien 的替代作用,“LED(0);”会被替代为“GPIO_ResetBits(GPIOC,GPIO_Pin_13);”,故不会出现分号的问题。

相关文档
最新文档