問一個C語言的問題

[复制链接]
2450|7
 楼主| action99 发表于 2007-11-8 13:37 | 显示全部楼层 |阅读模式
<br />我這個程序是驅動OLED顯示的,我覺得程序好復雜,,應該去簡化一下,比喻:display_0_l[0];&nbsp;我是用到數組,因為每個CASE&nbsp;&nbsp;裡&nbsp;面的程序就隻有BANK&nbsp;,LINE&nbsp;和display_0_l[0];&nbsp;&nbsp;&nbsp;這幾個變量,有沒有方法把數組這個數做成“地址變量“在循環中來調用。不要一個一個的寫,這樣程序量會好大。。請高手指點<br /><br />void&nbsp;&nbsp;&nbsp;lcd_display(unsigned&nbsp;char&nbsp;lcd_char){<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i,j,area_cnt,bank_buff,line_buff;<br /><br />&nbsp;&nbsp;bank_buff=bank;line_buff=line;<br />&nbsp;&nbsp;switch(lcd_char){<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x00:<br />&nbsp;&nbsp;&nbsp;&nbsp;area_cnt=display_0_l[0];&nbsp;&nbsp;&nbsp;//0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcd_set();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcd_start_data();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=1;j&ltarea_cnt;j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_data=display_0_l[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_lcd_data();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;lcd_stop();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;bank--;line=line_buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;lcd_set();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;lcd_start_data();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=1;j&ltarea_cnt;j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_data=display_0_h[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_lcd_data();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;lcd_stop();<br />&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x01:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1<br />&nbsp;&nbsp;&nbsp;&nbsp;area_cnt=display_1_l[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcd_set();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcd_start_data();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=1;j&ltarea_cnt;j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_data=display_1_l[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_lcd_data();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;lcd_stop();<br />&nbsp;&nbsp;&nbsp;&nbsp;bank--;line=line_buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;lcd_set();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;lcd_start_data();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=1;j&ltarea_cnt;j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_data=display_1_h[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_lcd_data();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;lcd_stop();<br />&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />...<br />..<br />..<br />下面還有。。。<br />
dld2 发表于 2007-11-8 14:01 | 显示全部楼层

指针的数组

定义一个指针数组<br />unsigned&nbsp;char&nbsp;*cntList[]&nbsp;=&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;display_0_l,<br />&nbsp;&nbsp;&nbsp;&nbsp;display_1_l,<br />&nbsp;&nbsp;&nbsp;&nbsp;....<br />}<br /><br />然后在switch中的:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;area_cnt=display_0_l[0];<br />可以变成:<br />&nbsp;&nbsp;&nbsp;&nbsp;area_cnt=cntList[lcd_char][0];&nbsp;&nbsp;&nbsp;
 楼主| action99 发表于 2007-11-8 15:16 | 显示全部楼层

這種方法我試過了,不行,總是會出錯。

這種方法我試過了,不行,總是會出錯。display_0_l在數組裡一定要是一個常量。不然合出錯。。
dld2 发表于 2007-11-8 15:21 | 显示全部楼层

Re:

如果display_0_l是静态分配的,也就是在链接时就确认地址的,就不会有错啊。<br />你说的出错是怎样的情况呢,是编译出错还是运行时出错?<br />
xwj 发表于 2007-11-8 15:28 | 显示全部楼层

呵呵,要学会灵活使用数组、指针

建议LZ自己去看书上的数组、指针那一节,然后自己慢慢想!<br />等你想通了的话,你编程的水平就可以突飞猛进一大截了!<br /><br /><br />呵呵,不是开玩笑的哦。
 楼主| action99 发表于 2007-11-8 16:34 | 显示全部楼层

好感謝高手的指點。小弟會努力學習。。。謝謝

  
赤铸 发表于 2007-11-8 23:06 | 显示全部楼层

display_0_l 是动态分配的也可以

这个问题的实质就是实现“二维数组”<br />为什么不直接定义个二维数组,然后整个动态分配?<br /><br />如果有其它限制,也可以动态分配每个display_0_l,display_1_l……,然后用指针数组,这实质上也是“二维数组”<br /><br />2楼的用了初始化,所以编译不通过。只能逐个赋值,初始化必须用常量<br />
dld2 发表于 2007-11-9 09:46 | 显示全部楼层

呵呵

我用ARM的编译器,拿静态变量的指针来初始化指针数组是可以的。<br />反正不能直接初始化,就在程序里初始化。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

189

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部