我正在寻找一个传统的嵌入式项目,其中包含用于16位MCU的微芯片C30编译器.有一种预期的情况,索引从0xFF回绕,我认为这是预定义的行为.然而,//sad :(当我期望最终快乐时,下面的代码总是抛弃我.
unsigned char index = 0xFF;
unsigned char check = 0x02;
if(check == index +3){
//happy!
}else{
//sad :(
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我专门将它投射到unsigned char:
unsigned char index = 0xFF;
unsigned char check = 0x02;
if(check == (unsigned char) index +3){
//happy!
}else{
//sad :(
}
Run Code Online (Sandbox Code Playgroud)
它工作,我最终在//happy!所以我错过了什么?这只是编译器依赖的行为吗?
如果我可以使用#define指向一个函数,我有点困惑.我有一个编解码器/ DSP谁的工具自动生成这样的代码页:
SIGMA_WRITE_REGISTER(address, data, length);
SIGMA_WRITE_REGISTER(address, data, length);
SIGMA_WRITE_REGISTER(address, data, length);
....
Run Code Online (Sandbox Code Playgroud)
然后在另一个.h文件中他们这样做:
#define SIGMA_WRITE_REGISTER( address, data, length ) {
/*TODO: implement macro or define as function*/}
Run Code Online (Sandbox Code Playgroud)
这对于编写寄存器没有任何帮助.这很好,虽然为我的micro编写了一些代码,通过I2C编写寄存器,这似乎是有效的.现在我不想只将该代码粘贴到上面的定义中,并让它实例化1000次.我希望我可以使用is define作为我的函数的别名?
就像是:
#define SIGMA_WRITE_REGISTER(address, data, length) { my_i2_c_func(address, data, length)}
Run Code Online (Sandbox Code Playgroud)
我尝试了这样的东西并且编译了,我不太确定它是否正常工作.这是一件有效的事情,还是我在咆哮错误的树?
我正在看这个开源启动加载器,我看到了这行代码.最后一行发生了什么?是某种指向函数的指针,是否转换为地址?
uint8_t ret = init_api();
uint16_t ptr;
ptr = PGM_READ_WORD(JUMP_TABLE_INDEX(6));
ret = ( (uint8_t(*)(uint32_t, uint8_t *, uint8_t)) ptr )(addr, data, erase);
Run Code Online (Sandbox Code Playgroud) 我想念memset.我在一个类中有一个帧缓冲区,它有一些来自其他操作的数据,现在我想将该帧缓冲区中的所有内容清除为0x00或0xFF.我没有在文档中看到明确的方法,有一个zfill方法可能有效.我想过再次调用字节数组的init方法,但想知道这是否会导致我在路上遇到一些内存问题.
我正在使用python 2.7.
我继承了一些代码,它在调用时有一个这样的格式.要清楚一些函数定义在这样的地方:
void some_function(int a, int b, int c){
printf("hi there\n");
}
Run Code Online (Sandbox Code Playgroud)
然后它在主代码中被调用如下:
some_function(2, 3, 4);
{
x = 1200;
another_function(&x);
}
Run Code Online (Sandbox Code Playgroud)
以上只是简短的说法:
if(some_function(2,3,4) == 1)
{
//then execute code found here?
}
Run Code Online (Sandbox Code Playgroud)
我之前从未见过那个,我觉得因为some_function是void而且永远不会返回一个值,它永远不会运行括号中的代码?