当前位置:文档之家› CPP协议

CPP协议

最近学习CCP协议,总结了下:

1、CCP协议概述

CCP(CAN Calibration Protocol)是一种基于CAN总线的匹配标定协议。ECU都需要经过匹配标定的过程,从而确定其运行参数和控制参数。有时为了实现对ECU的精确控制以及参数匹配修改,满足预定的要求,必须对ECU进行精确的匹配标定以及优化各项控制参数。基于此,ASAM自动化测试系统标准协会(Association for Standardization of Automation and Measuring Systems)制定了CCP协议。更形象地说,CCP协议实现了ECU在运行过程中,内部变量的在线监测以及有需要时对某些变量的在线修改。监测ECU的内部变量可以测试ECU 运行的正确性,若发现某个变量的值不是我们期望的,我们可以标定它,修改成期望的值。举例来说,我们要监测ECU中发动机的转速,若发现发动机转速是错误的,不是我们所需要的,我们立即就可以修改它成正确的我们需要的转速。

2、CCP通信

上面我们对CCP有了个总体的印象,对CCP能够做什么有了了解,下面我们关键的是要怎么实现它。

基于CCP协议的ECU标定采用主-从通信方式,主设备通过CAN总线与多个从设备相连。其中主设备是测量标定系统MCS(Measurement Calibration System),从设备是需要标定的ECU。在这里测量标定系统我介绍一下CANape。CANape是一款ECU标定和测试工具。与CCP协议相结合,能完成对ECU标定,同时还能在ECU运行期间直接访问内存并进行操作。从上面的介绍,现在我们心中应该至少有这么一个框图(如下),通过CAN总线,CANape可以读出ECU中的变量,同时CANape也能写ECU中的变量。

3、CCP协议报文帧格式

CCP属于CAN总线的应用层协议,它占用CAN报文两个ID标志符,即CRO(Command Receive Object)和DTO(Data Transmission Object),使用数据帧中数据场的8个字节。CRO用于主设备向从设备发送命令,DTO则用于从设备发送至主设备数据,ID标识符可以自行约定。CRO数据场的第一个字节为命令代码CMD(Command Code),CCP协议共规定了28条命令。从设备通过CMD代码判断主设备请求的是哪条命令。数据场的第二个字节是命令计数器CTR(Command Counter)。余下6个字节为命令参数,每条命令有各自对应的命令参数。CRO 帧格式如下:

DTO数据场第一个字节PID定义了DTO的类型,用以标示DTO的类型;第2个字节为命令

返回/错误代码ERR(Command Return-/Error Code),第3字节CTR是命令计数器,该位数值与其对应的CRO的CTR值相对应,DTO格式如下:

DTO分三种类型:

1) CRM (Command Return Message):由从设备发送,反馈CRO命令的报文。PID=0xFF;

2) Event Message:当从设备检测到内部发生错误机制时,由从设备自行向主设备发送,报告其当前的运行状态,并请求主设备暂停当前工作进程以处理发生的错误。PID=0xFE;

3) DAQ-DTO(Data Acquisition-DTO):用于DAQ模式,由从设备定期向主设备发送。PID (0x00~0xFD);报文格式如下:

根据CCP协议,主设备首先与从设备建立逻辑连接。建立逻辑连接后,主、从机之间所有的数据传递均由主机控制,从机执行主机命令后返回包含命令响应值或错误代码等信息的报文。任何一个从机都可以定时地根据由主机通过控制命令所设置的列表来传递内部的数据。所以说数据的传递是由主机初始化,由从机来执行,并且是由固定的循环采样频率或事件触发的。

4、CCP协议工作模式

CCP定义了两种工作模式:Polling(查询)模式及DAQ(Data Acquisition Command)模式。查询模式下,主设备与从设备间每一次通信都由主设备发送命令来起始,从设备收到主设备命令后,执行相应操作并反馈一帧报文。这种工作模式需要主机与从机之间进行“一问一答”信息交互,工作效率不高,但实现简单,占用ECU内存资源较小。DAQ模式使从设备可以脱离主设备命令控制按一定周期自动向主设备上传数据。DAQ模式下,主设备首先发送一条请求DAQ命令,从设备收到后,按命令中参数自行配置并组织需要上传数据,然后按一定周期自主向主设备上传数据。这种模式不需要主机命令逐步控制,工作效率高,但实现较复杂,需要上传数据量很大,会占用大量ECU内存空间。

5、两种模式对应的处理过程

定义两种处理器只是为了更好的理解接收CRO报文后的处理过程,DAQ模式首先也还得经过命令处理器对命令进行解读,若为DAQ命令则转给DAQ处理器处理。

1)、针对Polling模式的命令处理器

命令处理器主要是获取并解读主设备的CCP命令,并执行该命令;命令执行完后,向主设备发送应答;若执行出错,应答中应包含向主设备报错的信息;若主设备命令要求对DAQ进行操作,则该操作传送给DAQ处理器处理,由DAQ处理器完成DAQ操作。

2)、DAQ处理器实现DAQ模式

DAQ处理器的任务是根据主设备的需要,定时向CAN总线上发送DAQ数据。DAQ模式,简单的说就是由ECU组织,定期的向CANape发送数据。DAQ传送的数据由一系列的表来组织,这些表称为ODT,每个ODT表包含7个元素。这些ODT描述的参数需要ECU用DAQ-DTO帧周期发送给CANape用来监测。当ECU的DAQ机制启动后,ECU按CANape里设定的周期,将每个ODT表描述的参数当前的值顺次放入相应的DAQ-DTO帧中,然后发送给CANape。

