C语言 杀死线程 Api函数

Python068

C语言 杀死线程 Api函数,第1张

GetExitCodeThread函数可以得到线程终结时的返回值,因为线程终结了,所以系统中不再有这个线程,hThreadRcvData本身已经无效,所以调用TerminateThread函数会失败。

2. B

因为double型下的 1.2e0.5 ,e后面不能带有小数,只能是整数。

5. D

float y=0.0,a[]={2.0,4.0,6.0,8.0,10.0},*p

int i

p=&a[1]/**将a[1]的地址赋给P*/

for(i=0i<3i++) y+=*(p+i) /**从p开始将p,p+1,p+2地址的值

加起来*/

printf("%f\n",y)/*输出总合*/

理解了上述的程序段,那么可以知道

在循环中,i=0时,*p=4.0 ,y=4.0

i=1时,*p=6.0 ,y=10.0

i=2时,*p=8.0 ,y=18.0

因为是浮点形式输出,所以最终的结果是D

14.A

fopen的原型是:FILE *fopen(const char *filename,const char

*mode)

fclose的原型是:fclose(FILE *fp)

fprintf的原型是:int fprintf(FILE*stream, const

char*format[,argument]…)]

fread的原型是:int fread(void *buf,int size,int count,FILE

*stream)

参照上述函数原型,就可以得到A是对的。其他错的。

18. C

因为在循环条件中,首先定义i=1,但是在循环体中并没有对i进行操

作,那么i就一直保持不变=1,而只要i<3那么就进入循环,所以进入

循环的条件一直都是为真,所以就一直循环,变成死循环,无法进入p

rintf那条语句了。

20. B

int *p,a=10,b=1

p=&aa=*p+b

首先p是一个指针,p=&a这个是让p指向a,也就是说*p里面存的是a的

值10;a=*p+b这句就是进行加法运算,10+1=11赋给a,所以a的最终

结果就是11

21. D

这个函数的大意就是说,假设p存放的是最小的那个数的下标,从第0

个数开始跟后面的数进行比较,如果这个数比后面的数大,那么就把

后面的那个数的下标作为最小值的下标赋给p,然后继续进行比较,直

到全部比较结束。

25. A

int k=0

while(k=1) k++

k=1实际上就是1,也就是命题为真,所以不管怎么样进入循环体的条

件永远都成立,所以每次都可以进入循环,所以是死循环。

28.D

st(char *s)

{char *q=s/**将字符串s的首地址赋给指针q*/

while(*q!='\0') q++/**如果q地址的内容不是字符串结束符的话,

那就取下一个*/

return (q-s) /**返回q-s的值,这个是一个int类型,实际上就是

取这个字符串的长度*/

}

30.B

程序跑的

31.A

main()

{int i=0

while(1)

{ printf("*") /*打印一个* */

i++/*此时i=1*/

if(i<3) break /**因为i=1满足if条件,所以跳出循环体*/

}

printf("\n")

}

所以最终只打印了一个*

32. D

#include <stdio.h>

main(int argc,char *argv[])

{

while(--argc) /**只要参数的总数自减不为0,那么进入循环体*/

printf("%s",argv[argc])/**打印出第argc个参数*/

printf("\n")

}

因为argc=4,所以会进入循环体4次,--argc是先做判断再自减

33 A

^按位异或

<<左移

优先级,左移〉按位异或

按照这个规则去算就可以了

所以选择A

34. B

getchar()不能带参数。

把通讯做成命令,应答的帧形式,最好是帧长度固定。

举个例子,

主机发送给从机的数据

帧头 命令 参数1 参数2 参数3 参数4 校验和 帧尾

从机回复的数据

回复帧头 应答命令 结果1 结果2 结果3 结果4 校验和 回复帧尾

在从机接收到帧头和命令后,并不进行处理,而是暂存起来,知道接收到帧尾,并接校验通过后,才真正执行。

假如从收到帧头起,一定的时间内,还没有收到完整的帧,或者帧校验失败,那么从机用特殊的格式回复。

当然,超时时间也可以不从帧头算,从上一个字节算也可以。

这样的帧结构就能保证通讯的正确性,一般来讲,帧越长,通讯效率越高,但是占用暂存空间越打,而且出错的可能越大,出错后付出的代价也越大,实时性也越差,而且帧长度超过一定值后,通讯效率也不会再明显增加。

帧越短,通讯效率越低,但是灵活。

像上面的例子,帧长度是8,通讯效率是62.5%。如果将帧长度改为16,通讯效率变为81.25%

下面是源代码:

直接拷贝就能够编译通过了。当然要把寄存器改了。只有几行需要改的哈:

#include "tot.h"

#define GOOD_PARSE 0

#define BADID_PARSE 1

