/*结构体定义*/
struct file{
UINT8 name[8];//文件名
UINT8 touch[4];//文件扩展名
UINT32 cluster;//mp3首簇
//UINT32 sector;//当前扇区
UINT32 next_cluster;//下一簇
UINT32 next_song;//下一首歌首簇
UINT32 pre_song; //上一首歌首簇
UINT32 num_sector;//记录值:记录当前播放歌曲位于root表第几个会扇区
UINT16 cluster_i;//记录值,记录下首歌开始簇应该查询的开始数组的值
struct file *next;//链表指针,指向下一个
};
/*其他变量已定义*/
struct file data *head; //链表头
struct file data *p1,*p2;//链表中间变量
/*链表程序*/
while(文件有效){
if(first_song==0){//若没有获取第一首歌,则开始获取
p1=p2=(struct file *) malloc(LEN);/*开辟一个新单元*/
/*获得mp3首簇*/
head->pre_song=songfile->cluster=cluseter(buff[(songfile->cluster_i<<5)+0x15],buff[(songfile->cluster_i<<5)+0x14],buff[(songfile->cluster_i<<5)+0x1b],buff[(songfile->cluster_i<<5)+0x1a] );
/*若没有获取第一首歌曲,则,将头链的下首歌以及当前歌的首簇赋值
此段属性赋值暂且不管*/
p1->cluster=p1->next_song=head->cluster;
p1=p2=head;
//UART_Put_Num(head->cluster);
//UART_Send_Enter();
first_song=1;
}//end if
else {
p2->next=p1;
p2=p1;
p1=(struct file *) malloc(LEN);
p1->pre_song=p2->cluster;//P2的当前首为P1的上一首
p1->cluster=cluseter(buff[(songfile->cluster_i<<5)+0x15],buff[(songfile->cluster_i<<5)+0x14],buff[(songfile->cluster_i<<5)+0x1b],buff[(songfile->cluster_i<<5)+0x1a] );/*歌曲信息赋值*/
p2->next_song=p1->cluster; /*P2的下一首为P1的当前首*/
UART_Put_Num((head->cluster);/*问题1:按道理此语句显示为固定一个值,可结果却依次所有有效MP3的首簇,如获取的MP3首簇依次为:3,298,1481,1588,2150
设计实现head->cluster=3,
head->next->cluster=298
........一次类推
可此句显示为 3,298,1481,1588,2150 就想head在跟着变动一样*/
}//end else
}//end while
p2->next=nul;/*文件无效,链表结束*/
return head;
/*此链表段结束*/
/*显示程序段*/
struct file *p;
p=head;/*通过上面一段程序返回head值*/
do{
UART_Put_Num((p->cluster);
p=p->next;
}
while(p->next!=nul);
/*问题2:串口显示结果为:
3
2150
*/
怎么会这样?应该显示的是 3 298 1481 1588 2150 才对啊
这个51动态分配 好像是不支持,
但是我这样写了程序,又能访问到 ,证明应该是可以的
只是问题有2:
1:使用xdata区,访问的数据都是最大值,且赋值无效
2: 使用data区, 能访问赋值也正常,但是, 动态链表只能访问2个,一个是首 一个尾, 中间直接被断开了,即访问无效了
3:51好像没有系统,听说也无法分配动态内存,但为什么建立动态链表也可以访问部分了
51单片机 假如动态链表,为什么要为data,而不能为xdata,而且只能访问...
,xdata*外部数据区,链表当然要用外部数据区,内部数据只有256字节而且堆栈和寄存器也占用内部数据区,再来点全局变量,内部的数据区很快就用完了,你居然要在那里建链表,那怎么行呢!C51应该有动态分配的,因为动态分配是编译器(库代码)玩的把戏,另外P1和P2是51的寄存器,最好不要给变量起这样的名字!...