标定的实现过程:CANape发送GET_DAQ_SIZE命令(参数为指定的list号),得到指定的list的ODT数量,并且得到该list中DTO的第一个PID号,然后发送SET_DAQ_PTR命令(参数为list号,ODT号,ODT中的元素号),指定需要初始化的元素。最后,根据命令SET_DAQ_PTR设置的具体元素,发送WRITE_DAQ命令(参数为元素的byte大小,元素的地址),通过反复地执行SET_DAQ_PTR和WRITE_DAQ这两条命令,初始化一个具体的ODT表,然后初始化完一个具体的List表,最后初始化完所有的list表。这样,CANape就完成了ODT 的初始化工作。之后开始和停止DAQ数据的传输。CANape发送START_STOP命令(可以准备DAQ数据的上传),发送START_STOP_ALL来上传所有准备好的DAQ数据。ECU采集指定的数据后以DTO的形式上传给CANape,实现DAQ模式。

6、测量标定系统的总体框图介绍

测量标定系统的简单框图如下图所示。主设备发送CRO报文到总线,经过ECU CAN Driver 的接收,由CAN Driver与CCP Dirver的接口函数把接收的报文转给命令处理器,由命令处理器解析命令,若是查询模式的命令,则根据命令返回相应的CRM报文;若是DAQ模式的命令,则转给DAQ处理器进行处理,之后按命令给定的周期,自己组织采集需要的数据,通过DAQ-DTO报文的形式返回给主设备。

CANape里已经集成了CCP和CAN的驱动,CANape发送命令的形式是通过测量窗口的配置。举例来说,如要测量发动机的转速,首先根据ECU里的map文件确定转速在ECU中的地址,配置成A2L格式的数据库文件,在测量配置窗口配置转速这一变量,设置成polling模式,新建一个显示窗口添加该变量,运行CANape即可实现转速的在线监测。

7、标定数据库(A2L)

CANape与ECU之间的通信需要一个描述文件支持,这个文件称为ASAP2描述文件。CANape对ECU参数标定和数据测量都是基于这个文件,该文件记录了ECU中各参数详细信息,如标定参数和测量变量ECU中存储地址、存储结构、数据类型和转换公式等。CANape中,每个标定参数和测量数据都会有一个变量名,如发动机温度、冷却水温度。当CANape需要

访问某个变量时,找到ASAP2描述文件中变量名,找到该变量在ECU中的存储地址、数据长度等信息。为了对ASAP2文件进行维护和修改,CANape集成了一个ASAP2 Editor的数据库编辑器,生成和修改ASAP2控制器描述文件。所有信息都能对话框形式进行设置和修改。该数据库编辑器还能工作在独立模式下,以生成一个A2L格式的控制器描述文件。当ECU底层程序修改后,一些标定参数和测量数据内存址可能发生变动,CANape支持linker map文件自动更新ASAP2文件里的信息。Map文件是ECU底层程序编译时由编译器生成一种映射文件,Map文件可以自动更新ASAP2文件,保证了测量与标定变量时地址的一致性。

devcpp_教程

前言 对于现在越来越多得关于编程方面得问题和商业公司对版权问题的担心。所以向各位推荐一款类似于VC的IDE。这款IDE所使用的编译程序是 GCC的Win32版本 Mingw32。而IDE本身也是GPL协议的产物。所以,不论是商业用户,还是个人用户都能够自由的使用她,而不必为使用盗版软件而提心吊胆的。另外,由于Mingw32是GCC的Win32版本。所以,也为Win32的程序员可以了解一下Unix和类Unix下的编程感觉。而且,Mingw32对Win32函数的支持也是很不错的。希望,我们的Mingw32之旅可以带给你快乐。 介绍 有关Dev-Cpp的介绍,我在这里不想多做解释。因为下面会具体的介绍和讲解的。我在这里只是想要介绍一下有关GCC的内容。因为,Dev-Cpp所使用的Mingw32是一款GCC 编译器。所以,对GCC的了解有助于使用Dev-Cpp。 gcc.exe 这是一个C语言的编译器,负责编译C语言。这个也许大家都知道。不过,在这里我要先向大家说明一下。gcc只是一个C语言的编译器。不能识别C++代码。所以,以前所说的gcc可以编写C++是一个误传。因为,我们通常所说的GCC不是gcc.exe而是GCC 的一套程序。其中就包括可以编译C++语言的g++.exe 如果,你不确定这个gcc的版本,可以用如下的命令查看。 gcc -v 关于编译,gcc可以通过命令符编译。 gcc source.c -o binary 以上的命令,是让gcc直接由.c代码编译成可执行代码。 也可以这样。 gcc -c source.c -o code.o gcc code.o -o binary 这样就生成了一组二进制代码,然后在通过二进制代码生成可执行程序。 g++.exe 刚才已经说过了,这个是一个用于编译C++代码的程序。基本用法和gcc一样。所以这里不再介绍了。只是让各位了解一下,这个程序是编译C++代码的。 gdb.exe 用于调试程序的。功能非常强大。可以调试C,C++等语言。据说还可以调试Java程序。

CPP和PE膜的区别

