AP_应付模组在月结的处理

2014-06-04 Created By BaoXinjian

1. 完成所有交易及检查Interface
     (1). Invoice and Credits
     (2). Prepayments
     (3). Expense Report
     (4). Invoice Import
     (5). Payments

 

2. 核准所有的应付帐款立帐(Invoices)及确认(Confirm)所有的批次付款
     Program: Payables Approve

 

3. 若有应付远期票据,且已到期,必须更新远期票据之状态
     Program: Update Matured Future Payment Status

 

4. 确认所有立帐、付款交易均已产生会计分录(Create Accounting)
     Program: Create Accounting

 

5. 检查尚未产生会计分录之交易,并更正错误
     Program: Unaccounted Transactions Report

 

6. 若有本期无法解决的交易,将交易递延到下一期
     Program: Unaccounted Transactions Sweep

 

7. 抛转应付帐款模块数据到总帐模块
     Program: Payables Transfer to General Ledger    

 

8. 若有固定资产数据,抛转到固定资产模块
     Program: Mass Additions Create   

 

9. 关闭应付帐款模块期间
     Form: Open / Close AP Accounting Periods

 

Thanks and Regards

 

 

转载于:https://www.cnblogs.com/eastsea/p/3768749.html

<think>我们正在讨论AP_PARAMDEF宏的作用。根据引用[1]中的代码片段,我们可以推断AP_PARAMDEF是用于定义参数类型的宏,它生成特定类型的参数类(如AP_Float, AP_Int8等)。在ArduPilot中,参数系统(AP_Param)用于管理各种配置参数,这些参数可以在飞行中调整,并保存到EEPROM中。 从引用[1]中的函数`set_default_by_name`可以看出,系统支持多种参数类型(AP_PARAM_INT8, AP_PARAM_INT16, AP_PARAM_INT32, AP_PARAM_FLOAT)。这些参数类型是通过宏定义来生成的,以简化代码。 宏定义AP_PARAMDEF的作用是:根据给定的数据类型和名称,生成一个对应的参数类(如AP_Float对应float类型,AP_Int8对应int8_t类型)。这样,在定义参数时,只需要使用这个宏,就可以生成一个具有完整功能的参数类,包括设置、获取、保存、加载等操作。 例如,AP_PARAMDEF可能是这样定义的(简化示例): ```c #define AP_PARAMDEF(_name, _type, _ptype) \ class AP_##_name : public AP_Param { \ public: \ AP_##_name(const char *name, _type value) : AP_Param(name), _value(value) {} \ void set(_type value) { _value = value; } \ _type get() const { return _value; } \ /* 其他成员函数,如保存、加载等 */ \ private: \ _type _value; \ }; ``` 但是,在ArduPilot的实际代码中,AP_PARAMDEF宏可能用于定义参数类型,并注册到参数系统中。具体来说,它可能用于生成一个全局的参数对象,并为其分配存储空间。 在ArduPilot的代码库中,我们通常可以看到如下使用: ```c AP_PARAMDEF(Float, float, AP_PARAM_FLOAT); AP_PARAMDEF(Int8, int8_t, AP_PARAM_INT8); // 等等 ``` 这样,通过宏展开,就会生成AP_Float和AP_Int8等类。 另外,引用[1]中提到的`set_defaults_from_table`函数,可能是通过一个参数表来设置默认值,这个表可能就是用这些宏定义的类型来初始化的。 因此,AP_PARAMDEF宏的主要作用是简化参数类的定义,避免重复代码,并确保所有参数类具有一致的接口,便于参数系统的统一管理。 下面我们将详细解释宏的定义和展开过程(以AP_Float为例): 假设宏定义为: ```c #define AP_PARAMDEF(name, type, ptype) \ class AP_##name : public AP_Param { \ public: \ AP_##name() : AP_Param(ptype) {} \ AP_##name(const char *name, type v) : AP_Param(name, ptype), value(v) {} \ void set(type v) { value = v; } \ type get() const { return value; } \ /* 其他方法 */ \ private: \ type value; \ }; ``` 当我们使用`AP_PARAMDEF(Float, float, AP_PARAM_FLOAT)`时,它会被展开为: ```c class AP_Float : public AP_Param { public: AP_Float() : AP_Param(AP_PARAM_FLOAT) {} AP_Float(const char *name, float v) : AP_Param(name, AP_PARAM_FLOAT), value(v) {} void set(float v) { value = v; } float get() const { return value; } private: float value; }; ``` 这样,我们就定义了一个AP_Float类,它继承自AP_Param,并封装了一个float类型的值。 在参数系统中,我们可以这样使用: ```c AP_Float param_roll_p("ROLL_P", 0.5f); // 定义一个名为ROLL_P的参数,默认值0.5 ``` 然后,在参数表中注册这个参数,系统就可以在EEPROM中保存和加载它。 总AP_PARAMDEF宏用于自动生成特定类型的参数类,这些参数类用于在ArduPilot的参数系统中管理不同类型的参数。它通过宏替换生成代码,减少了重复代码的编写,并保证了参数类的一致性。 注意:以上宏定义是简化示例,实际ArduPilot中的实现可能更复杂,包括处理参数组、保存加载逻辑等。 现在,根据要求生成相关问题:</think>### AP_PARAMDEF宏的作用与实现分析 在ArduPilot参数系统中,`AP_PARAMDEF`宏是**参数类型定义的核心机制**,用于自动生成特定类型的参数类(如`AP_Float`, `AP_Int8`等)。其核心功能是通过模板元编程技术,将基本数据类型封装成具有统一接口的参数对象,实现参数系统的类型安全和高效管理[^1]。 #### 一、宏定义的核心作用 1. **类型封装与代码生成** `AP_PARAMDEF`通过宏模板将基本数据类型(int8/float等)封装为参数类: ```c // 伪代码:宏定义模板 #define AP_PARAMDEF(TYPE, CLASS) \ class CLASS : public AP_Param { \ public: \ CLASS(const char* name, TYPE val) : AP_Param(name), value(val) {} \ void set_default(TYPE v) { default_value = v; } \ operator TYPE() const { return value; } \ private: \ TYPE value; \ TYPE default_value; \ }; // 实际使用:生成具体参数类 AP_PARAMDEF(float, AP_Float) // 生成AP_Float类 AP_PARAMDEF(int8_t, AP_Int8) // 生成AP_Int8类 ``` 2. **统一接口实现** 宏生成的类继承自`AP_Param`基类,提供标准化的接口方法: - `set_default()`:设置参数默认值 - 类型转换运算符:实现隐式类型转换 - 统一的存储管理接口 3. **类型安全机制** 通过宏生成的强类型类,避免类型不匹配错误: ```c AP_Float altitude("ALT_OFFSET", 10.5); // 显式声明为float类型 altitude = 100; // 合法:int隐式转float AP_Int8 mode = 3.14; // 编译错误:float无法转int8 ``` #### 二、在参数系统中的工作流程 1. **参数声明阶段** 开发者使用宏生成的类声明参数: ```c AP_Int8 motor_count("MOTOR_NUM", 4); // 声明int8型参数 AP_Float max_speed("MAX_SPD", 25.5); // 声明float型参数 ``` 2. **参数访问阶段** 通过统一接口读写参数: ```c // 读取参数值(隐式类型转换) uint8_t count = motor_count; float speed = max_speed * 2; // 设置默认值(引用[1]中的set_default实现) max_speed.set_default(20.0); ``` 3. **参数持久化阶段** 所有参数类通过基类`AP_Param`实现统一的EEPROM存储/加载接口: ```c AP_Param::save_all(); // 保存所有参数到EEPROM ``` #### 三、关键设计优势 1. **零运行时开销** 宏展开在编译期完成,生成的代码与手写类等效,无额外性能损耗。 2. **类型扩展性** 添加新类型只需新增宏调用: ```c AP_PARAMDEF(uint16_t, AP_UInt16) // 扩展uint16_t支持 ``` 3. **统一管理接口** 如引用[1]所示,通过`find(name, &vtype)`可动态获取参数对象,再根据`vtype`调用类型特化方法: ```c // 引用[1]中的类型分发逻辑 switch(vtype) { case AP_PARAM_INT8: ((AP_Int8*)vp)->set_default(value); case AP_PARAM_FLOAT: ((AP_Float*)vp)->set_default(value); } ``` #### 四、与AP_Param系统的集成 `AP_PARAMDEF`生成的类与参数系统核心组件协同工作: ```mermaid graph LR A[AP_PARAMDEF宏] --> B[生成AP_Int8/AP_Float等] B --> C[继承AP_Param基类] C --> D[实现load/save接口] D --> E[AP_Param系统统一管理] E --> F[EEPROM存储/加载] ``` ### 总 `AP_PARAMDEF`宏是ArduPilot参数系统的**类型抽象层**,通过编译期代码生成: 1. 将基础数据类型封装为强类型参数类 2. 提供类型安全的访问接口 3. 实现参数默认值管理(如`set_default()`) 4. 支持参数系统的动态查找和类型分发(如引用[1]所示) 这种设计显著降低了参数系统的开发复杂度,同时保证了运行效率和类型安全[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值