【发布时间】:2015-12-07 08:40:38
【问题描述】:
试图破译这段 C 代码:
int WaitForPacket(uint16 milliseconds, Dexcom_packet* pkt, uint8 channel) {
uint32 start = getMs();
uint8 * packet = 0;
uint32 i = 0;
uint32 seven_minutes = 420000;
int nRet = 0;
swap_channel(nChannels[channel], fOffset[channel]);
while (!milliseconds || (getMs() - start) < milliseconds) {
i++;
if(!(i % 60000)) {
strobe_radio(channel);
}
doServices();
if((getMs() - start) > seven_minutes) {
killWithWatchdog();
delayMs(2000);
}
blink_yellow_led();
if (packet = radioQueueRxCurrentPacket()) {
uint8 len = packet[0];
fOffset[channel] += FREQEST;
memcpy(pkt, packet, min8(len+2, sizeof(Dexcom_packet)));
if(radioCrcPassed()) {
if(pkt->src_addr == dex_tx_id || dex_tx_id == 0 || only_listen_for_my_transmitter == 0) {
pkt->txId -= channel;
radioQueueRxDoneWithPacket();
LED_YELLOW(0);
return 1;
} else {
radioQueueRxDoneWithPacket();
}
} else {
radioQueueRxDoneWithPacket();
LED_YELLOW(0);
return 0;
}
}
}
LED_YELLOW(0);
return nRet;
}
代码可读性很强,我知道大部分情况(除了uint8 * packet = 0,那不是空指针吗?),但我不确定!milliseconds 发生了什么在while循环的条件下。它只是按位NOT吗?那是什么意思?什么时候按位不为真,什么时候为假,如果有多个位?
【问题讨论】:
-
关于
uint8_t * packet = 0,是的,它是一个空指针。 -
这不是问题吗?
-
我不太确定,空指针不是坏事吗?或者它只是指向内存中第一个位置的指针?
-
空指针不是一件坏事,它取消引用空指针是一件坏事。这里
packet指针被初始化为0只是为了给它一个已知的初始值,从程序中可以看出它后来被赋值给radioQueueRxCurrentPacket函数返回的值。 -
啊哈,这是一个=,不是一个==。
=是赋值成功时返回true/1的函数吧?
标签: c while-loop conditional