用一个宏定义FIND求一个结构体CTYPE里某个变量CNUM相对了CTYPE地编移量.
如:stuct student
{ int a。 char b[20]。 double ccc。
} 则:
FIND(student,a>。 //等于0 FIND(student,b)。//等于4
二楼地可以.
#define FIND(type,member> (int>(&( ((type*>0>->member> >
struct student
{ int a。 char b[20]。 double ccc。
}。
int main(int argc,char* argv[]>
{
int i=FIND(student,a>。 //等于0 i=FIND(student,b>。//等于4
return 0。
}
调试结果是对地. 题目出得很好:
其实就是考下这个宏 offsetof ,定义在文件 stddef.h 中.
#define offsetof(TYPE, MEMBER> ((size_t> &((TYPE *>0>->MEMBER>
TYPE是某struct地类型 0是一个假想TYPE类型struct,MEMBER是该struct中地一个成员. 因为该struct地基地址为0, MEMBER地地址就是该成员相对与struct头地址地偏移量. 再往深处,接触过Linux Kernel地会知道这个宏 container_of,就嵌套了宏offsetof ,其在Linux
Kernel中地应用非常广泛,它用于获得某结构中某成员地入口地址. 1.运放求放大倍数地
2.三极管基础知识<放大区,截至区,饱和区) 3.并联RC变换成串联RC 4.运放求反馈地
5.单片机和74hc595硬件连接和编程
6.数据结构-----队列,建立一个队列,写数,读数.
一 简答题
1 进制转换
2 单片机C51 用idata 及xdata 定义变量地存放区域 及其汇编指令
3 位运算 <置位 清零 取反)
二 求运放地电压增益
三 史密特触发电路地 求出高低电压阈值及回滞电压 依据输入电压画出输出电压波形
四 用门电路设计格雷码转换为自然二进码电路,要求画出电路图
五 二进D触发器狗成地同步电路
要求写出驱动方程,状态方程,输出方程,画出状态转移图
六 用单片机实现从串口读取四字节地数与固件中地四字节地常数比较,若相等,暂停6S后
控制电机工作.继续读取,比较...
要求画出电路及写出代码
七 一个8比特地数,要求编写一端C程序实现位倒序功能. 前两天参加了周立功武汉站笔试和机试,先贴部分题目出来,希望对其他地方想应聘周立功地
同学有所帮助. 一、笔试卷
1、在进程中通信地手段不包括<)A:油槽 B:管道 C:文件映射 D:信号量 2、在C语言中,下面哪些是定义<)A:extern const int *pi。 B:extern int a。
C:struct MyStruct。 D:extern void fun1(void (*f>(int>> {}。
3、传统地快速排序算法,在最坏情况下地时间复杂度是多少?A:O(nlog(n>> B:O(log(n>>
C:O(n*n> D:O(n*n*n>
4、下面是合法地浮点数指数格式地是<)A:2.1E0.2 B:E15 C:.5E-3 D:以上都错
5、长度为n地有序线性表中进行二分查找,最坏情况下比较地次数是
A:O(n> B:O(2n> C:O(log(2n>> D:O(nlog(2n>>
6、以下程序运行时将在哪一行死掉<)
struct SS
{ int i。 int *p。
}。 void main(>
{
struct SS s。 int *p=&s.i。 p[0]=3。 ① p[1]=3。 ②
s.p=p。 s.p[1]=1。 ③ s.p[0]=2。 ④
}
A: ① B: ② C: ③ D: ④
7、以下程序地运行结果是<) A:0 B:1 C:5 D:2
union { struct {
unsigned char c1:3。 unsigned char c2:3。 unsigned char c3:2。
}s。
unsigned char c。
}u。 int main(>
{
u.c=100。
printf(\。
return 0。
}
8、编写一个简单地C函数指针声明_____.
9、有5个盒子,分别装了1、4、8、32、64个球,如果将它们任意组合(至少一个>,所有可能
值中最中间地一个值是____.
10、如果处理器是little_endian地,请写出0x1234在存储时候地字节序_____. 一、简答题 1. 二进制、十进制、BCD码间转换 2. 单片机C51 用idata 及xdata 定义变量地存放区域 及其汇编指令 3. 位运算指令 <置位 清零 取反) 二、求运放地电压增益<就是一个反相比例运放地变异题,只要懂虚短虚断就OK) 三、1.史密特触发电路地高低电压阈值及回滞电压 2.依据输入电压波形画出输出电压波形 四、用门电路设计格雷码转换为自然二进码电路(给出格雷码状态图),要求画出设计电路图 五、D触发器构成地同步电路<要求写出驱动方程,状态方程,输出方程,画出状态转移图) 六、用单片机实现从串口读取四字节地数与固件中地四字节地常数比较,若相等,控制继电器闭合,延时6S.否则继续读取,比较... 要求画出电路及写出代码<建议用51) 七、一个8比特地数,要求编写一端C程序实现位倒序功能.如:a=b0b1b2b3b4b5b6b7,编程实现a=b7b6b5b4b3b2b1b0<要求实现地速度尽可能地快)
17号周立功单机在广州招人,本人去投了一份材料,两位招聘大人当场拿出试卷考咱. 一道是英译汉,是单片机方面地。
二是设计一个四分频电路,用D触发器。 三是设计一个译码电路。
四是用单片机89C51设计一个驱动LED地电路(要求用P1.0>,还有汇编程序。 咱也不怕丢脸一四还可以,二三实在不记得了,好久没看BOOK了。 用AVR久了,51又模糊了。
真希望在找工作地同行多看BOOK呀,本来很简单地,很可能一下就忘记了!
9.20号去南航参加周立功地招聘会,人会很多,很多外地赶过来地.9点半宣讲会,10点半笔试,我考地是软件卷,共五道题
1 括号匹配问题,这题目比较经典,利用堆栈 2 实现一个将字符串去掉特定字符地函数
3 计算二叉树总节点数 以及单链表地反转 都是基础题
4 是一个C++题目,给出一段代码,找错 5
古代数学算法: 1×33=33 = 33 提取1 2×33=66 = 33+33 4×33=132= 66+66 8×33=264= 132+132 提取8 9×33=297=33+264
然后有三个小题a.推理除法运算;b.写出乘法运算地函数;c.写出除法运算地函数 总地来说题目不难,都是基础题.
题:用任意一单片机设计一个4X4地键盘并编出程序得到键值,要求有去抖,去抖时单片机可以做其它事情,按一下键盘蜂鸣器叫一下,蜂鸣器叫过程中也要单片机可以做其它事情.<提示:用定时器产生基本节拍)
题目是我做后记下来地,当时在做得时候写地很乱,被老师评为编程不怎么样.回来后想想其实很简单就一个中断函数搞定: void time1_sv(> interrupt 5 using 2{ EA=0。 TF2=0。 //清中断标志位 if((spcnt-->==0>{spcnt=0。SPEAK=0x00。} if(scankey(>>{count++。 if(count>8>{getkeyval(>。count=0。spcnt=30。SPEAK=0xff。} } else {count=0。} EA=1。 }
思路是:连续n次进入中断时都检测到有按键,那就去取按键值,并使蜂鸣器叫,蜂鸣器叫多长时间由spcnt地值决定. 实验源程序: #include \//定义外围器件地址 #define SPEAK XBYTE[0xC000] #define KEYIN XBYTE[0xE000] #define KEYOUT XBYTE[0xF000] #define PORTA XBYTE[0xa000] #define PORTB XBYTE[0xb000] #define LEDD XBYTE[0x9000] //3000个机器周期中断一次 #define TIME_H (65535-3000>/256 #define TIME_L (65535-3000>%6 //LED显示译码 uchar code table[]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,0x83,0x0C6,0x0A1,0x86,0x8E,0x7F,0x89}。 //全局变量 uchar key_value,count,spcnt。 //判断有无按键 uchar scankey(> { KEYOUT=0x00。 if(((~KEYIN>&0x0f>!=0> return(1>。 //有键按下 else return(0>。 }
//得到键void {
KEYOUT=0x0e
switch(KEYIN&0x0f> { case 14:key_value=0。 case 13:key_value=1。 case 11:key_value=2。 case 7:key_value=3。 default:break }
KEYOUT=0x0d
switch(KEYIN&0x0f> { case 14:key_value=4。 case 13:key_value=5。 case 11:key_value=6。 case 7:key_value=7。 default:break }
KEYOUT=0x0b
switch(KEYIN&0x0f> { case 14:key_value=8。 case 13:key_value=9。 case 11:key_value=10。 case 7:key_value=11。 default:break }
KEYOUT=0x07
switch(KEYIN&0x0f> { case 14:key_value=12。 case 13:key_value=13。 case 11:key_value=14。 case 7:key_value=15。 default:break } }
//定时T2中断 89c52,w78e58之类地单片机void time1_sv(> interrupt 5 EA=0 TF2=0。 //清中断 if((spcnt-->==0>{spcnt=0。SPEAK=0x00 if(scankey(>>{count++
if(count>8>{getkeyval(>。count=0。spcnt=30。 } else {count=0。 EA=1} //粗劣延时void msec(uint {
unsigned int j while((x-->!=0>
值
getkeyval(void>
。
breakbreakbreakbreak
。 。 。 。 。 。
breakbreakbreakbreak
。 。 。 。 。 。
breakbreakbreakbreak
。 。 。 。 。 。
breakbreakbreakbreak
。 。 。 。 。
都有定时器2 using 2{
。
标志位 。}
。
SPEAK=0xff。}
} 。
mS
级 x> 。