摩擦系数就是指薄膜的表面滑的系数,物理上学过的。 CPP薄膜和PE薄膜的共同点是都能进行热封 但是两者有很多区别。 CPP薄膜的机械强度,拉伸强度要比PE膜要高。 CPP薄膜的密度是0.91,而Pe薄膜的密度是0.93 PE膜的耐冷冻性能要比CPP薄膜要好。PE膜在零下18度使用非常好,而CPP薄膜在零摄氏度时就很脆。 CPP薄膜的透明度比PE膜要好。 PE薄膜的耐化学性比CPP薄膜要好。 CPP膜的特性 CPP 薄膜具有透明性好、光泽度高、挺度好、阻湿性好、耐热性优良、易于热封合等特点。CPP薄膜经过印刷、制袋,适用于:服装、针织品和花卉包装袋;文件和相册薄膜;食品包装;及适用于阻隔包装和装饰的金属化薄膜。潜在用途还包括:食品外包装,糖果外包装(扭结膜),药品包装,在相册、文件夹和文件等领域代替PVC,合成纸,不干胶带,名片夹,圆环文件夹以及站立袋复合材料。 CPP耐热性优良。由于PP软化点大约为140℃,该类薄膜可应用于热灌装、蒸煮袋、无菌包装等领域。加上耐酸、耐碱、耐油脂性能优良,使之成为面包产品包装或层压材料等领域的首选材料。其与食品接触性安全,演示性能优良,不会影响内装食品的风味,并可选择不同品级的树脂以获得所需的特性。 PE膜的特性 一、PE保护膜的介绍:PE,全名为Polyethylene,是最结构简单的高分子有机化合物,当今世界应用最广泛的高分子材料。PE保护膜以特殊聚乙烯塑料薄膜为基材,根据密度的不同分为复配线性聚乙烯、高密度聚乙烯、中密度聚乙烯和低密度聚乙 二、PE保护膜的应用领域: 不锈钢板,铝板,铝合金型材,塑钢型材及门窗,铝塑板,氟碳板,镜面板,夹心彩钢板,防火板,饰面板,有机玻璃板,PS,PE,PVC板阳光板,防盗门,标牌,镀膜玻璃,高档家具,高档工艺品,电器柜,电脑外壳,汽车灯具,地板,家用电器外壳,仪器仪表,等各种领域需要保护的产品表面都可使用。 1)PE保护膜的厚度:0.03mm-0.15mm 2)颜色:透明,蓝色,黑色,乳白色,黑底白面色,特殊颜色可根据客户定 3)宽度:1650mm以内,长度在1000M以内

源文件和头文件

c语言笔记--头文件和源文件的区别 关于头文件和源文件的分别 首先,我们可以将所有东西都放在一个.cpp文件内. 然后编译器就将这个.cpp编译成.obj,obj是什么东西? 就是编译单元了.一个程序,可以由一个编译单元组成, 也可以有多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话, 就请使用多个编译单元吧.(一个函数不能放到两个编译单元里面,但两个以上 就可以分别放在一个单元,也就是cpp里面) 那么就是一个.cpp对应一个.obj,然后将所有的obj链接起来(通过一个叫链接器的程序), 组成一个.exe,也就是程序了. 如果一个.cpp要用到另一个.cpp定义的函数怎么办? 只需在这个.cpp种写上他的函数声明就可以了.其余工作由链接器帮你完成,你可以随便调用该函数. 链接器将所有的obj连接起来,但是如果碰巧有相同的函数或外部变量怎么办?他如何识别? 一般来说是不能允许在同一个程序中,出现两个一样的函数名或外部变量名. 但是只得庆幸的是,c++可以通过一种叫做链接属性的关键字来限定,你这个函数是属于整个程序 公用的,还是只是在一个编译单元obj里面使用的.

这些关键字就是extern 和static;extern是外部链接的意思,也就是除了这个单元,外部的单元 也是能够访问这个函数的.static 是内部链接,自属于自己单元. 说了这么久,还没有说.h的作用呢? 其实没有.h也能很好的工作,但是当你发现一个外部链接的函数或外部变量,需要许多份 声明,因为c++这种语言,在使用函数和变量的时候,必须将他声明,为何要声明?声明之后才 知道他的规格,才能更好的发现不和规格的部分.你别妄想一个编译单元,会自动从另一个 编译单元那里得到什么信息,知道你是如何定义这个函数的. 所以说,只要使用到该函数的单元,就必须写一份声明在那个.cpp里面,这样是不是很麻烦, 而且,如果要修改,就必须一个一个修改.这真让人受不了. .h就是为了解决这个问题而诞生,他包含了这些公共的东西.然后所有需要使用该函数的.cpp,只需要 用#include包含进去便可.以后需要修改,也只是修改一份内容. 请注意不要滥用.h,.h里面不要写代码,.h不是.cpp的仓库,什么都塞到里面. 如果在里面写代码,当其他.cpp包含他的时候,就会出现重复定义的情况, 比如将函数func(){printf};放到头文件a.h,里面还有一些a.cpp需要的声明等; 然后你发现b.cpp需要用到a.cpp里面的一个函数,就很高兴的将a.h包含进来.

devcpp-使用手册

Dev-C++简明使用手册 Dev-C++是一个可视化集成开发环境,可以用此软件实现C/C++程序的编辑、预处理/编译/链接、运行和调试。本手册中介绍了Dev-C++常用的一些基本操作,每一位同学都要掌握。 一.启动Dev-C++ 方法一: 1. 鼠标点击任务栏中的“开始”按钮,选“程序”菜单项,然后选“程序”下的子菜单项 “Bloodshed Dev-C++”项,显示该项下的子菜单。 2. 单击”Dev-C ++”菜单项,即可启动Dev-C ++集成开发工具。(如图1所示) 图1 方法二: 直接单击桌面上的Dev-C++的图标。 二.新建源程序 1.从主菜单选择“File”—〉“New”—〉“Source File”(“文件”—〉“新建”—〉“源代码”)即可(如下图2所示)。

