嵌入式Linux工程师笔试记录 – 2020.8.19(九)
广州路派电子科技有限公司软件笔试题目
嵌入式Linux工程师笔试记录 -- 2020.8.19
1. 什么式抽象类
参考:C++的抽象类详解
首先解释纯虚函数:纯虚函数是在基类中仅仅给出声明,不对虚函数实现定义,而是在派生类中实现。这个虚函数称为纯虚函数。
virtual <类型><函数名>(参数表) = 0;
而抽象类就是指包含纯虚函数的类,抽象类只能作为派生类的基类,不能实例化。但可以定义为指针,指向实现所有纯虚函数的派生类对象。抽象类为派生类的成员函数提供基础,实现动态的多态性。派生类若没有实现基类的所有纯虚函数,那么它也成为一个抽象类。
在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。
比如说平面图形是一个抽象描述,它有个行为是求面积。而它的具体描述可以是三角形、正方形、圆等,总所周知,它们的求面积 行为实现方式是不同的。这就是抽象类的作用。
2. ST提供了完善的RCC和RTC接口库函数,分别位于哪些文件中?
ST库函数命名是stm32Fxxx_模块.c。根据我比较熟悉的F103系列,它的RCC和RTC接口库函数位于以下文件:
RCC : stm32f10x_rcc.c与stm32f10x_rcc.h
RTC : stm32f10x_rtc.c与stm32f10x_rtc.h
3. 关键字static,const , volatile分别有什么作用?
static:
1)全局静态变量:在全局变量前加上static,全局变量就定义为一个全局静态变量,存储在静态存储区中,在整个程序运行期间一直存在,作用域被限定为当前文件内,在文件外不可见;
2)局部静态变量:在局部白能力之前加上static,存储在静态存储区中,未初始化会自动初始化为0,延长生命周期至整个程序运行期间一直存在,不随函数退出而释放,但作用域不变,在函数外不可见;
3)静态函数:在函数返回类型前加static,作用类似全局静态变量,函数默认是extern,用static声明则只在当前文件可见,文件外不可见,无法调用。
4)静态成员变量:类中用static修饰的变量为静态成员变量,是类的所有对象中的共享资源,而不是某个对象的成员,实现多个对象之间数据共享;
5)静态成员函数:类中用static修饰的成员函数,同静态成员变量意义,属于类的静态成员,不属于某个对象,进而在静态成员函数中没有this指针。对静态成员的调用只需要"类::静态成员";
const:
1)修饰变量:变量不能被修改,除了初始化时可以放在等号左边,其他时候不能作为等号的左值。
const int a=1 ; 不能进行 a=2操作;
const int *p = &a ; 不能进行 *p = 2 操作
int * const q = &a; 不能进行 p = &b 操作
2)修饰形参:表示变量在该函数内部中不会被更改。
3)修饰成员函数,表明时一个常函数,不能修改类的成员变量。
4)const修饰函数返回值,使得其返回值不能在等号左边。
volatile:
修饰变量防止变量被编译器优化,进而在读取该变量时,读取寄存器中的备份。这在多任务下进行检测某个变量在其他任务中是否发生变化非常不利。
1)中断服务程序中修改的供其他程序检测的变量需要加volatile;
2)多任务环境下各任务间共享的标志应该加volatile;
3)多存储器映射的硬件寄存器通常也要加volatile,因为每次对它的读写都可能有不同意义。
4. Linux C如何实现读取磁盘分区的剩余空间大小,写出相应程序?
#include <stdio.h>
#include <sys/vfs.h>
int main(){
struct statfs diskInfo;
statfs("/" , &diskInfo);
unsigned long long totalBlocks = diskInfo.f_bsize;// 每一块大小
unsigned long long freeDisk = diskInfo.f_bfree*totalBlocks; // 剩余块
printf("totalBlocks:%llu k \nfreeDisk:%llu g \n" , totalBlocks/1024 , freeDisk/1024/1024/1024);
return 0;
}
考到statfs函数的使用。
5. 写一个二分查找函数
#include <iostream>
#include <string.h>
using namespace std;
int cnt = 1 ;
template <typename T>
int select( T array[] , int l , int r, T value ){
int mid = l+(r-l)/2;
T selectvalue = array[mid];
cout << "第" << cnt ++ <<"次:array[" << mid << "]:" << selectvalue << endl;
if( selectvalue == value )
return mid;
if( l == r-1 ){
cout << "找不的哦" << endl;
return -1;
}
if( selectvalue > value ){
return select<T>( array , 0 , mid , value );
}else{ // selectvalue < value
return select<T>( array , mid+1 , r , value );
}
}
int main(){
char buf[1024] = {0};
cout << "array : ";
cin >> buf ;
char value;
cout << "value : " ;
cin >> value;
select<char>( buf , 0 , strlen(buf) , value );
return 0;
}