【随笔】C语言编程心得
写C程序有4年了,至今还停留在写代码,调试代码的层面,没有参与过较大的项目,程序架构、思想无从谈起。在此只能记录下写代码时容易犯得错误和一些小技巧。遇到随时记录,不断更新。
1、浮点数的赋值问题,代码:
1 float M_inv = 1/1296;
2 float M_inv = 1/1296.0;
此代码1执行后M_inv的值为0,程序默认整形数的运算结果为整形,因此代码2执行则为预期结果。
2、指针与数组
网上关于数组与指针的用法和区别很多,摘一段实际工程的代码,来说明指针的强大。程序计算最后需要把本次计算的值作为下一次计算的输入,由于XpreUpdate和XnowUpdate声明为数组,只能通过memcry函数来完成。PpreUpdate和PnowUpdate声明为指针,则数据可以通过指针地址的互换来实现。就本工程来说数据量比较大,使用指针对程序效率有很大提高!
如果对内存结果清晰,强烈建议使用指针,灵活,效率高。
#define N_X 20000
#define P_ROW 3000
#define P_COL 13000
float XpreUpdate[N_X], XnowUpdate[N_X];
float **PpreUpdate, **PnowUpdate;
float **pPChange;//用于交换PpreUpdate和PnowUpdate地址
void data_int(void)
{
.......
PpreUpdate = (float **) malloc(sizeof(float *) * P_ROW);
for (j=0;j<P_ROW;j++)
{
PpreUpdate[j] = (float *) malloc(sizeof(float) * P_COL);
}
PnowUpdate = (float **) malloc(sizeof(float *) * P_ROW);
for (j=0;j<P_ROW;j++)
{
PnowUpdate[j] = (float *) malloc(sizeof(float) * P_COL);
}
........
}
void karman_process(void)
{
.........//把XnowUpdate赋给XpreUpdate,由于这两个变量声明的是数组,所以没有办法交换其地址
memcpy(XpreUpdate,XnowUpdate,sizeof(float) * N_X);
//把PnowUpdate赋给PpreUpdate,这两个变量声明为指针,所以可以直接交换
pPChange = PpreUpdate;
PpreUpdate =PnowUpdate;
PnowUpdate = pPChange;.........
}
3、数据宽度及数据类型匹配问题
不同数据类型在操作是一定小心。 下面是程序中有问题的一段代码,目的是驱动LED灯循环闪烁。
/**************************LED灯显示********************/
unsigned char led = 1;if (led == 0x80)
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, (0xffff00 + ~led));
led = 1; //8个led,所以要让led循环闪烁
}
else
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, (0xffff00 + ~led));
led=led<<1;
}
如果按照上面这样写,led灯与预期不符。跟踪发现,原本8位的led在经过~led按位取反后变成了32位(CPU为32位)。
例如:0x01变成了0xfffffffe,与期望的0xfe相差太多。
代码进行简单修改,只需强行转化~led操作后的类型,如下:
/**************************LED灯显示********************/
unsigned char led = 1;
if (led == 0x80)
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, (0xffff00 + (alt_u8)~led));
led = 1; //8个led,所以要让led循环闪烁
}
else
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, (0xffff00 + (alt_u8)~led));
led=led<<1;
}
posted on 2010-11-05 10:54 stone_xiyi 阅读(475) 评论(2) 编辑 收藏 举报