图2 如果大家看到界面上的字是中文的,则可以根据以下操作将界面改为英文。点击主菜单“工具”->”环境选项”,在弹出的对话框中选择界面页,在Language下拉列表中选择Chinese 即可,如下图所示。此时界面上的菜单、工具条等全部以英文命名。 2.此时屏幕右下侧出现一片白色区域,可以在此输入程序。如下图3所示。

菜单 工具栏 源程序编辑区域 输出标签页 图3 3.保存源程序到硬盘 一个好的习惯是创建了一个新程序后,在还未输入代码之前先将该程序保存到硬盘某个目录下,然后在程序的编辑过程中经常性地保存程序,以防止机器突然断电或者死机。要保存程序,只需从主菜单选择“File”—〉”Save”就可以将文件保存到指定的硬盘目录。如图4所示。 图4 此时会弹出一个对话框,如图5所示。在此你需要指定文件要存放的目录(此处为F:\temp),文件名称(此处为test)以及保存类型。需要注意的是,在保存类型处一定要选择 C source

C++头文件与源文件

C++中的头文件和源文件 一、C++编译模式 通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp 文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称作C++头文件,里面放的也是C++的源代码。 C+ +语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。.cpp文件里的东西都是相对独立的,在编译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做一次链接(link)就行了。比如,在文件a.cpp 中定义了一个全局函数“void a() {}”,而在文件b.cpp中需要调用这个函数。即使这样,文件a.cpp和文件b.cpp并不需要相互知道对方的存在,而是可以分别地对它们进行编译,编译成目标文件之后再链接,整个程序就可以运行了。这是怎么实现的呢?从写程序的角度来讲,很简单。在文件 b.cpp中,在调用“void a()”函数之前,先声明一下这个函数“void a();”,就可以了。这是因为编译器在编译b.cpp的时候会生成一个符号表(symbol table),像“void a()”这样的看不到定义的符号,就会被存放在这个表中。再进行链接的时候,编译器就会在别的目标文件中去寻找这个符号的定义。一旦找到了,程序也就可以顺利地生成了。 注意这里提到了两个概念,一个是“定义”,一个是“声明”。简单地说,“定义”就是把一个符号完完整整地描述出来:它是变量还是函数,返回什么类型,需要什么参数等等。而“声明”则只是声明这个符号的存在,即告诉编译器,这个符号是在其他文件中定义的,我这里先用着,你链接的时候再到别的地方去找找看它到底是什么吧。定义的时候要按C++语法完整地定义一个符号(变量或者函数),而声明的时候就只需要写出这个符号的原型了。需要注意的是,一个符号,在整个程序中可以被声明多次,但却要且仅要被定义一次。试想,如果一个符号出现了两种不同的定义,编译器该听谁的? 这种机制给C++程序员们带来了很多好处,同时也引出了一种编写程序的方法。考虑一下,如果有一个很常用的函数“void f() {}”,在整个程序中的许多.cpp 文件中都会被调用,那么,我们就只需要在一个文件中定义这个函数,而在其

CPP常用头文件及函数汇总

#include //复数类 #include //信号机制支持 #include //异常处理支持 #include //不定参数列表支持 #include //常用常量 #include //定义输入/输出函数 #include //定义杂项函数及内存分配函数 #include //字符串处理 #include //定义关于时间的函数 #include //宽字符处理及输入/输出 #include //宽字符分类 #include //STL 双端队列容器 #include //异常处理类 #include //文件输入/输出 #include //STL 定义运算函数(代替运算符) #include //定义各种数据类型最值常量 #include //STL 线性列表容器 #include //本地化特定信息 #include //STL 映射容器 #include //STL通过分配器进行的内存分配 #include //动态内存分配 #include //STL常用的数字操作 #include //参数化输入/输出 #include //基本输入/输出支持 #include //输入/输出系统使用的前置声明 #include //数据流输入/输出 #include //基本输入流 #include //STL迭代器 #include //基本输出流 #include //STL 队列容器 #include //STL 集合容器 #include //基于字符串的流 #include //STL 堆栈容器 #include //标准异常类 #include //底层输入/输出支持 #include //字符串类 #include //运行期间类型信息 #include //STL 通用模板类 #include //对包含值的数组的操作 #include //STL 动态数组容器————————————————————————————————C99增加的部分 #include //复数处理 #include //浮点环境

C++工程中的各种文件