#define BADLEN_PARSE 2

short parsed

char *pbuf

void tsip_input_proc(TSIPPKT *rpt,unsigned char inbyte)

void rpt_packet(TSIPPKT *rpt,int *obuf)

void tsip_input_proc(TSIPPKT *rpt,unsigned char inbyte)

{

switch(rpt->status)

{

case TSIP_PARSED_DLE_1:

switch(inbyte)

{

case 0:

case ETX: // illegal data

rpt->len=0

rpt->status=TSIP_PARSED_EMPTY

break

case DLE: // try normal message start again

rpt->len=0

rpt->status=TSIP_PARSED_DLE_1

break

default: // legal ID start message

rpt->len=0

rpt->status=TSIP_PARSED_DATA

rpt->codes=inbyte

break

}

break

case TSIP_PARSED_DATA:

switch(inbyte)

{

case DLE: // expect DLE or ETX next

rpt->status=TSIP_PARSED_DLE_2

break

default: // normal data byte

rpt->buf[rpt->len]=inbyte

rpt->len++

break

}

break

case TSIP_PARSED_DLE_2:

switch(inbyte)

{

case DLE: // normal data byte

rpt->buf[rpt->len]=inbyte

rpt->len++

rpt->status=TSIP_PARSED_DATA

break

case ETX: // end of message,return TURE here

rpt->status=TSIP_PARSED_FULL

break

default: // error:treat as TSIP_PARSED_DLE_1,start new report packet

rpt->codes=inbyte

rpt->len=0

rpt->status=TSIP_PARSED_DATA

break

}

break

case TSIP_PARSED_FULL:

case TSIP_PARSED_EMPTY:

default:

switch(inbyte)

{

case DLE: // normal message start

rpt->len=0

rpt->status=TSIP_PARSED_DLE_1

break

default: // error:ignore inbyte

rpt->len=0

rpt->status=TSIP_PARSED_EMPTY

break

}

break

}

if(rpt->len>MAX_RPTBUF) // error:start new report packet

{

rpt->status=TSIP_PARSED_EMPTY

rpt->len=0

}

}

//串口字符交换*******************************************************************/

int bGetShort(char *bp)

{

int outval

char *optr

optr=(char *)&outval

*optr=*bp<<8 &0xFF00

*optr=*(++bp) | *optr

return outval

}

//串口报文

int rpt_0x14(TSIPPKT *rpt,int output[1])

{

char *buf

buf=rpt->buf

if(rpt->len!=2)return 0

output[0]=bGetShort(&buf[0])

return 1

}

void rpt_packet(TSIPPKT *rpt,int *obuf)

{

parsed=GOOD_PARSE

switch(rpt->codes)

{

case 20:

rpt_0x14(rpt,obuf)

break

default:

parsed=BADID_PARSE

break

}

}

//发送

void send_cmd(TSIPPKT *cmd, void sendb(char))

{

char *cbuf, *cbufend

sendb (DLE)

sendb (cmd->codes)

cbufend = cmd->buf + cmd->len

for (cbuf = cmd->bufcbuf <cbufendcbuf++) {

if (*cbuf == DLE) sendb (DLE)

sendb (*cbuf)

}

sendb (DLE)

sendb (ETX)

}

void sendb(char outbyte)

{

//ScibRegs.SCITXBUF=outbyte

}

//字符交换

void bPutShort(unsigned int *in, char *out)

{

char *inptr

inptr=(char *)in

*out= (*inptr>>8) &0x00FF

*(++out) = *inptr &0x00FF

}

//命令

void cmd_0x0(TSIPPKT *cmd,SCICALOUT *out)

{

bPutShort(&(out->ve),&(cmd->buf[0]))

cmd->len = 2

cmd->codes =37

}

//串口使用中断方式接收,发送不采用中断

int input[MAX_RPTBUF]

void SCIRXD_ISR(void)

{

tsip_input_proc(&rpt,ScibRegs.SCIRXBUF.bit.RXDT)// analyse

if (rpt.status == TSIP_PARSED_FULL) // receive complete

{

rpt_packet(&rpt,input) // output reports

rpt.status=TSIP_PARSED_EMPTY // prepare for next

}

ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1 // Clear Overflow flag

ScibRegs.SCIFFRX.bit.RXFFINTCLR=1 // Clear Interrupt flag

PieCtrlRegs.PIEACK.all|= PIEACK_GROUP9 // Issue PIE ack

}

//发送调用方式

// cmd_100x0(&cmd)

// send_cmd(&cmd,&sendb)

//发送调用方式

// cmd_100x0(&cmd)

// send_cmd(&cmd,&sendb)

上面的就是源代码。。记住把寄存器改了哦。无论是单片机还是上位机都可以用这个哈。