5.
试题五(共15分)阅读以下说明和C语言代码,回答问题1至问题4,将解答填入答题纸的对应栏内。【说明】在嵌入式操作系统设备管理的实现上,常使用到C语言的函数指针变量,由统一的管理函数调用不同的设备驱动程序。下面的一段C语言代码是驱动管理程序manage_device调用4个不同设备驱动程序,但没有用到函数指针变量。【C语言代码】/*变量与类型说明*/#include"stdio.h"#include"stdlib.h"externintsys_status;externintDev_drv1(intarg1,intarg2);externintDev_drv2(intarg1,intarg2);externintDev_drv3(intarg1,intarg2);externintDev_drv4(intarg1,intarg2);#defineNOERROR0typestruct{int_fd;}TYP_DEV_TAB;TYP_DEV_TABdev_tab[50]={101,99,80,120,};/*程序代码*/voidmanage_device(intdevid,intarg1,intarg2){intplace;intret;for(place=0;place=50)printf("NODEVICEfd=%d\n",devid);switch(dev_tab[place]._fd){case80:ret=Dev_drv3(intarg1,intarg2);break;case99:ret=Dev_drv2(intarg1,intarg2);break;case101:ret=Dev_drv1(intarg1,intarg2);break;case120:ret=Dev_drv4(intarg1,intarg2);break;}if(ret!=NOERROR)printf("DEVICE%derror!\n",devid);}intDev_drv1(intarg1,intarg2){/*局部变量声明,略*//*驱动程序代码,略*/}intDev_drv2(intarg1,intarg2){/*局部变量声明,略*//*驱动程序代码,略*/}intDev_drv3(intarg1,intarg2){/*局部变量声明,略*//*驱动程序代码,略*/}intDev_drv4(intarg1,intarg2){/*局部变量声明,略*//*驱动程序代码,略*/}【问题1】(8分)请用C语言的函数指针变量,对manage_device函数进行改造,完成下面C语言代码中的(1)、(2)、(3)和(4)处的变量说明或语句,将解答填入答题纸的对应栏内。【C语言代码】/*变量与类型说明*/#include"stdio.h"#include"stdlib.h"externintsys_status;externintDev_drv1(intarg1,intarg2);externintDev_drv2(intarg1,intarg2);externintDev_drv3(intarg1,intarg2);externintDev_drv4(intarg1,intarg2);#defineNOERROR0typedefstruct{int_fd;(1)函数指针变量说明;/*变量名用process*/}TYP_DEV_TAB;TYP_DEV_TABdev_tab[50]={{101,Dev_drv1},{99,Dev_drv2},{80,Dev_drv3},{120,Dev_drv4},};/*程序*/voidmanage_device(intdevid,intarg1,intarg2){intplace;intret;(2)函数指针变量说明;/*局部变量,变量名用ProcAction*/for(place=0;place=50)printf("NODEVICEfd=%d\n",devid);(4)语句2;if(ret!=NOERROR)printf("DEVICE%derror!",devid);}【问题2】(3分)在C语言程序中,常在某些变量的说明前加extern,如本题在变量说明中的第一条加externintsys_status;请说明加extern与不加extern的区别,在进行编译时会有什么样的不同处理?【问题3】(2分)函数的参数存放在什么地址空间中?说明其作用范围。将答案填入答题纸的对应栏内。【问题4】(2分)在设备驱动程序(函数)Dev_drv1中,对指针ptr的说明如下:【C语言代码】intDev_drv1(intarg1,intarg2){structnode{intID;charname[20];intrange;};structnode*ptr;/*其它局部变量声明,略*/ptr=(structnode*)malloc(sizeof(structnode)*100);/*其它程序代码,略*/}设int为32位整数,char占8位。当对指针ptr赋完值后的值为0x3751C0,若再执行一条“ptr++;”语句,此时ptr的值为多少?(用十六进制表示)。[15分]