c/c++工程中的各种文件【转】 lib是和dll对应的。lib是静态链接库的库文件,dll是动态链接库的库文件。 所谓静态就是link的时候把里面需要的东西抽取出来安排到你的exe文件中,以后运行你的exe的时候不再需要lib。 所谓动态就是exe运行的时候依赖于dll里面提供的功能,没有这个dll,你的exe无法运行。 lib,dll,exe都算是最终的目标文件,是最终产物。而c/c++属于源代码。源代码和最终目标文件中过渡的就是中间代码obj,实际上之所以需要中间代码,是你不可能一次得到目标文件。比如说一个exe需要很多的cpp文件生成。而编译器一次只能编译一个cpp文件。这样编译器编译好一个cpp 以后会将其编译成obj,当所有必须要的cpp都编译成obj以后,再统一link成所需要的exe,应该说缺少任意一个obj都会导致exe的链接失败。 1.obj里存的是编译后的代码跟数据,并且有名称,所以在连接时有时会出现未解决的外部符号的问题。当连成exe后便不存在名称的概念了,只有地址。lib就是一堆obj的组合。 2.理论上可以连接obj文件来引用其他工程(可以认为一个obj文件等价于编译生成它的cpp文件,可以引用obj来替换cpp,也可以添加cpp来替换obj ),但实际中通常用lib来实现工程间相互引用。 3.编译器会默认链接一些常用的库,其它的需要你自己指定。 lib和DLL的区别 (1)lib是编译时需要的,dll是运行时需要的。如果要完成源代码的编译,有lib就够了。如果也使动态连接的程序运行起来,有dll就够了。在开发和调试阶段,当然最好都有。 (2) 一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll 文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。 (3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件(实际上也算是一个静态库,只是在链接时只能把函数在DLL的入口链接到exe中,而不像真正静态链接库那样将函数体真正链接到exe 中,通过lib进行的动态链接实际上也使用了静态链接来实现),一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。 DLL内的函数分为两种: (1)DLL导出函数,可供应用程序调用; (2)DLL内部函数,只能在DLL程序使用,应用程序无法调用它们 创建静态链接库和创建动态链接库 VC6中创建[Win32 Dynamic-Link Library]工程便可以创建出一个空的DLL工程. VC6中创建[Win32 Static Library]工程便可以创建出一个空的LIB工程(静态链接库工程,仅生成一个lib文件).

CPP文件

N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子。现在称 出每只白鼠的重量,要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。帽子的颜色用“red”,“blue”等字符串来表示。不同的小白 鼠可以戴相同颜色的帽子。白鼠的重量用整数表示。 输入 输入第一行为一个整数N,表示小白鼠的数目。 下面有N行,每行是一只白鼠的信息。第一个为正整数,表示白鼠的重量,; 第二个为字符串,表示白鼠的帽子颜色,字符串长度不超过10个字符。 注意:白鼠的重量各不相同。 输出 按照白鼠的重量从小到大的顺序输出白鼠的帽子颜色。 样例输入 3 30 red 50 blue 40 green 样例输出 red green blue 描述 现在有一个仅由小写字母组成的字符串S,假定将字母a,b,c...z依次编号为1,2,3...26,现在要在S中找到所有长度为m的且字母编号和为q 的子串。 输入 第一行输入N,表示测试数据的个数,以下N行每行包含一个测试数据 一行测试数据由三部分组成:字符串S(长度不超过100)、m(m小于S的长度)、q。 输出 输出符合条件的子串个数 后面每行输出一个相应的子串 样例输入 1 abcabc 3 6 样例输出 4

abc bca cab abc 描述 一个正整数,如果它能被x整除,或者它的十进制表示法中某个位数上的 数字为x,则称其为与x相关的数.现求所有小于等于n(n<300)的与x无关的正整数的平方和. 输入 输入为一行,正整数n,(n<300) 输出 输出小于等于n的与3和5无关的正整数的平方和 样例输入 8 样例输出 134 描述 目前,高等院校往往采用GPA来评价学生的学术表现。传统的排名方式是求对每一个学生的平均成绩,以平均成绩作为依据进行排名。 但这样的排名方法已经引起了教育界以及社会各界人士的争议,因为它存在着许多弊端。对于不同的课程,选课学生的平均成绩会不同程度地受到课程的难易程度和老师的严厉程度的制约。因而这样的排名系统无形中就鼓励了学生选择一些比较容易的课程,因为这样可以事半功倍地获得较高的平均分。 为了克服这些弊端,需要对排名系统做一定的改进。 一种改进的方案是对选第i门课的每一个学生的成绩加上一个特定的修 正值di,例如编号为j的学生该课的成绩Gij修改为G'ij=Gij+di。最终使得经过调整后,该课调整后的平均分等于未调整前选该课的所有学生所有课的平均分。你的任务是根据某一个班级学生某学期的成绩,计算每门课的修正值di。

C++头文件和源文件

C++ 源文件与头文件有什么区别 C++的源代码文件分为两类:头文件(Header file)和源文件(Source code file)。头文件用于存放对类型定义、函数声明、全局变量声明等实体的声明,作为对外接口;而源程序文件存放类型的实现、函数体、全局变量定义。对于商业C++程序库,一般把头文件随二进制的库文件发布,而源代码保留。 *一般情况下头文件常以.h或.hpp作为扩展名,而实现文件常以.cpp或.cc为扩展名。头文件一般不直接编译,一个源文件代表一个“编译单元”。在在编译一个源文件时,如果引用的类型、函数或其它实体不在本编译单元内,可以通过引用头文件将其它编译单元内实现的实体引入到本编译单元。 而从本质上讲,这些源代码文件都是纯文本文件,可以使用任何一款文本编译器进行源代码的编辑,并没有本质的区别,这些头文与实现文件的扩展名只是一种习惯。而C++的标准库的头文件则不使用扩展名,例如string、 iostream、cstdio等头文件。对与源文件也一样,你完全可以使用.inl或.cplusplus作为文件的扩展名。事实上,在一些C++的项目中.inl被用作源代码文件的扩展名,保存内联函数,直接包含在源文件中,如ACE(the Adaptive Communication Environment, https://www.doczj.com/doc/eb511091.html,/~schmidt/ACE.html)等。gcc默认支持的C++源文件扩展名有.cc、.cp、.cpp、.cxx、.c++、.CPP、.C(注意后两项是大写,在 Unix/Linux上的文件名是区分大小写的)。例如在gcc中你可以这样编译一个扩展名为.cplusplus的C++程序: g++ -x c++ demo.cplusplus 虽然文件名对程序没有任何影响,但.cpp和.cc这些扩展名是编译器默认支持的,使用这些扩展名您就不需要手动添加编译选项支持您使用的扩展名,如gcc中的-x 选项。 *而实际上,头文件以什么为扩展名并没有什么影响,因为没有人会直接编译头文件,因为头文件里只有声明而没有定义,而在实际的编译过程中,#include预编译指令用到的头文件是被直接插入到源代码文件中再进行编译的,这与直接将头文件的内容复制到#include行所在的位置是没有区别的,这样就很容易理解#include可以出现在文件的什么位置,显然放到一个函数体或类的定义里是不合适的。 *1定义与声明有什么不同 一般来讲定义要放在源代码文件中,而声明要放在头文件中。具体哪些内容应该放在源代码文件中,哪些内容应该放在头文件中,需要清楚地理解,哪些是定义,哪些是声明。 *1 类的定义与声明 类的定义是定义了类的完整结构,包括成员函数与成员变量,如例程[2-1]。 __例程2-1: 类的定义

PlayerTeams C++文件

/* Copyright (c) 2000-2003, Jelle Kok, University of Amsterdam All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the University of Amsterdam nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED W ARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /*! \file PlayerTeams.cpp

 File: PlayerTest.cpp Project: Robocup Soccer Simulation Team: UvA Trilearn Authors: Jelle Kok

cpp关键工艺参数-QbD教程文件

c pp 关键工艺参 数- QbD

一?定义 药品生产工艺通常是一系列的单元操作来得到所需要的产品。单元操作可在批处理模式下或在连续生产工艺中进行。每一个单元操作都是一个独立的活动,其中包括物理或化学变化,如混合、研磨、造粒、烦躁、压缩和包衣等。 可达成的目标:1.识别和理解所有主要变异的来源 2.工艺能够很好地控制物料变异的影响。3准确和可靠地预测产品质量属性。 工艺参数定义:工艺步骤或单元操作的输入运行参数(速度、流速)或工 艺状态变量(温度、压力)。当工艺参数的实际变化能显著影响产出物料的属 性时,该工艺参数就是关键工艺参数。 所以,工艺状态取决于该工艺的关键工艺参数和输入物料的关键物料属性。 工艺的稳健性:在容忍工艺中和物料输入变异的情况下,一个工艺可以传递可接受的药品质量与性能的能力。 对工艺参数的理解,步骤: 1.找出所有可能对工艺性能造成影响的物料属性和工艺参数。 2.用风险评估和科学知识来确定潜在的高风险属性和/或参数。 3.确定这些潜在高风险属性和/或参数的水平与范围。 4.设计和进行实验,合适时采用实验设计(DOE。 5.对实验数据进行分析来确定物料属性或工艺参数是否关键。若实验中的物料 属性/ 工艺参数的变化会显著影响到产品的质量,该关键物料属性/工艺参数 是关键的。 6.建立控制策略。为关键物料属性和关键工艺参数制定可接受的范围;而对于 非关键的属性与参数,其接受范围就是研究的范围。当涉及的工艺参数或物 料属性多于一个时,这些定义的可接受范围可被称为工艺设计空间。 ?方法:

通过参考文献,以往经验或通过一系列从申报到拟商业化工艺规模的实验性研究来确定关键物料属性和关键工艺参数。 ?实例 仿制药片剂的关键工艺参数 工艺参数对最终药品的关键质量属性主要集中在以下几个因素:含量、含量

DevCpp使用简介

Dev-C++使用简介 一、C/C++语言的程序 一个C/C++语言程序由一系列变量和函数构成,其中有且仅有一个主函数。主函数是程序的入口,程序启动后将从主函数的第一条语句开始执行,执行到主函数的最后一条语句结束。标准的C/C++语言中,主函数的原型是”int main(int argc, char** argv)”,”argv”是一个字符串型数组,”argc”是该数组的长度。用户在启动一个C/C++语言的程序时,将一个命令行(command line)提交给操作系统,其中的第一个单词(word)是要执行的程序的名称。操作系统在收到命令行后,统计其中单词的个数”argc”、并把每个单词解析出来作为”argv”的一个元素,然后将这两个参数传递给”argv[0]”所指定的主函数、并开始执行该主函数。如果一个程序的主函数原型是”int main(int argc, char** argv)”,则将该程序称为命令行程序。命令行程序的人机交互界面是键盘和字符终端,程序的输入是键盘输入的字符、输出是字符终端显示的字符串。 下图1演示如何在windows环境下进入命令行界面,图2演示如何在命令行界面下启动可执行程序。在命令行界面下,用户可以输入命令行进行程序启动。命令行的第一个单词是要执行的程序的名称,后面的单词是传递给该程序主函数的参数。例如,”dir”是windows 自带的一个命令行程序,用于显示当前文件目录下的文件;”cd”是windows自带的一个命令行程序,用于从一个文件目录切换到另一个文件目录,新的文件目录作为命令行参数输入给该程序。在命令行界面下输入”dir”时,操作系统将启动dir程序的主函数,其中参数argc的值为1、数组argv的长度为1,argv[0]的值为”dir”。在命令行界面下输入”cd public”时,操作系统将启动cd程序的主函数,其中参数argc的值为2、数组argv的长度为2,argv[0]的值为”cd”、argv[1]的值为”public”。cd程序的主函数将对argv[1]的值进行相应处理,完成当前目录的切换。 图1 在windows环境下进入命令行界面。首先从windows的主菜单搜索框中输入”cmd”并回车,即进入右边的命令行界面。

CPP协议

最近学习CCP协议,总结了下: 1、CCP协议概述 CCP(CAN Calibration Protocol)是一种基于CAN总线的匹配标定协议。ECU都需要经过匹配标定的过程,从而确定其运行参数和控制参数。有时为了实现对ECU的精确控制以及参数匹配修改,满足预定的要求,必须对ECU进行精确的匹配标定以及优化各项控制参数。基于此,ASAM自动化测试系统标准协会(Association for Standardization of Automation and Measuring Systems)制定了CCP协议。更形象地说,CCP协议实现了ECU在运行过程中,内部变量的在线监测以及有需要时对某些变量的在线修改。监测ECU的内部变量可以测试ECU 运行的正确性,若发现某个变量的值不是我们期望的,我们可以标定它,修改成期望的值。举例来说,我们要监测ECU中发动机的转速,若发现发动机转速是错误的,不是我们所需要的,我们立即就可以修改它成正确的我们需要的转速。 2、CCP通信 上面我们对CCP有了个总体的印象,对CCP能够做什么有了了解,下面我们关键的是要怎么实现它。 基于CCP协议的ECU标定采用主-从通信方式,主设备通过CAN总线与多个从设备相连。其中主设备是测量标定系统MCS(Measurement Calibration System),从设备是需要标定的ECU。在这里测量标定系统我介绍一下CANape。CANape是一款ECU标定和测试工具。与CCP协议相结合,能完成对ECU标定,同时还能在ECU运行期间直接访问内存并进行操作。从上面的介绍,现在我们心中应该至少有这么一个框图(如下),通过CAN总线,CANape可以读出ECU中的变量,同时CANape也能写ECU中的变量。 3、CCP协议报文帧格式 CCP属于CAN总线的应用层协议,它占用CAN报文两个ID标志符,即CRO(Command Receive Object)和DTO(Data Transmission Object),使用数据帧中数据场的8个字节。CRO用于主设备向从设备发送命令,DTO则用于从设备发送至主设备数据,ID标识符可以自行约定。CRO数据场的第一个字节为命令代码CMD(Command Code),CCP协议共规定了28条命令。从设备通过CMD代码判断主设备请求的是哪条命令。数据场的第二个字节是命令计数器CTR(Command Counter)。余下6个字节为命令参数,每条命令有各自对应的命令参数。CRO 帧格式如下: DTO数据场第一个字节PID定义了DTO的类型,用以标示DTO的类型;第2个字节为命令

cpp关键工艺参数-QbD教程文件

c p p关键工艺参数- Q b D

一.定义 药品生产工艺通常是一系列的单元操作来得到所需要的产品。单元操作可在批处理模式下或在连续生产工艺中进行。每一个单元操作都是一个独立的活动,其中包括物理或化学变化,如混合、研磨、造粒、烦躁、压缩和包衣等。 可达成的目标:1.识别和理解所有主要变异的来源2.工艺能够很好地控制物料变异的影响。3准确和可靠地预测产品质量属性。 工艺参数定义:工艺步骤或单元操作的输入运行参数(速度、流速)或工艺状态变量(温度、压力)。当工艺参数的实际变化能显著影响产出物料的属性时,该工艺参数就是关键工艺参数。 所以,工艺状态取决于该工艺的关键工艺参数和输入物料的关键物料属性。 工艺的稳健性:在容忍工艺中和物料输入变异的情况下,一个工艺可以传递可接受的药品质量与性能的能力。 对工艺参数的理解,步骤: 1.找出所有可能对工艺性能造成影响的物料属性和工艺参数。 2.用风险评估和科学知识来确定潜在的高风险属性和/或参数。 3.确定这些潜在高风险属性和/或参数的水平与范围。 4.设计和进行实验,合适时采用实验设计(DOE)。 5.对实验数据进行分析来确定物料属性或工艺参数是否关键。若实验中的 物料属性/ 工艺参数的变化会显著影响到产品的质量,该关键物料属性/工艺参数是关键的。 6.建立控制策略。为关键物料属性和关键工艺参数制定可接受的范围;而 对于非关键的属性与参数,其接受范围就是研究的范围。当涉及的工艺参数或物料属性多于一个时,这些定义的可接受范围可被称为工艺设计空间。 二.方法:

通过参考文献,以往经验或通过一系列从申报到拟商业化工艺规模的实验性研究来确定关键物料属性和关键工艺参数。 三.实例 仿制药片剂的关键工艺参数。 工艺参数对最终药品的关键质量属性主要集中在以下几个因素:含量、含量均匀度、溶出度和降解产物。

在DEV-CPP5.4中建立多文件项目的方法

在DEV-C++ 5.4中建立C语言多文件项目的方法 1.点击文件[F]-新建[N]-项目[P]…菜单命令,进入如图1的新项目对话框界面: 图1 新项目对话框图2 另存为对话框 2. 在“新项目”对话框中,单击Console(控制台应用程序),再选择“C项目”或“C++项目”之一(两者结果类似),并输入项目名称后,单击“确定”按钮,进入“另存为”对话框(如图2)。 3. 在另存为”对话框中,选择保存项目的文件夹后,单击“保存”按钮,进入如图3的main.c编辑界面。 图3 main.c编辑界面 4. 在文件main.c的主函数main()中输入欲编写的程序即可。 5. 也可以用菜单“文件[F]-新建[N]-源代码[S]”,在出现的“项目中添加新单元”提示信息窗口中,点击“Yes”,将新建的源文件保存并添加到项目中。完成后的编辑界面如图4所示。

图4 编辑界面 6. 完成后,直接按功能键F9编译即可得到项目的可执行文件exer.exe。完成整个项目的创建工作。 注意:也可以在第2步“新项目”对话框中,单击Empty Project(空项目),其余步骤与上述类似,只是不会自动生成main.c,全部源程序均由自己建立而已。 可用下面三个文件测试: /* main.c */ #include #include extern int a; int m=30; void funA(void); void funB(void); int main(void) { funA(); funB(); printf( "Hello! Running main() Now!\n"); printf( "a=%d m=%d in main()\n",a,m); return 0; } /* f1.c */ #include void funB(void) { int b=20; printf( "Hello! Running funB() Now!\n"); printf( "b=%d in funB()\n",b); return; }

C++中的文件输入输出

C++中的文件输入/输出(1) 原作:Ilia Y ordanov, loobian@https://www.doczj.com/doc/eb511091.html, 简介 本教程将以C++最基本的文件I/O(输出/输出)开始。此后,我将从更深入的方面,为你展示一些技巧,并分析给出一些有用的函数。 你需要对C++有一个较好的理解,否则这个教程于你而言将是陌生而毫无用处。 你的第一个程序 首先我将给出一段代码,接着再逐行进行解释。我们的第一个程序将建立一个文件,并写入一些字符: #include void main() // 程序从这里开始运行 { ofstream SaveFile(“cpp-home.txt”); SaveFile << “Hello World, from https://www.doczj.com/doc/eb511091.html, and Loobian!”; SaveFile.close(); } 仅仅如此吗?没错!这个程序将在当前运行目录下建立一个名为cpp-home.txt的文件,并向它写入“Hello World, from https://www.doczj.com/doc/eb511091.html, and Loobian!”。 下面给出各行的含义: #include ——你需要包含此文件以使用C++的文件输入/输出函数。注意:一旦包含了这个文件,你不再需要(为了使用cout/cin)包含iostream.h,

因为fstream.h已经自动包含了它。 在这个头文件中声明了若干个类,包括ifstream,ofstream及fstream,它们都继承自istream和ostream类。 ofstream SaveFile(“cpp-home.txt”); 1)ofstream即“output file stream(输出文件流)”。它将建立一个句柄(handle),以便我们以后能以一个文件流的形式写入文件。 2)SaveFile ——这是文件句柄的名字,当然,你还可以换用任何一个你想要的名称。 3)(“cpp-home.txt”);——打开名为cpp-home.txt的文件。如果程序运行的当前目录已经存在这样一个文件,则它将被替换掉;万一不存在,程序也会为你创建一个为文件,你不必为此而担心。 现在,让我们稍微深入一点点。首先,我要指出的是:ofstream是一个类。因此ofstream SaveFile(“cpp-home.txt”);这一语句将创建一个该类的对象;而我们在括号中所传递的参数实际上将传给构造函数:在这里我们将我们要建立的文件的名称作为实际参数传递给了该类的构造函数。当然,我们还可以传递其它的一些信息,不过我以后再对其进行讲解。 SaveFile << “Hello World, from https://www.doczj.com/doc/eb511091.html, and Loobian!”;——“<<”看起来是不是很亲切?不错,想必你已经在cout << 中见到过。这是一个预定义好的运算符。不管怎么说,这行语句所做的,是将上面的那段文本写入文件。正如前面所提到的,SaveFile是一个文件句柄,它关联一个打开的流式文件。所以,我们只须输入句柄名,再跟着输入“<<”,然后接着写下一串用引号括起来的文本,就可以实现对文件的写入。如果我们想写入的是某个变量的值而不是带引号的文本,也只须像通常使用cout << 一样将变量传递给句柄对象,像这样: SaveFile << variablename; 就可以了! SaveFile.close(); ——既然我们打开了一个流文件,那么当我们用完它之后,就必须关闭它。SaveFile是ofstream类的一个对象,而该类(ofstream)有一个

