当前位置:首页教育技巧excel技巧excel表格单元

excel宏怎么传参,电子表格宏定义传参

2024-07-04 10:03:11


1. 宏定义传参

1 作用时间不同。宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以。

2 本质类型不同。宏定义的只是一段字符,在编译的时候被替换到引用的位置。在运行中是没有宏定义的概念的。而变量在运行时要为其分配内存。

3 宏定义不可以被赋值,即其值一旦定义不可修改,而变量在运行过程中可以被修改。

4 宏定义只有在定义所在文件,或引用所在文件的其它文件中使用。 而全局变量可以在工程所有文件中使用,只要再使用前加一个声明就可以了。换句话说,宏定义不支持extern。

2. 传递给宏的参数能包含预处理指令吗

C语言的预处理主要有三个方面的内容: 1.宏定义; 2.文件包含; 3.条件编译。

预处理命令以符号“#”开头。

宏定义命令:#define、#undef,用来定义和解除宏。(值得注意的是还可以定义带参数的宏)

文件包含命令:#include "文件名" 或者 #include 。使用前者时会优先从当前目录查找头文件,使用后者时优先从默认的系统目录查找。

条件编译:#ifdef、#else、#endif、#elif 等。出于程序兼容性的考虑,有些语句希望在条件满足时才编译。这时候会用到条件编译的命令。

3. 定义带参数的宏

还是用软件编吧 又快又好 如果你是做凹字用宏程序还简单些 假如是做凸字呢 如果字不是平面上的而是曲面上的呢 用宏程序就算研究出来也没有什么实际用处 字多可以砸上 字少宏程序就太慢了 字都刻完了 程序还没编完 如果你是要做那种 做一个加一个的的数字 你的意思是不是 第一个工件上刻1 第二个工件上刻2 如果是这样的话 你先要知道系统参数 数控系统里面有一个系统参数是管计数的 要把它做到你的宏程序变量里面 这样加工完一个工件 你的程序就知道完成一个了 在宏程序里就会调用别的程序 你要先编好十个阿拉伯数字的加工子程序 一个数字一个程序 用主宏程序分别调用这十个子程序 中间的逻辑关系要处理好 宏程序其实控制的就是逻辑关系 只要你理清逻辑关系就没问题了

4. 宏定义传递参数

宏和模板都是代码生成计数,但宏的代码生成更加黑科技。宏相比模板比较大的差异如下:

宏可以定义对象

宏可以放在代码的任何位置。模板只支持模板类的使用,和模板函数的调用

我举个例子吧,Qt的Q_DECLARE_METATYPE宏

这个宏是什么功能呢?就是实现元编程,可以生成支持一个类型元信息的代码。这个宏有什么作用呢?主要是为QVariant类服务的QVariant类是个很神奇的类,它可以存入一个任意类型数据,只要那个类型提供默认构造函数和拷贝构造函数。然而它和容器类的区别是——它不是模板类!

它不是模板类!

它不是模板类!

比如std::list<int>和std::list<double>并不是同一种类型,如果我要做一个类似数据总线的,传递数据的接口,这两者就不同替换而存了一个int的QVariant,和存了一个double的QVariant,是同一个类型

还没搞清楚?想一想脚本语言这在用于传递一些未知类型的数据时,比容器类方便得多,比void*安全得多,而且它自带类型信息,可通过id/name来标识类型在读取数据时,QVariant的类型安全是这么实现的如果其中存储的类型,不能转换为T(隐式转换、自动转换),则返回一个默认构造的T类型对象。另外,默认提供了常见基础类型的转换,比如int、double、string之间的转换而QVariant那么多黑科技,全部依靠那个宏实现。如果你自己写了个class,想让它支持QVariant,只需要这么写这就是宏的魅力所在

5. 带参宏定义与函数

在C语言程序中:

max函数用于求最大值,可以定义如下函数:int max(int a, int b){if(a>b) return a;return b;}

不过该函数只能用于整型而不能用于其它类型。如果有其它类型,比如浮点型,则需要再重新修改。

float max(float a , float b)

{if( a > b) return a;return b;}

其实这样代码量比较少的操作,可以定义为宏函数,即带参宏定义的形式。define max(a,b) ((a)>(b)?(a):(b))这样既可以不受参数类型限制,又可以提高执行效率。

6. 变参宏定义

PLC里面是有宏这个概念的,其实所谓的宏不管是任何一种编程软件,它只是一个思想而已,具体的形式可能是不一样的,但功能相同,就是为了简化重复编程的过程 而建立的宏的概念,和EXCEL里面的宏概念类似。它就是指的一组算法。

比如三菱PLC 的Q系列,里面有个 Macro功能,也就是宏功能,大概用法就是你编写完成一段程序,你可以把这段程序注册为宏,然后设置一些宏的参数,以后你就可以通过调用该宏,并设置一些你当时在建立该宏时所设置的一些参数,就可以自动生成相应的程序,简化书写步骤。希望对你有帮助

7. 程序中引用宏定义的实参

在法兰克加工中心g76上,有一个比较特殊的固定循环指令----镗孔循环,在使用这个循环的时候,有一个退刀方向的设定,这个方向不是是固定的,与机床镗刀的安装方向有关,所以在使用的时候,需要通过参数设定来完成,对于FANUC和828D系统的设定是不同的。

(1)FANUC 系统参数设定:

设定在参数5148 中,这个参数是分XYZ三个一般我们使用的是G17平面,钻孔轴为Z轴,所以退刀方向都设定在参数Z的那一项里面,也即有如下关系:Z(1)退刀方向为X+ Z(-1)退刀方向为X- Z(2)退刀方向为Y+ Z(-2)退刀方向为Y-。

当然你也会遇到机床上安装有直角头,那么呢,你的刀具轴有可能转换成X或者Y轴,那么此时,你镗孔的时候就需要更改5148参数,当然你可以手动更改,也可以使用程序更改,使用宏程序进行参数的更改。参数还是那个参数,知识还是那些,如何能够将你遇到的知识和实际需要解决的问题关联起来,才能够算上对知识的一种再创造。

(2)828D系统

如果使用西门子自带的编程循环指令,通过编程界面向导设定,如果使用ISO编程,需要通过如下设定:

8. 带参宏定义的形参

格式:#define宏名(参数表)字符串例如:#defineS(a,b)a*barea=S(3,2);

第一步被换为area=a*b;,第二步被换为area=3*2;类似于函数调用:

(1)实参如果是表达式容易出问题#defineS(r)r*rarea=S(a+b)

;第一步换为area=r*r;,第二步被换为area=a+b*a+b;正确的宏定义是#defineS(r)((r)*(r)

)(2)宏名和参数的括号间不能有空格(3)宏替换只作替换,不做计算,不做表达式求解(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存(5)宏的哑实结合不存在类型,也没有类型转换。

(6)函数只有一个返回值,利用宏则可以设法得到多个值(7)宏展开使源程序变长,函数调用不会(8)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)

9. 宏定义传参数

返回值只能是一个,但类型可以随便,比如你返回一个数组就可以是多个值了,但这个数组不能显式返回只能利用Variant型,再进行转化回来。

还有一种这个比较方便简单:就是利用ByRef去定义参数它指的是地址传值,而ByVal是传值的。传址就可以改变原值。那么你要多少个返回值,只需要多加参数就OK了。

相关信息


电脑版

【免责声明】本站信息来自网友投稿及网络整理,内容仅供参考,如果有错误请反馈给我们及时更正,对文中内容的真实性和完整性本站不提供任何保证,不承但任何责任。
版权所有:学窍知识网 Copyright © 2011-2024 www.at317.com All Rights Reserved .