精华内容
下载资源
问答
  • 数组作为函数的入

    千次阅读 2015-02-15 17:23:19
    数组作为函数的形参的时候,表示的只是头指针。不能再用sizeof来计算数组的大小。 如果直接sizeof(array),那就不对了。我们可以把len传进来。 LinkNode * initLink(LinkNode *dummy,int array[],int len) ...

    数组作为函数的形参的时候,表示的只是头指针。不能再用sizeof来计算数组的大小。

    如果直接sizeof(array),那就不对了。我们可以把len传进来。

    LinkNode * initLink(LinkNode *dummy,int array[],int len)
    	{
    		if(dummy == NULL || sizeof(array) == 0)
    			return NULL;
    
    		LinkNode *tmp,*head;
    		tmp = dummy;
    		//使用的是尾插入法
    		for(int i=0;i<len;i++)
    		{
    			LinkNode *p = new LinkNode(array[i]);
    			tmp->next=p;
    			tmp = tmp->next;
    		}
    		head = dummy->next;
    		delete dummy;
    		return head;	
    	}
    
    void main()
    {
    	Solution sol;	
    	int array1[] = {6,2,5};
    	int len1 = sizeof(array1)/sizeof(int);
    	int array2[] = {4,5,6};
    	int len2 = sizeof(array2)/sizeof(int);
    	LinkNode *dummy1 = sol.createLink();
    	LinkNode *head1 = sol.initLink(dummy1,array1,len1);
    	LinkNode *dummy2 = sol.createLink();
    	LinkNode *head2 = sol.initLink(dummy2,array2,len2);
    	return;
    }


    展开全文
  • 为实时监测煤矿用全液压钻机的钻过程参数,实现钻机故障的快速诊断,设计了一种基于CAN总线的钻仪,详细介绍了该仪器硬件、软件设计以及特点。该仪器采用分布式控制,通过CAN总线交换数据,不仅可实时监测并显示泵压...
  • IED屏设置软件

    2018-01-26 13:30:42
    选择当前控制器的型号,通讯方式选择【网络通讯】,屏幕端口填入刚才设置的端口,此时的IP地址不能填设置的IP,须填入路由器的外网地址,即路由器进口【WAN】的IP,点击【加载设置】按钮,则弹出提示“加载屏成功...
  • C语言

    万次阅读 多人点赞 2019-12-18 23:01:50
    在调用有函数时,主调函数和被调用函数之间有数据传递关系 148.在调用一个函数的过程中又出现直接或间接地调用该函数本身称为函数的递归调用 149.在一个函数内部定义的变量是内部变量,称为局部变量 150.在函数...

    公共考点
    1.算法的空间复杂度是指算法在执行过程中所需要的内存空间。
    2.算法的时间复杂度是指算法所需要的计算工作量。
    3.数据的逻辑结构与储存结构不是一一对应的。
    4.队列的修改是以先进先出的原则进行的。–与队列结构有关联的是先到先服务的作业调度。
    5.循环队列中的元素个数随队头指针和队尾指针变化而动态变化。
    6.C语言中的result只是一个自己定义的量
    7.对空和队满时,头尾指针均相等。
    8.冒泡法是在扫描过程中逐次比较相邻两个元素的大小。例:9+8+7+6+5+4+3+2+1=45.
    9.对象间的信息传递靠消息。
    10.多态性是指同一个操作可以是不同对象的行为。操作—对象。

    C语言
    1.源程序的扩展名为.c,目标程序的扩展名为.obj,可执行程序的扩展名为.exe(每个后缀为.c的C语言都可以单独进行编译)(C语言编译程序把.c编译成.obj的二进制文件)(链接形成.exe文件)
    2.循环结构、选择结构,顺序结构都是结构化程序的基本结构。
    3.N-S流程图是复杂算法的描述手段。
    4.长方形为处理框。椭圆形为连接点。
    5.一个c语言只能有一个主函数。
    6.函数的定义不可以嵌套,函数的调用可以嵌套。
    7.C语言总是以main函数开始执行。
    8.常量的类型:整型常量、实型常量、字符常量、字符串常量、符号常量。
    9.十进制整型常量:基本数字范围:0-9;(十进制小数两边必须有数字)
    八进制整型常量:以0开头,输出格式控制符为%o,基本数字范围0-7;
    十六进制整型常量:以0x开头,输出格式为%x,基本数字范围为0-15写为A-F或a-f;
    指数形式:e前必须有数字,e后必须为整数。
    10. 关键字属于标识符。(关键字不能做变量名也不能做函数名)
    11.数值型常量有整型常量、实型常量但均有正负值之分。
    12.语言的预编译处理可以可以用符号名代表一个常量定义是不必指定常量类型。
    13.实型常量又称实数或浮点数。在C语言中可以用单精度型和双精度型两种形式表示实型常量,分别用类型名float和double进行定义。实型常量在一般的微型集中占用4个字节,一般形式或者指数形式,数值范围都是-1038~1038,有效数字是7位。(不能是整形数据,如0)(常量的类型可以从字面上区分)(1为整型常量)(1.0为实型常量)(a为字符型常量)
    14.\0为八进制数,所以\09是错误的。
    15.字符常量在内存中占1个字节,字符常量可以进行关系运算。不能参与数值运算,可以参与任何整数运算。
    16.不能用字符串常量对字符数组名进行整体赋值操作。
    17.可以使用字符串常量来给一维数组进行复制。
    18.关于字节大小的问题

    16位编译器:char 1个字节  char* 2个字节 int 2个字节 float 4个字节 double 8个字节
    32位编译器:char 1个字节  char* 2个字节 int 4个字节 float 4个字节 double 8个字节
    64位编译器:char 1个字节  char* 2个字节 int 4个字节 float 4个字节 double 8个字节
    

    19.10进制转8进制,手算用 除8取余数法得
    20.十进制转十六进制为:除十六取余直到商为0,余数从后往前读。
    21.%f代表单精度浮点型数据(float),%lf代表双精度浮点型数(double)。
    单精度浮点数有效数字保证6位,部分7位,双精度浮点数有效数字保证15位,部分16位。
    22.sizeof可以看成是一个无符号整型表达式(sizeof为字节运算符)
    23.强制运算符:(类型名)(表达式) 逗号运算符:, 条件运算符::? :
    24. 赋值运算符左边必须是(一个)变量。
    25.a=bc,先运算bc,这个表达式的含义是,若b与c相等,那么得出的值为1,若不等则为0.
    26.“^” 按位异或 两数的二进制对应位相同,则为0,不同则为1.
    27.“|” 按位或 两个二进制中只要有一个为1,则结果为1。
    28.“~” 按位取反 二进制 0变1,1变0.
    29. “&”按位与 两个二进制都为1,则该位的结果为1,否则为零
    【 零的按位取反是 -1(0在数学界既不是正数也不是负数)
    所有正整数的按位取反是其本身+1的负数
    所有负整数的按位取反是其本身+1的绝对值 】
    30.位运算的对象只能是整形或字符型数据
    31.||逻辑或 前后条件只要有一个满足则为真。
    32.&&逻辑与 前后条件同时满足表达式为真。
    33.再用||的地方一般可以用|代替,但是用|的地方不能用||代替。
    34.“&”取地址运算
    35“”指针运算符
    36.p是指针变量,则&p是变量p的地址
    37.p是指针变量,则
    p是变量p所指向地址的值
    38.基类型不同的指针变量不可以相互混用
    39.函数的类型可以是指针类型
    40.函数的参数可以是整型、实型、字符型、指针类型。
    41.在这里插入图片描述

    42.C语言是一种计算机高级语言。
    43.C语言允许直接访问物理地址,能进行位操作。
    44.C语言是结构化程序设计语言
    45.c程序要通过编译,连接才能得到可执行的目标程序
    46.用c语言编写程序,可以编写出任何类型的程序
    47.C语言允许有空函数
    48.C程序书写格式,允许一行内可以写几个语句
    49.C程序的语句无行号(C语言中给源程序加行号;行号是用来定位代码的,指文件在几行)
    50.C语言的每个语句的最后必须有一个分号
    51.C语言本身没有输入输出语句(没有特定的输入输出语句)
    52.C语言可用来编写应用软件,也可用来编写系软件
    53.TurboC是在微机上广泛使用的编译程序
    54.C语言的数据结构是以数据类型形式出现的(不是常量和变量)
    55.空类型是C语言的一种数据类型
    56.C语言中数据有常量和变量之分
    57.利用指针和结构体类型可以构成表、树等复杂的数据结构
    58.在C程序中对所用到的所有数据都必须指定其数据类型
    59.c程序运行过程中,其值不能被改变的量称为常量
    60.在程序运行过程中,其值可以改变的量称为变量
    61.C语言可以用一个标识符代表一个常量,称为符号常量
    62.C语言规定标识符只能由字母、数字和下划线三种字符组成
    63.C语言整型常量可用十进制整数、八进整数和十六进制整数三种形式表示
    64.在现微机上使用的C编译系统,每一个整型变量在内存中占2个字节
    65.整型变量的基本类型符为int
    66.在微机上,一个长整型变量在内存中占4个字节(float型变量在内存中占4个字节)
    67.一个int型变量的最大允许值为32767
    68.在一个整常量后面加一个字母“L”或“1”.则认为该常量是longint 型常量
    69.C语言实型常量可用二进制小数和指数二种形式表示
    70.C语言实型变量分为:float型、double型、long double型三类
    71.C语言doule型一个变量的数值有效数字是16位
    72.C语言的字符常量是用单引号括起来的一个字符
    73.C语言的转义字符是以一个“\”开头的一种特殊形式的字符常量
    74.C语言中换行符使用’\n’,这是一个转义字符
    75.转文字符\r的含义是回车。
    76.C语言的字符型变量只能存放一个字符
    77.C语言允许字符数据与整数直接进行算术运算
    78.C语言允许在定义变量的同时使变量初始化
    79.C语言允许整型、实型、字符型数据间可以混合运算
    80.C语言规定两个整数相除的结果为整数
    81.用求余运算符“%”作运算,运算符两侧均应为整型数据
    82.用算术运算符和括号将运算对象按C语法规则组成的式子,称为C算术表达式
    83.算术运算符的结合方向为“自左至右”
    84.强制类型转换时,原来变量的类型未发生变化
    85.自增、自减运算符的结合方向为“自右至左”
    86.自增运算符只能用于变量,不能用于常量或表达式
    87指针.自增(减)运算符也可以用于指针变量,使指向下一个地址
    88.运算符“=”的作用是将一个数据赋给一个变量
    89.运算符“”的作用是将两侧数据是否相等
    90.赋运算符的结合方向是“自右向左”
    91.凡是二目运算符,都可以与赋值运算符一起组合成复合赋值运算符
    92.运算符“
    ”的作用是将一个数据赋给一个变量
    93.C语言不允许将实型数据赋给整型变量
    94.一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式
    95.一个C程序可以由若干个源程序文件组成
    96.一个源文件可以由若千个函数和预处理命令以及全局变量声明部分组成
    97.空语句是C语言的一种语句
    98.复合语句中最后一个语句中最后的分号不能省略不写
    99.putchar函数的作用是向终端输出一个字符
    100.getchar函数的作用是从终端输入一个字符
    101.格式输出函数(print)一次可以输出多个数据
    102.printf函数的%ld格式参数,用来输入出长整型数据
    103.printf函数的%o格式参数,用来以8进制数形式输出整数
    104.printf函数的%f格式参数,用来以小数形式输出实数
    105.printf函数的%x格式参数,可以输出指定参数的16进制形式
    106.printf函数的%s格式参数,用来输出一个字符串
    107.C语言不是面向对象的程序设计语言
    108.printf函数的%e格式参数,以指数形式输出实数
    109.C语言单精度数的有效数一般为7位
    110.printf函数的%g格式参数
    111.%g是C语言printf()函数的一个输出格式类型,它表示以%f%e中较短的输出宽度输出单、双精度实数,在指数小于-4或者大于等于精度时使用%e格式
    112.p++是指下一个地址。
    (p)++是指将p所指的数据的值加一。
    C编译器认为
    和++是同优先级操作符,且都是从右至左结合的,所以p++中的++只作用在p上,和(p++)意思一样;在(p)++中,由于()的优先级比和++都高,所以++作用在()内的表达式*p上。比如有:
    int x,y,a[]={1,2,3,4,5},*p=a,*q=a;
    x=*p++;//执行这一句后x=a[0]=1,p=a+1
    y=(*q)++;//执行这一句后,y=a[0]+1=2,q仍然=a
    113. printf函数的附加格式说明字符“m”的含义是指输出数据的最小宽度
    114.scanf函数中的“格式控制”后面应当是变量地址(不是变量符)
    115.逻辑运算符>算术运算符>关系运算符>条件运算符>赋值运算符(罗算管调幅)
    116.条件运算符的结合方向是“自右向左"
    117.if语中又包含文可以转在电百度网点电 平句的嵌套
    118.条件运算符要求有3个操作对象,称为三目运算符
    119.条件表达式中三个表达式的类型可以不同
    120.switch语句是多分支选择语句
    121.switch语句中每一个case的常量表达式的值必须互不相同
    122.switch语句执行完一个case后面的语句后,流程控制转移到下一个case继续执行
    123.switch语句中多个case可以共用组执行语句
    124.goto语句为无条件转向语句
    125.C语句的循环语句中循环体如果包含一个以上的语句,必须以复合语句形式出现bre
    126.for循环语句中的3个表达式都可以省略
    127.C语句的一个循环体内允许又包含另一个完整的循环结构
    128.break语句不能用于循环语句和switch语句之外的任何其它语句中
    129.continue语句的作用是结束本次循环(而不是终止整个循环)
    130.C数组中的每一个元素都必须属于同一个数据类型
    131.C数组必须先定义,然后使用
    132.C语言规定只能逐个引用数组元素而不能一次引用整个数组
    133.在定义一维数组时可以只给一部分元素赋初值
    134.对二维数组初始化,可以分行给数组赋初值
    135.可以对二维数组的部分元素赋初值
    136.字符数组中的一个元素只存放一个字符
    137.如果一个字符数组中包含一个以上结束符’\0”,则遇第一个’\0’时输出就结束
    138.puts函数的作用是将一个字符串输出终端
    139.gets丽数的作用是从终端输入一个字符串到字符数组
    140.strlen 函数是测试字符串长度的函数
    141
    strcat函数是“字符串复制函数”。X
    strcpy函数是“字符串连接函数”。X
    strcmp函数是“字符串复制函数”。X
    strlwr函数是测试字符串长度的函数。X
    strupr函数是测试字符串长度的函数。X
    142.C程序一个函数可以被一个或多个函数调用多次
    143.一个C程序可由一个主函数和若干个其它函数构成
    144.C程序以源程序为单位进行编译(而不是函数)
    145.C程序由一个或多个源程序文件组成
    146.C语言在定义函数时是互相独立的,不能嵌套定义
    147.在调用有参函数时,主调函数和被调用函数之间有数据传递关系
    148.在调用一个函数的过程中又出现直接或间接地调用该函数本身称为函数的递归调用
    149.在一个函数内部定义的变量是内部变量,称为局部变量
    150.在函数之外定义的变量称为外部变量,是全局变量
    151.从变量的作用域角度来分,可以分为全局变量和局部变量(而不是静态和动态变量)
    152.静态存储方式是指在程序运行期间分配固定的存储空间的方式
    153.存储方法分为两大类:静态存储类和动态存储类
    154.C语言允许将局部变量的值放在CPU中的寄存器中,这种变量称为“寄存器变量”
    155.局部静态变量不能定义为寄存器变量
    156.如果一个函数只能被本文件中其它函数所调用,称为内部函数
    157.C源程序中的预处理命令,它不是C语言本身的组成部分
    158.宏定义不是C语句,在行末不加分号
    159.宏定又是用宏名代替一个字符串,只作简单的置换,不作正确性检查
    160.在进行宏定义时,可以引用已定义的宏名
    161.宏替换不占程序运行时间,只占编译时间
    162.文件包含处理是指个源文件可以将另一个的全部内容含进来源文件包
    163.一个include命令只能指定一个被包含文件
    164.存放变量地址的变量是指针变量
    165.C语言中变量的指针就是变量的地址
    166.函数的参数也可以是指针变量
    167.指针变量可以指向变量,也可以指向数组和数组元素
    168.引用数组元素可以用下标法,也可以用指针法
    169.用指针变量可以指向一维数组,也可以指向多维数组,用指针变量也可以指向一个函数
    170.一个函数可以带回一个整型值、字符值或实型值,也可以带回指针型的数据
    171.指针数组中的每一个元素都相当于一个指针变量
    172.指针数组中的每一个元素都相当于一个整型变量
    173.指针变量可以有空值,即该指针变量不指向任何变量
    174.若两个指针指向同一个数组的元素。则两指针变量可以进行比较
    175.用户自己定义一个结构教型后们其中并无具体数据
    176.在程序中使用的可和百网时 定义结构体类型的变量
    177.结构体类型的成员也可以是一个结构体变量
    178.结构体成员名可以与程序中的变量名相同
    179.不能将一个结构体变量作为一个整体进行输入和输出
    180.对结构体变量的成员可以像普通变量一样进行各种运算
    181.可以引用结构体变量的地址
    182.可以引用结构体变量成员的地址
    183.结构体数组的每个元素都是一个个结构体类型的数据
    184.对结构体数组可以初始化,即赋初值
    185.可以定义一个指针变量,用来指向一个结构体变量
    186.指针可以用结构体变量作链表中的结点
    187.malloc函数的返回值是一个指向分配域起始地址的指针
    188.建立动态链表是指在程序执行过程中从无到有地建立起一个链表
    189.使几个不同的变量共占同一段内存的结构,称为共用体类型的结构
    190.共用体变量所占的内存长度等于最长的成员长度
    191.定义了共用体变量,只能引用共用体变量中的成员(不能引用公用体变量)
    192.共用体变量的地址和它的各成员的地址都是同一地址
    193.共用体类型可以出现在结构体类型定义中
    194.结构体类型可以出在共用体类型定义中
    195.在C编译中,对枚举元素按常量处理
    196.一个整数不能直接赋给一个枚举变量
    枚举类型在C#或C++,java,VB等一些计算机编程语言中是一种基本数据类型而不是构造数据类型,而在C语言等计算机编程语言中是一种构造数据类型 。它用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。
    枚举可以根据Integer、Long、Short或Byte中的任意一种数据类型来创建一种新型变量。这种变量能设置为已经定义的一组之中的一个,有效地防止用户提供无效值。该变量可使代码更加清晰,因为它可以描述特定的值。
    197.可以用typedef声明新的类型名来代替已有的类型名
    198.位运算的运算量只能是整型或字符型的数据
    200.位运算符与赋值运算符可以组成复合赋值运算符
    在 C 语言中, 一种方法是用叫做位段的构造类型来定义一个压缩信息的结构。
    201.已有定义int (*p)( );指针p可以指向函数的入口地址
    202.C语言中运算对象必须是整型的是%=
    203.int *p 表达的是p是指向int型数据的指针。
    204函数rewind的功能是将文件指针重新指向一个流的开头(即使文件指针重新返回文件的开始位置),int rewind(FILE *stream);并且无返值。
    205.如果函数值的类型与返回值类型不一致,以函数值类型为准
    206.c语言中形参和实参类型不一致时以形参的类型为准
    207.形参应该是函数声明的时候就已经定义好
    208.若有定义int t[3][2],能正确表达t数组元素地址的是–t[2]+1
    209.int[]={1,2};
    210.C语言中的循环语句有for,while,do-while和goto,,***不是if、switch、break
    211.不正确的赋值语句是—ch‘a+b’,正确的是ch=‘\0’ ch=‘7’+‘9’ ch=7+9
    212.正确的赋值语句x3=12;
    213.C语言逻辑运算时,0为假,非0为真
    214.字符串常量是以双引号扩起来的字符序列“a”(其他C语言常量‘\n’ 012)(e-2不是C语言常量----实数的指数形式中,e后面必须有一个整数)

    301.一个位段必须存储在同一存储单元中
    302.位段的长度不能大于存储单元的长度
    303.一个c程序由若干个函数构成,其中有且仅有一个主函数
    304.指针变量中存放的是它所指对象的地址
    305.在C语言中,分号是语句的必然组成部分
    306.结构体变量所占空间是各成员所占空间之和
    307.数据文件可顺序读取,也可借助文件的定位操作实现随机读取
    308.从用户的角度上讲,类型的含义是规定了该类型变量的取值范围和运算范围
    309.c语言中,变量和函数均具有类型和存贮类别两个属性
    340.顺序结构>选择结构>循环结构
    341.函数返回值的类型是由函数定义时指定的类型
    342.*与s[]相等
    343.当从键盘输入数据时,对于整型变量可以输入整型数值和字符,对于实型变量可以输入实型数和整型数值等。
    344. getchar函数没有参数
    345.静态储存方式是在程序运行期间分配固定的储存方式的方式
    356.局部静态变量不能定义为寄存器变量
    357.不能把共用体变量作为函数的参数
    358.一个整数不能直接赋给一个枚举变量
    359.int *p=a 是对指针变量p的正确定义和初始化。
    360.Char s[]=”china”;
    Char p;
    P=s;
    p与s[]相等
    有int [],*p=a
    则p+5表示元素a[]的地址
    361.C语言中,退格符是\b
    362.C语言中,变量的隐含储存类别是auto
    363.实际参数和形式参数可以同名
    364.函数调用可以作为一个函数的形参
    365.结构化程序设计的3中结构是-顺序结构、选择结构、循环结构
    366.当从键盘输入数据时整型变量可以输出整型值和字符,对于实型变量可以输入实型数和整型数值
    367.C语言中逗号运算符的优先级最低,指针最优,单目运算优于双目运算。如正负号。
    先算术运算,后移位运算,最后位运算。请特别注意:1 << 3 + 2 & 7等价于 (1 << (3 + 2))&7.
    逻辑运算最后结合。
    368.C语言区分定义变量名的大小写
    369.设有如下定义:
    struck sk
    { int a;
    float b;
    } data;
    int *p;
    若要使P指向data中的a域,正确的赋值语句是(C)A、 p=&a; B、 p=data.a; C、 p=&data.a; D、 *p=data.a;
    370.double)a是将a转换成double类型;(int)(x+y)是将x+y的值转换成整型。
    371.设有以下说明语句:
    struct stu
    {
    int a;
    float b;
    }
    stutype;
    则下面叙述不正确的是( )。
    A) struct是结构体类型的关键字
    B) structstu是用户定义的结构体类型
    C) stutype是用户定义的结构体类型名
    D) a和b都是结构体成员名
    答案解析
    定义一个结构的一般形式为:
    struct结构体名
    {
    成员列表
    }变量名列表;
    本题中的stutype是在声明结构体类型structstu的同时定义的该结构体变量,而不是用户定义的结构体类型名。类型与变量是不同的概念; 2)对结构体中的成员,可以单独使用,它的作用与地位相当于普通变量;3)成员也可以是一个结构体变量; 4)成员名可以与程序中的变量名相同,二者不代表同一对象。
    372.C语言中的数据类型是指-函数返回值的数据类型
    373.C程序设计语言的基本成分是数据成分、运算成分、控制成分、传输成分。
    374.while(t=1)循环控制表达式的值为1。
    375.printf(++x);表示地址所连接的数值加1.
    376.int[3][4]; 表示a为3行
    4列的数组,它可用的最大行下标为2,列下标最大为3;
    若是引用a[0][4],则超过了数组的范围
    377.若有如下说明和定义
    struct test
    {
    int ml; char m2; float m3;
    union uu
    {
    char ul[5]; int u2[2];
    }
    ua;
    } myaa;
    则sizeof(struct test)
    的值是A.12 B.16 C.14 D.9
    正确答案:A
    在本题中,首先定义了一个结构体。在该结构体中,定义了一个整型变量成员、一个字符型变量成员和一个浮点型变量成员,并在结构体中定义了一个联合体变量成员,联合体变量成员中又包含两个联合体成员数组。题目最后要求计算该结构体变量所占的存储空间。
    在C语言中,联合体变量中的所有成员共享存储空间,联合变量的长度等于各成员中最长的长度,因此,本题的联合体部分所占的长度为5,但是结构体与联合体不一样的是,结构体不能共享空间,一个结构体变量的总长度是各成员长度之和,因此,该结构体所需的存储空间为5+1+2+4=12。本题的正确答案选A。
    378.静态储存类别的关键词是static
    379.C语言中提供了存储说明符auto,register,extern,static说明的四种存储类别。四种存储类别说明符有两种存储期:自动存储期和静态存储期。其中auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块是被建立,它在该程序块活动时存在,退出该程序块时撤销。
    380.fseek(文件指针,位移量,起始点)
    “起始点”用0,1或2代替,0代表“文件开始”,1为“当前位置”,2为“文件末尾”。“位移量”指以“起始点”为基点,向前移动的字节数。ANSIC和大多数C版本要求位移量是long型数据。这样当文件的长度大于 64k时不致出现问题。ANSI C标准规定在数字的末尾加一个字母L,就表示long型。
    381.若有定义:int (*p)[4];则标识符p ,是一个指针指向一个含有四个整形元素的一维数组。
    382.基本数据类型:整型、实型、字符型
    383.EOF是指向文本文件的结束标志,NULL是打开文件错误时的返回值。feof(fp)用来判断文件是否在文件末尾,文本文件和二进制文件均可以使用此函数,如果遇到文件结束就返回1,否则返回0。
    384.C语言的函数可以嵌套调用
    385.标准库函数fgets(s,n,f)的功能是什么–从文件f中读取长度不超过n-1的字符串存入指针s所指的内存。
    从流中读一行或指定个字符,
    原型是char *fgets(char *s, int n, FILE *stream);
    从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。
    形参注释:*string结果数据的首地址;n-1:一次读入数据块的长度,其默认值为1k,即1024;stream文件指针
    说得简单一点就是从f这个文件输入流中读取n-1个字符,存到s中。
    如果一行的字符数小于n-1,那么就是一行的字符数,所以应该理解为不超过n-1,如果一行的长度大于n-1,就是n-1个字符
    386.
    1、数据计算类型不同。基本数据类型分为三类:整数型(定点型)、实数型(浮点型)和字符型。除了基本数据类型,还有构造类型(数组、结构体、共用体、枚举类型)、指针类型、空类型void。
    2、各种数据类型的关键词不同。short、long、int、float、double、char六个关键词表示C语言里六种基本数据类型。
    3、不同数据类型占用内存的大小不同。short占2byte,int占4byte,long占4byte,float占2byte,double占8byte,char占1byte(不同的平台可能占用内存大小不一样,具体的可以用sizeof 测试下)。
    387.一个可以没有变量定义和执行部分,例如空函数

    展开全文
  • px4官网调指南 多旋翼无人机PID调指南

    万次阅读 多人点赞 2017-02-13 21:31:39
    译文部分:多旋翼无人机PID调指南不用碳化纤维或增强碳化纤维桨调整多轴,不使用损坏的桨片。 出于安全考虑,系统默认增益都设置的比较小。请增加增益以便获取更好的控制响应。 本指导方案适用于所有的多轴飞行...

    译文部分:

    多旋翼无人机PID调参指南

    不用碳化纤维或增强碳化纤维桨调整多轴,不使用损坏的桨片。
    出于安全考虑,系统默认增益都设置的比较小。请增加增益以便获取更好的控制响应。
    本指导方案适用于所有的多轴飞行器。比例,积分,微分控制(PID)是最广泛的控制技术。对于典型的预估性控制而言,PID控制实质上优于执行性控制技术,比如,线性二次型调节器(Linear Quadratic Regulator) 与线性二次高斯(linear quadratic gaussian),因为这些技术都或多或少的需要系统的精确模型,所以得不到广泛的使用。PX4的目的是在个人电脑上实现设备的尽可能快速的控制,因为不是所有的被控对象的系统模型都是可获得的,因此PID调参是非常有意义的,并且PID控制适用于所有情况。
    介绍
    PX4采用双闭环PID控制,其外环为角度(angle)控制,角度值是由滤波与姿态解算后得到的欧拉角,有延迟且存在误差,所以单纯的单闭环无法实现姿态控制过程。所以需要引入内环,内环选择角速度(rate)控制,角速度由陀螺仪直接测量得到,误差小,响应快,延迟短。所以,综上,整个控制系统外环选择纯比例控制,没有I,D,所以参数只有三个方向的P;内环选择PID控制器,参数有P,I,D三个量;同时方向控制上还引入了前馈控制,所以还有一个参数为MC_YAW_FF
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps4638.tmp.jpg
    PX4地面站外环执行的飞行器角度控制 ,依靠的参数有:
    Roll control (MC_ROLL_P)
    Pitch control (MC_PITCH_P)
    Yaw control (MC_YAW_P)
    内环使用三个独立的PID控制器实现飞行器姿态控制:
    Roll rate control (MC_ROLLRATE_P, MC_ROLLRATE_I, MC_ROLLRATE_D)
    Pitch rate control (MC_PITCHRATE_P, MC_PITCHRATE_I, MC_PITCHRATE_D)
    Yaw rate control (MC_YAWRATE_P, MC_YAWRATE_I, MC_YAWRATE_D)
    外环输出以机身期望姿态比例为准(如果机身期望姿态为水平状态但是当前横滚方向有三十度的倾角,那么此时控制器将以每次60度输出)。内环速率控制改变电机转速以便飞行器以期望角速率旋转。
    实质上增益具有直观的物理意义,比如,如果参数MC_ROLL_P增益为6,那么飞行器将以3弧度(170度)补偿0.5弧度(30度)的偏差。如果内环MC_ROLLRATE_P增益为0.1,那么内环输出为3乘0.1=0.3(外环输出输入给内环,进过PID控制后输出,若只有P=0.1,输入3,那么输出0.3)这意味着飞行器将降低一侧电机的转速,增加另一侧电机的转速使其恢复水平状态。
    同样的,对于MC_YAW_FF参数,用于控制多大的用户输入用于前馈补偿给偏航速率控制器。0意味着非常慢的控制。控制器只能在检测到偏航位置误差时才开始修正。1意味着快速的响应,但是有超调,控制将执行的非常快速,误差总是保持在0附近。
    电机幅值限制
    正如上面的例子所展示的,在某些情况下会出现某种可能使得电机得到一个比其上限还要大的输入或者一个比0还要小的输入。如果这种情况发生,电机违背控制模型产生的升力可能会使飞行器翻筋斗。为了防止这种情况发生,PX4中加入了油门限幅。如果其中一个电机的转速偏离安全范围,系统总体推力将被变低以便控制器输出的相关比率达到一个期望值。其结果会是电机转速不会增加甚至降低,但是永远不会翻。

    第一步 准备

    首先设置所有参数到初始值。
    1 设置所有的MC_XXX_P到0(roll,pitch,yaw)
    2 除了MC_ROLLRATE_P与MC_PITCHRATE_P之外的所有MC_XXXRATE_P,I,D归零。
    3 设置MC_ROLLRATE_P与MC_PITCHRATE_P到一个很小的值,比如0.02
    4 设置MC_YAW_FF到0.5
    所有参数缓慢增加,每次增加约百分之20到30,在最后调试时甚至可以降低到百分之10,。
    注意:过大的增益(甚至仅仅比理想值多1.5到2倍)都可能导致大的抖动。

    第二步 稳定俯仰和翻滚速率

    P增益调节
    参数:MC_ROLLRATE_P, MC_PITCHRATE_P
    如果飞行器结构对称,那么ROLL与PITCH的概念应该等价,如果不对称,则应该分开讨论。
    把飞行器拿在手中,中油门上下,到刚好平衡重力。向俯仰或翻滚方向上稍做倾斜,观察反应。(我不明白这个是怎么实现的,用手托着吧,飞行器平稳时升力最大,不会飞起来,那么有偏角了升力减小,更不会飞起来。但是这也太危险了吧,建议用细绳拉住两颗电机,不要用手)飞行器应该温和的抵抗倾斜过程,但保持倾斜角之后不会尝试恢复水平姿态。如果出现震荡,降低P。如果反应正确但非常慢,调大P直到开始出现抖动。重新调回P到稍稍有一点抖动甚至不再抖动(大概回调百分之十),到稍稍超调,典型值一般为0.1。
    D增益调节
    参数:MC_ROLLRATE_D, MC_PITCHRATE_D
    如果参数处于某一值时,飞行器稍微抖动并且P值已经适量的减少。从0.01开始缓慢增加RATE_D直到消除最后一点震荡。如果此时飞行器又一次出现抖动,那就是D值过大。(一定会出现由抖动到平稳的过程,D值再大才会再次抖动,所以调参是不能着急,一点点增加,不然可能错过理想值)一般通过调节P与D就可以得到比较良好的电机响应。RATE_D的典型值一般在0.01–0.02
    在QGoundControl可以锁定pitch与roll的速率。一定不能出现震荡,但是百分之十到二十的超调是允许的。
    I增益调节
    如果飞行器可以实现定点但是定点的位置与期望存在误差,那么增加MC_ROLLRATE_I 和MC_PITCHRATE_I(上面一句的翻译是个人想法,原句是never reach the setpoint but have an offset。我觉得它的意思是实现了悬停,但是此时的点不是想要的点,所以说,按照个人想法,I值并没有什么用处,我不会在乎悬停之后的误差)以增益MC_ROLLRATE_P的值得百分之五到百分之十开始向上增加。

    第三步 稳定翻滚与俯仰角度

    参数 MC_RATE_P, MC_RATE_P
    把飞行器拿在手中,中油门上下,到刚好平衡重力。向俯仰或翻滚方向上稍做倾斜,观察反应。飞行器应该缓慢回到水平。如果出现抖动,减小P。如果反应正确但非常慢,调大P直到开始出现抖动。最佳的反应应该是超调10%–20%后得到良好的响应。
    在QGoundControl可以锁定pitch与roll。姿态角度超调不要超过10%–20%.

    第四步 稳定航向速率

    P增益调节
    参数:MC_YAWRATE_P
    设置很小的MC_YAWRATE_P,比如0.1。
    把飞行器拿在手中,中油门上下,到刚好平衡重力。转动飞行器方向轴,观察反应。电机声音应该发生改变,飞行器应该阻碍方向变化。但是这个响应应该弱于俯仰与横滚方向,这是正常现象。如果飞行器出现抖动,减小MC_YAWRATE_P。如果响应非常剧烈甚至在小幅转动(full throttle spinning vs idle spinning propellers不懂这句什么意思),减小P。典型值大概为0.2–0.3。(四轴因为其结构,导致航向上的不灵敏,yaw-p要小于pitch与roll)
    在航向的速率控制中,如果响应非常强烈或出现震荡,会影响俯仰和横滚方向的响应。统筹调节pitch,roll,yaw达到平衡。

    第五步 稳定航向角

    把飞行器拿在手中,中油门上下,到刚好平衡重力。转动飞行器方向轴,观察反应。飞行器应该缓慢的回到初始方向。如果飞行器出现抖动,减小P。当响应正确但速度慢,增加P直到反应达到稳定,但不要出现震荡。典型值大概为2–3。
    在QGoundControl观察ATTITUDE.yaw。超调不应该超过2%–5%.小于pitch与
    Roll。(个人认为,航向上不用太较真啦,不影响另外两个就好)
    前馈补偿调节
    参数 MC_YAW_FF
    这个参数不太重要,并且可以在飞行过程中调节。但是不理想的参数会使响应变慢或过快。应该调节MC_YAW_FF使飞行器得到良好的响应过程。其有效范围0–1,典型值大概为0.8–0.9。(有时为了航拍效果考虑,可以再改小MC_YAW_FF,以便得到平滑的响应过程)
    在QGoundControl观察ATTITUDE.yaw。超调不应该超过2%–5%.小于pitch与
    Roll。

    外文部分:

    Multirotor PID Tuning Guide
    NEVER do multirotor tuning with carbon fiber or carbon fiber reinforced blades. NEVER use damaged blades.
    For SAFETY reason, the default gains are set to small value. You HAVE TO increase the gains before you can expect any control responses.
    This tutorial is valid for all multi rotor setups (AR.Drone, PWM Quads / Hexa / Octo setups). Proportional, Integral, Derivative controllers are the most widespread control technique. There are substantially better performing control techniques (LQR/LQG) from the model predictive control, since these techniques require a more or less accurate model of the system, they not as widely used. The goal of all PX4 control infrastructure is move as soon as possible on MPC, since not for all supported systems models are available, PID tuning is very relevant (and PID control sufficient for many cases).
    Introduction
    The PX4 multirotor_att_control app executes an outer loop of orientation controller, controlled by parameters:
    Roll control (MC_ROLL_P)
    Pitch control (MC_PITCH_P)
    Yaw control (MC_YAW_P)
    And an inner loop with three independent PID controllers to control the attitude rates:
    Roll rate control (MC_ROLLRATE_P, MC_ROLLRATE_I, MC_ROLLRATE_D)
    Pitch rate control (MC_PITCHRATE_P, MC_PITCHRATE_I, MC_PITCHRATE_D)
    Yaw rate control (MC_YAWRATE_P, MC_YAWRATE_I, MC_YAWRATE_D)
    The outer loop’s output are desired body rates (e.g. if the multirotor should be level but currently has 30 degrees roll, the control output will be e.g. a rotation speed of 60 degrees per second). The inner rate control loop changes the rotor motor outputs so that the copter rotates with the desired angular speed.
    The gains actually have an intuitive meaning, e.g.: if the MC_ROLL_P gain is 6.0, the copter will try to compensate 0.5 radian offset in attitude (~30 degrees) with 6 times the angular speed, i.e. 3 radians/s or ~170 degrees/s. Then if gain for the inner loop MC_ROLLRATE_P is 0.1 then thrust control output for roll will be 3 * 0.1 = 0.3. This means that it will lower the speed of rotors on one side by 30% and increase the speed on the other one to induce angular momentum in order to go back to level.
    There is also MC_YAW_FF parameter that controls how much of user input need to feed forward to yaw rate controller. 0 means very slow control, controller will start to move yaw only when sees yaw position error, 1 means very responsive control, but with some overshot, controller will move yaw immediately, always keeping yaw error near zero.
    Motor Band / Limiting
    As the above example illustrates, under certain conditions it would be possible that one motor gets an input higher than its maximum speed and another gets an input lower than zero. If this happens, the forces created by the motors violate the control model and the multi rotor will likely flip. To prevent this, the multi rotor mixers on PX4 include a band-limit. If one of the rotors leaves this safety band, the total thrust of the system is lowered so that the relative percentage that the controller did output can be satisfied. As a result the multi rotor might not climb or loose altitude a bit, but it will never flip over. The same for lower side, even if commanded roll is large, it will be scaled to not exceed commanded summary thrust and copter will not flip on takeoff at near-zero thrust.
    Step 1: Preparation
    First of all set all parameters to initial values:
    Set all MC_XXX_P to zero (ROLL, PITCH, YAW)
    Set all MC_XXXRATE_P, MC_XXXRATE_I, MC_XXXRATE_D to zero, except MC_ROLLRATE_P and MC_PITCHRATE_P
    Set MC_ROLLRATE_P and MC_PITCHRATE_P to a small value, e.g. 0.02
    Set MC_YAW_FF to 0.5
    All gains should be increased very slowly, by 20%-30% per iteration, and even 10% for final fine tuning. Note, that too large gain (even only 1.5-2 times more than optimal!) may cause very dangerous oscillations!
    Step 2: Stabilize Roll and Pitch Rates
    P Gain Tuning
    Parameters: MC_ROLLRATE_P, MC_PITCHRATE_P.
    If copter is symmetrical, then values for ROLL and PITCH should be equal, if not - then tune it separately.
    Keep the multi rotor in your hand and increase the thrust to about 50%, so that the weight is virtually zero. Tilt it in roll or pitch direction, and observe the response. It should mildly fight the motion, but it will NOT try to go back to level. If it oscillates, tune down RATE_P. Once the control response is slow but correct, increase RATE_P until it starts to oscillate. Cut back RATE_P until it does only mildly oscillate or not oscillate any more (about 10% cutback), just over-shoots. Typical value is around 0.1.
    D Gain Tuning
    Parameters: MC_ROLLRATE_D, MC_PITCHRATE_D.
    Assuming the gains are in a state where the multi rotor oscillated and RATE_P was slightly reduced. Slowly increase RATE_D, starting from 0.01. Increase RATE_D to stop the last bit of oscillation. If the motors become twitchy, the RATE_D is too large, cut it back. By playing with the magnitudes of RATE_P and RATE_D the response can be fine-tuned. Typical value is around 0.01…0.02.
    In QGroundControl you can plot roll and pitch rates (ATTITUDE.rollspeed/pitchspeed). It must not oscillate, but some overshot (10-20%) is ok.
    I Gain Tuning
    If the roll and pitch rates never reach the setpoint but have an offset, add MC_ROLLRATE_I and MC_PITCHRATE_I gains, starting at 5-10% of the MC_ROLLRATE_P gain value.
    Step 3: Stabilize Roll and Pitch Angles
    P Gain Tuning
    Parameters: MC_RATE_P, MC_RATE_P.
    Set MC_ROLL_P and MC_PITCH_P to a small value, e.g. 3
    Keep the multi rotor in your hand and increase the thrust to about 50%, so that the weight is virtually zero. Tilt it in roll or pitch direction, and observe the response. It should go slowly back to level. If it oscillates, tune down P. Once the control response is slow but correct, increase P until it starts to oscillate. Optimal responce is some overshot (~10-20%). After getting stable respone fine tune RATE_P, RATE_D again.
    In QGroundControl you can plot roll and pitch (ATTITUDE.roll/pitch) and control (ctrl0, ctrl1). Attitude angles overshot should be not more than 10-20%.
    Step 4: Stabilize Yaw Rate
    P Gain Tuning
    Parameters: MC_YAWRATE_P.
    Set MC_YAWRATE_P to small value, e.g. 0.1
    Keep the multi rotor in your hand and increase the thrust to about 50%, so that the weight is virtually zero. Turn it around its yaw axis, observe the response. The motor sound should change and the system should fight the yaw rotation. The response will be substantially weaker than roll and pitch, which is fine. If it oscillates or becomes twitchy, tune down RATE_P. If responce is very large even on small movements (full throttle spinning vs idle spinning propellers) reduce RATE_P. Typical value is around 0.2…0.3.
    The yaw rate control, if very strong or oscillating, can deteriorate the roll and pitch response. Check the total response by turning around, roll, pitch and yaw.
    Step 5: Stabilize Yaw Angle
    P Gain Tuning
    Parameters: MC_YAW_P.
    Set MC_YAW_P to a low value, e.g. 1
    Keep the multi rotor in your hand and increase the thrust to about 50%, so that the weight is virtually zero. Rotate it around yaw, and observe the response. It should go slowly back to the initial heading. If it oscillates, tune down P. Once the control response is slow but correct, increase P until the response is firm, but it does not oscillate. Typical value is around 2…3.
    Look at ATTITUDE.yaw in QGroundControl. Yaw overshot should be not more than 2-5% (less than for attitude).
    Feed Forward Tuning
    Parameters: MC_YAW_FF.
    This parameter is not critical and can be tuned in flight, in worst case yaw responce will be sluggish or too fast. Play with FF parameter to get comfortable responce. Valid range is 0…1. Typical value is 0.8…0.9. (For aerial video optimal value may be much smaller to get smooth responce.)
    Look at ATTITUDE.yaw in QGroundControl. Yaw overshot should be not more than 2-5% (less than for attitude).

    展开全文
  • 反射

    千次阅读 多人点赞 2019-07-14 20:30:55
    static{ System.out.println("加载jvm中!"); } public Student() { super(); System.out.println("调用无构造方法创建了一个学生对象"); } public Student(String sid) { super(); this.sid ...

    1.什么是反射

    反射是java语言中的一种机制,通过机制可以动态的实例化对象,读写属性、调用方法

    反射的优点

    反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创和控制任何类的对象,无需提前硬编码目标类

    反射的缺点

    性能问题,使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用

    2. 类类

    所有狗 狗类 Dog 狗对象 旺财
    所有猫 猫类 Cat 猫对象 肥波
    所有类 类类 java.lang.Class 类对象 特定类

    java.lang.Class
    java.lang.reflect.Method
    java.lang.reflect.Field
    java.lang.reflect.construct
    

    (Dog.java , Cat.java…).java文件我们能不能描述成一种事物呢?
    java.lang.Class这个类就是描述Dog.java,Cat,java这些东西的
    具体的.java文件就是描述java.lang.Class这个类的一个具体的实例

    类组成部分:
    类属性 java.lang.reflect.Field (都是以java面向对象的思想对它进行封装了)
    类方法 java.lang.reflect.Method

    3.一切反射相关的代码都从获得java.lang.Class类对象开始

    3.1 Class.forName(完整类名)
    3.2 类名.class
    3.3 对象.getClass()

    4. 反射三大作用(java.lang.reflect.*)

    4.1获取类对象的三种方式

    代码演示:
    创建一个Student

    package com.myy.reflect;
    
    public class Student {
    	private String sid;
    
    	private String sname;
    
    	public Integer age;
    	
    	static{
    		System.out.println("加载进jvm中!");
    	}
    
    	public Student() {
    		super();
    		System.out.println("调用无参构造方法创建了一个学生对象");
    	}
    
    	public Student(String sid) {
    		super();
    		this.sid = sid;
    		System.out.println("调用带一个参数的构造方法创建了一个学生对象");
    	}
    
    	public Student(String sid, String sname) {
    		super();
    		this.sid = sid;
    		this.sname = sname;
    		System.out.println("调用带二个参数的构造方法创建了一个学生对象");
    	}
    
    	@SuppressWarnings("unused")
    	private Student(Integer age) {
    		System.out.println("调用Student类私有的构造方法创建一个学生对象");
    		this.age = age;
    	}
    
    	public String getSid() {
    		return sid;
    	}
    
    	public void setSid(String sid) {
    		this.sid = sid;
    	}
    
    	public String getSname() {
    		return sname;
    	}
    
    	public void setSname(String sname) {
    		this.sname = sname;
    	}
    
    	public void hello() {
    		System.out.println("你好!我是" + this.sname);
    	}
    
    	public void hello(String name) {
    		System.out.println(name + "你好!我是" + this.sname);
    	}
    
    	@SuppressWarnings("unused")
    	private Integer add(Integer a, Integer b) {
    		return new Integer(a.intValue() + b.intValue());
    	}
    }
    
    

    Demo1:

    package com.myy.reflect;
    
    /**
     * 获取类对象的方式
     *  通过java提供的反射机制获取到com.myy.reflect.Student.class
     *  1.Class.forName("全路径名");   jdbc/自定义mvc框架调用
     *  2.类名.class 结合泛型做通用分页查询方法会用
     *  3.类java.lang.Class(实例的类)实例(Student.class)的类实例getClass()获取  通用的增删改结合泛型使用
     *  
     * @author myy
     *
     */
    public class Demo1 {
      public static void main(String[] args) throws Exception {
    //	 1.Class.forName("全路径名");   jdbc/自定义mvc框架调用
    	Class stuClz = Class.forName("com.myy.reflect.Student");
    	System.out.println("------------");
    	
    //	 2.类名.class 结合泛型做通用分页查询方法会用
    	Class stuClz1 = Student.class;
    	System.out.println(stuClz1);
    	System.out.println("-------------");
    	
    	Student stu = new Student();
    //	3.类java.lang.Class(实例的类)实例(Student.class)的类实例getClass()获取  通用的增删改结合泛型使用
    	Class stuClz2 =  stu.getClass();
    	System.out.println(stuClz2);//并且还调用了无参构造器
    	
    	
    }
    	
    }
    

    运行结果:
    在这里插入图片描述

    4.2反射实例化对象

    代码演示:
    Demo2:

    package com.myy.reflect;
    
    /**
     * 利用反射进行对象的实例化
     *    之前:通过new关键字进行实例化
     *    现在:通过java.lang.reflect.construct来实例化对象
     *    
     * @author myy
     *
     */
    public class Demo2 {
        public static void main(String[] args) throws Exception, Exception {
    		Student stu = new Student();
    		Class stuClz = stu.getClass();
    //		newInstance这个方法默认是使用无参构造器去实例化对象
    		Student stu2 = (Student) stuClz.newInstance();
    		System.out.println(stu2);//如果不是空就意味着创建出来
    	}
    }
    

    运行结果:
    在这里插入图片描述
    提问:假设没有无参构造器运行会不会报错
    代码演示:
    首先,先把Student类的无参构造器注释掉
    在这里插入图片描述
    然后,修改一下Demo2的代码

     public static void main(String[] args) throws Exception, Exception {
    //		Student stu = new Student();
    //		Class stuClz = stu.getClass();
        	Class stuClz = Student.class;
    //		newInstance这个方法默认是使用无参构造器去实例化对象
    		Student stu2 = (Student) stuClz.newInstance();
    		System.out.println(stu2);//如果不是空就意味着创建出来
    	}
    

    如图所示运行会报错:
    在这里插入图片描述

    答:由上面代码演示我们得知当没有无参构造器的时候运行会报错。
    运行报错的原因是:没有找到匹配方法,因为它默认找的是默认无参构造器。
    注意:一定要提供无参构造器

    优势:

    1. 能够对未知的对象进行实例化
    2. 能够对私有的构造器实例化对象

    1.1代码演示:

     public static void main(String[] args) throws Exception, Exception {
        	Class stuClz = Student.class;
    //		调用有参构造器去实例化对象
        	Constructor<Student> constructor = stuClz.getConstructor(String.class);
        	Student stu2 = (Student)constructor.newInstance("张三");
        	
    	}
    

    运行结果:
    在这里插入图片描述
    1.2代码演示

    public static void main(String[] args) throws Exception, Exception {
        	Class stuClz = Student.class;
    //		调用有参构造器去实例化对象(两个参数的)
        	Constructor<Student> constructor = stuClz.getConstructor(String.class,String.class);
        	Student stu2 = (Student)constructor.newInstance("t003","张三");
        	
    	}
    

    运行结果:
    在这里插入图片描述
    2.1如果按照以上的操作进行代码演示

     public static void main(String[] args) throws Exception, Exception {
        	Class stuClz = Student.class;
    //    	调用私有构造器去实例化对象
        	Constructor<Student> constructor = stuClz.getConstructor(Integer.class);
        	Student stu2 = (Student)constructor.newInstance(18);
        	
    	}
    
    

    运行结果:
    在这里插入图片描述
    getConstructor与getDeclaredConstructoe的区别
    getConstructor只能获取被public修饰的构造器
    getDeclaredConstructoe被所有关键字修饰的构造器

    所以私有的要用getDeclaredConstructoe

    如代码演示:

     public static void main(String[] args) throws Exception, Exception {
        	Class stuClz = Student.class;
    //    	调用私有构造器去实例化对象
        	Constructor<Student> constructor = stuClz. stuClz.getDeclaredConstructor(Integer.class);
        	Student stu2 = (Student)constructor.newInstance(18);
        	
    	}
    

    运行结果:
    在这里插入图片描述

    Class com.myy.reflect.Demo2 can not access a member of class com.myy.reflect.Student with modifiers "private"
    

    该错误原因是:找到了私有的构造器,但不能调用因为没有权限

    则要对代码进行给予权限如代码演示:

     public static void main(String[] args) throws Exception, Exception {
        	Class stuClz = Student.class;
    //    	调用私有构造器去实例化对象
        	Constructor<Student> constructor = stuClz. stuClz.getDeclaredConstructor(Integer.class);
    constructor.setAccessible(true);//默认为false    
    	Student stu2 = (Student)constructor.newInstance(18);
        	
    	}
    

    运行结果:
    在这里插入图片描述

    4.3 反射动态调用方法

    Demo3:
    无参的代码演示:

    package com.myy.reflect;
    
    import java.lang.reflect.Method;
    
    /**
     * 动态方法调用
     *  构造方法是不是方法
     * 
     * @author myy
     *
     */
    public class Demo3 {
     public static void main(String[] args) throws Exception, SecurityException {
    	Student stu = new Student();
    	Class<? extends Student> stuClz = stu.getClass();//泛型里的上限定
    //无参
    	Method m= stuClz.getDeclaredMethod("hello");
    	m.invoke(stu);
    }
    }
    

    运行结果:
    在这里插入图片描述
    有参的代码演示:

    public static void main(String[] args) throws Exception, SecurityException {
    	Student stu = new Student();
    	Class<? extends Student> stuClz = stu.getClass();//泛型里的上限定
    	//有参的
    	Method m= stuClz.getDeclaredMethod("hello", String.class);
    	m.invoke(stu, "张三");
    }
    
    

    运行结果:
    在这里插入图片描述
    私有的代码演示:

     public static void main(String[] args) throws Exception, SecurityException {
    	Student stu = new Student();
    	Class<? extends Student> stuClz = stu.getClass();//泛型里的上限定
    	//私有的
    	Method m = stuClz.getDeclaredMethod("add", Integer.class,Integer.class);
       m.setAccessible(true);
    	//	Method.invoke的返回值是被动态调用的方法的返回值
    	Object invoke = m.invoke(stu, 11,9);
    	System.out.println(invoke);
    }
    

    运行结果:
    在这里插入图片描述

    4.4 反射读写属性

    Demo4:
    代码演示:

    package com.myy.reflect;
    
    import java.lang.reflect.Field;
    
    /**
     * 反射读写属性
     *  自定义标签库,通用分页,自定义mvc也要用
     * @author myy
     *
     */
    public class Demo4 {
    public static void main(String[] args) throws Exception {
    	Student stu = new Student("t003","张三");
    	stu.age = 18;
    	System.out.println(stu.getSid());
        System.out.println(stu.getSname());	
    	Class<? extends Student> stuClz = stu.getClass();
    	//私有的
    	Field f = stuClz.getDeclaredField("sname");
    	f.setAccessible(true);
    	System.out.println(f.get(stu));
    	
    //	获取当前Student实例中的stu私有属性及其属性值
    	Field[] fields = stuClz.getDeclaredFields();
    	for (Field field : fields) {
    		field.setAccessible(true);
    		System.out.println(field.getName()+":"+field.get(stu));
    	}
    }
    }
    

    运行结果:
    在这里插入图片描述

    5.访问修饰符

    如何判断类或变量、方法的修饰符,可以使用Java反射机制中,Field的 getModifiers() 方法返回int类型值表示该字段的修饰符,

    即这个方法就是返回一个int型的返回值,代表类、成员变量、方法的修饰符。

    该修饰符是java.lang.reflect.Modifier的静态属性

    对应表如下:
    PUBLIC: 1
    PRIVATE: 2
    PROTECTED: 4
    STATIC: 8
    FINAL: 16
    SYNCHRONIZED: 32
    VOLATILE: 64
    TRANSIENT: 128
    NATIVE: 256
    INTERFACE: 512
    ABSTRACT: 1024
    STRICT: 2048
    

    Modifier提供了很多静态方法,对类和成员访问修饰符进行解码。
    如代码演示:

    package com.myy.reflect;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    
    /**
     *   Modifier.isAbstract(int mod) 
     *   Modifier.isFinal(int mod) 
     *   Modifier.isInterface(int mod)
     *   Modifier.isNative(int mod)
     *   Modifier.isPrivate(int mod)
     *   Modifier.isProtected(int mod) 
     *   Modifier.isStatic(int mod)
     *   Modifier.isStrict(int mod)
     *   Modifier.isSynchronized(int mod)  
     *   Modifier.isTransient(int mod)
     *   Modifier.isVolatile(int mod) 
     *   
     * @author myy
     *
     */
    public class Demo5 {
    public static void main(String[] args) {
         Field[] fileds = Student.class.getDeclaredFields();
         for (Field field : fileds) {
    		System.out.println(field.getName()+"  访问修饰符是否包括private:"+Modifier.isPrivate(field.getModifiers()));
    	    System.out.println(field.getName()+"  访问修饰符是否包括static:"+Modifier.isStatic(field.getModifiers()));
    	    System.out.println(field.getName()+"  访问修饰符是否包括public:"+Modifier.isPublic(field.getModifiers()));
         }
    }
    }
    

    运行结果:
    在这里插入图片描述

    展开全文
  • MySQL 面试题

    万次阅读 多人点赞 2019-09-02 16:03:33
    MySQL 面试题 MySQL 涉及的内容非常非常非常多,所以面试题也容易写的杂乱。当年,我们记着几个一定要掌握的重心: 重点的题目添加了【重点】前缀。 索引。 ...因为 MySQL 还会有部分内容和运维相关度比较高,所以...
  • 图像分割综述

    万次阅读 多人点赞 2019-07-09 22:03:48
    小波变换具有检测二元函数的局部突变能力,因此可作为图像边缘检测工具。图像的边缘出现在图像局部灰度不连续处,对应于二小波变换的模极大值点。通过检测小波变换模极大值点可以确定图像的边缘小波变换位于...
  • js面试题

    千次阅读 多人点赞 2019-04-09 19:42:32
    JavaScript 的组成 JavaScript 由以下三部分组成: ECMAScript(核心):JavaScript 语言基础 ...BOM(浏览器对象模型):提供了浏览器窗口之间进行交互的对象和方法 JS 的基本数据类型和引用数据类型 ...
  • 分布式系统概念

    万次阅读 多人点赞 2018-11-15 16:25:36
    接口入是快件id,通常做法我们需要拿到id,去数据库查状态,然后发送,但是快件基数很大时候每天的问题件也可能会很多,接口调用频繁时候就需要改进做法,这时我们可以把快件状态信息放在redis里面,key是快件id, ...
  • TensorFlow入门

    千次阅读 多人点赞 2019-04-23 10:09:29
    TensorFlow入门 参考资料: TensorFlow中文社区教程 TENSORFLOW从入门到精通之——TENSORFLOW基本操作 TensorFlow升级到1.0版本的问题 Tensorflow save&restore遇到问题及解决应对 NotFoundError: Key Variable...
  • 针对与深孔钻机相配套的钻参数检测仪(钻仪)滞后发展的问题,提出一种适合全液压动力头钻机的全面钻参数检测方法,并对钻具悬重、钻压、功率、扭矩、孔深、机械钻速、流量等主要钻参数的检测机理进行了阐述。...
  • 压力测试工具

    万次阅读 多人点赞 2018-12-20 16:06:28
    webbench不但能具有便准静态页面的测试能力,还能对动态页面(ASP,PHP,JAVA,CGI) 行测试的能力。还有就是他支持对含有SSL的安全网站例如电子商务网站进行静态或动态的性能测试。 Ubuntu 下载安装 ...
  • C语言 16行代码实现字符串中指定字符串替换

    万次阅读 多人点赞 2018-08-03 17:05:35
    支持: 1.等长字符串替换 2.长字符串替换为短字符串 3.短字符串替换为长字符串 4.中文替换 注意:短字符串替换成长字符串要注意内存越界 .../* 功 能:将str字符串中... * 数:str:操作目标 oldstr:被替换者...
  • yolov3 调

    千次阅读 2020-01-06 09:16:52
    程中将一次性加载64张图片内存,然后分16次完成前向传播,意思是每次4张,前向传播的循环过程中 累加loss求平均,待64张图片都完成前向传播后,再一次性后传更新参数 ★★★ 调经验:sub一般设置16,不能太大...
  • 深度学习入门

    万次阅读 多人点赞 2017-11-05 21:23:46
      鉴于明斯基的江湖地位(1969年刚刚获得大名鼎鼎的图灵奖),他老人家一发话不要紧,直接就把人工智能的研究,送一个长达近二十年的低潮,史称“人工智能冬天(AI Winter)”。 6.1 复杂网络解决“异或”...
  • HashSet

    千次阅读 2018-06-11 22:02:37
    2.add(E e)(1)可以看见是讲传的参数当成map的key,也因此需要对传的参数重写equals()方法。(2)在map里,如果是key不存在,那么会返回null,如果key存在,就会替换,并且返回原本的k...
  • @DateTimeFormat(pattern = "yyyy-MM-dd" ) //入格式化 用法:使用在pojo类的Date属性或其get/set方法上,还可以使用在controller方法Date类型的参数前。 作用:Spring 的 @DateTimeFormat 注解可以使 传入的其...
  • 在进行接口测试的时候,我们经常会遇到多个接口之间相互依赖的情况,这个时候我们就需要把上一个接口出中的值作为下一个接口的入进行测试了。 主要的思路大概为: 1、先获取上一个接口出中想要作为下一个...
  • lgb--贝叶斯调及代码

    千次阅读 2019-04-26 14:53:03
    lgb--贝叶斯调及代码 概述 1.目标函数 objective(): 注: 2.域空间 space: 注: 3.优化算法 algo 注: 4.结果历史记录 result: 总结: ...Bayes确实在循序渐地优化结果而随机搜索也的确很随机
  • TCL MS801机芯修改屏的方法

    千次阅读 2018-09-15 17:20:56
    TCL MS801机芯修改屏的方法 一、 目的 在TV屏幕显示花屏、黑屏、倒屏等无法正常显示的情况下,可以通过串口修改屏,使TV屏幕可正常显示。本文档介绍一些简单常见的屏的修改方法。 二、 ...
  • sklearn包中自动调方法-网格搜索GridSearchCV 一、GridSearchCV主要作用及函数参数 GridSearchCV:作用是在指定的范围内可以自动调,只需将参数输入即可得到最优化的结果和参数。相对于人工调更省时省力,相...
  • 当多个变量传入时候,设置入为map类型,本质上map存储了入的键值对 优点:几乎使用所有场景 缺点:业务性质太差,可读性太差,必须要依赖于接口才能明白入 &lt;select id="getRolesByMap" ...
  • GetMapping 和 PostMapping的入注解问题

    千次阅读 2021-03-16 17:43:43
    1、GetMapping(PostMan) ... 接收一个参数(String、Long),接收一个集合(Map)  GET 请求 测试发现 使用 @RequestParm 可以接收到参数  GET 请求 测试发现 不加 @RequestParm 也可以接收到参数 ...
  • RK3288平台下调屏基本步骤

    千次阅读 2018-07-15 11:44:32
    RK3288平台下调屏基本步骤注:因为涉及到lvds屏,mipi屏等众多类型不一的屏调试,所以本文只记录基本调屏的一般步骤,不拿具体型号屏作说明。调屏时一般板子的主控芯片为RK3288。一、屏的基本参数说明水平分辨率...
  • 这可是Fragment的一大火坑呀,我们在写一个类的时候,通常都是通过有的构造函数传入需要的参数,Fragment却反其道而行之,相信很多人已经跳了这个火坑。虽然文档上说了实例化是可能会出现问题,但是并没有具体...
  • python----贝叶斯优化调之Hyperopt

    万次阅读 2018-02-06 11:17:53
    机器学习常见的模型有KNN,SVM,PCA,决策树,GBDT等一系列的算法,但是在实际应用中,我们需要选取合适的模型,并对模型调,得到一组合适的参数。尤其是在模型的调阶段,需要花费大量的时间和精力,却又效率低下...
  • Mybatis入的几种方式

    千次阅读 2018-04-22 22:10:15
    实体类入  dao方法 public void addAdmin(Admin admin);      mapper中     &lt;insert id="addAdmin" parameterType="com.znkj.entity.Admin"&gt; ...
  • java中对象作为函数入,函数中对该对象进行修改,那么函数外该对象值是否改变? 需要考虑函数中是怎么对该对象进行修改的。 如果在函数中仅仅是修改了对象的属性值,那么函数外,该函数的值是被修改后的值。 ...
  • 出口贸易实务

    2020-12-23 17:36:51
    相信来查找出口贸易实务的你对于这一行业多少也有些了解,而出口贸易实务就是最好的选择,赶快下载...该文档为出口贸易实务,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,193
精华内容 24,877
关键字:

参进