WIN7中用cmd运行CPP文件

WIN7中用cmd运行CPP文件 我的电脑已经安装了VC,想用CMD直接编译连接cpp形成exe文件,就像配置好jre后直接在DOS里运行java程序一样。 1、首先配置环境变量: 在path中添加 X:/Program Files/Microsoft Visual Studio /VC98/bin; X是VC的安装盘 但是现在在CMD里输入cl ***.cpp时,DOS里提示连CL的命令都不存在,原来在刚才路径的文件夹里少了一个文件mspdb60.dll 为了证明这一点,可以点击X:/Program Files/Microsoft Visual Studio /VC98/bin 中的cl.exe,它会提示你缺少mspdb60.dll文件,建议重新安装。 事实上,只用将目录\Common\MSDev98\Bin下的mspdb60.dll文件复制到X:\Program Files\Microsoft Visual Studio\VC98\BIN下即可。 此时单独输入CL,命令有效了,但是仍然不能执行cl ***.cpp命令。 (这次修改环境变量并不需要重启电脑) 2、继续配置环境变量: 在我的电脑->属性->高级->环境变量->系统变量中新建系统变量LIB、INCLUDE 并设置它们的值为: (LIB)C:/Program Files/Microsoft SDKs/Windows/v6.0A/Lib;C:/Program Files/Microsoft SDKs/Windows/v5.0/Lib;X:/Program Files/Microsoft Visual Studio /VC/lib (INCLUDE)X:/Program Files/Microsoft Visual Studio 9.0/VC/include 这次再次在DOS里输入cl ***.cpp时,仍然提示相同的错误,那是因为没有重启电脑,重启之后,一切解决,大功告成。 3、上文中的一切路径请根据自己电脑的实际路径寻找,有些文件夹的名字会不同,这跟安装VC的版本有关,但是大同小异。 另外,运行CPP文件时,首先要进入该文件所在的目录,再编译连接运行 例如,对于一个放在桌面的1.cpp文件的命令语句: cd C:\Users\Administrator\Desktop 进入该目录 cl 1.cpp 编译连接形成exe文件 1.exe 运行该exe文件

相关主题
文本预览
相关文档 最新文档