【随笔】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编辑  收藏  举报

导航