標題:
16位有符號數(shù)據(jù)排序成功 16位無符號和32位長整型數(shù)據(jù)排序不行?
[打印本頁]
作者:
wjhhhhh
時間:
2024-9-17 11:31
標題:
16位有符號數(shù)據(jù)排序成功 16位無符號和32位長整型數(shù)據(jù)排序不行?
網(wǎng)上抄來例程 16位有符號數(shù)據(jù) 快速排序 成功,而16位無符號和32位長整型數(shù)據(jù)排序不能通過。
請各位指教,哪里沒有弄好,應該怎么辦? 謝謝
單片機源程序如下:
#include "STC32G.h"
#include "stdio.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long int u32;
#define SYSCLK 132710400UL/6 //13....M/6=22.1184M
#define BRT (65536 - SYSCLK/4/19200) //
bit busy;
u8 i;
int aaa[6]={8,2,3,1,7,0};
int bbb[6];
//int AQ[5] = {123,1,521,400,619};
//int arry[12] = {123,1,501,8,2,400,3,1,7,0,400,319};
int arry[12] = {123,1,31501,8,2,400,3,1,7,0,21400,319};
//u8 arry[12] = {123,1,201,8,2,200,3,1,7,0,100,219};
//u32 arry[12] = {123,1,95201,8,10000,200,3,1,7,0,100,109219};
//u16 arry[12] = {123,1,25201,8,10000,200,3,1,7,0,100,9219};
/*=======延時函數(shù) 大約1mS===========*/
void delay_ms(u16 ms)
{ u16 i;
do
{i = SYSCLK / 6000;
while(--i) ;
}while(--ms);
}
/*****Uart1Init********************************/
void Uart1Init(void) //19200bps@22.1184MHz
{ SCON = 0x50; //8位數(shù)據(jù),可變波特率
AUXR |= 0x01; //串口1選擇定時器2為波特率發(fā)生器
AUXR |= 0x04; //定時器時鐘1T模式
T2L = 0xE0; //設置定時初始值
T2H = 0xFE; //設置定時初始值
AUXR |= 0x10; //定時器2開始計時
ES=1;
EA=1;
}
/*=======發(fā)字節(jié) =========== */
void Uart1Send(u8 dat)
{ while (busy);
busy = 1;
SBUF = dat;
}
/******************/
#pragma FUNCTIONS (reentrant) //F1幫助里: C251 generates reentrant CODE
//void quiksort(u16 a[],u16 low,u16 high)//reentrant
//void quiksort(u8 a[],int low,int high)//reentrant
//void quiksort(u32 a[],u32 low,u32 high)//reentrant
void quiksort(int a[],int low,int high)//reentrant
{ int i = low;
int j = high;
int temp = a[i];
//u32 i = low;
//u32 j = high;
//u32 temp = a[i];
//u16 i = low;
//u16 j = high;
//u16 temp = a[i];
if( low < high)
{while(i < j)
{while((a[j] >= temp) && (i < j))
{j--;
}
a[i] = a[j];
while((a[i] <= temp) && (i < j))
{i++; //Uart1Send(0x1A);
}
a[j]= a[i];
}
a[i] = temp;
quiksort(a,low,i-1);
quiksort(a,j+1,high);
}
}
void main()
{ WTST = 0x00;
P_SW2 = 0x80;
EAXFR = 1; //擴展寄存器(XFR)訪問使能
CKCON = 0; //提高訪問XRAM速度
P0M0 = 0x00; P1M0 = 0x00; P2M0 = 0x00; P3M0 = 0x00;
P0M1 = 0x00; P1M1 = 0x00; P2M1 = 0x00; P3M1 = 0x00;
P4M0 = 0x01; P5M0 = 0x00; P6M0 = 0x00; P7M0 = 0x00;
P4M1 = 0x00; P5M1 = 0x00; P6M1 = 0x00; P7M1 = 0x00;
Uart1Init();
Uart1Send(0x1A);Uart1Send(0x2A);Uart1Send(0x3A);Uart1Send(0x4A);
while (1)
{ delay_ms(550);
Uart1Send(0xAA);Uart1Send(0xAA);
for(i=0;i<12;i++)
//{Uart1Send((u8)((int)(arry[i])>>8)); //
// Uart1Send((u8)((int)(arry[i]) ));
{Uart1Send((u8)((u16)(arry[i])>>8)); //
Uart1Send((u8)((u16)(arry[i]) ));
//{Uart1Send((u8)((u16)(arry[i])>>8)); //
//{ Uart1Send((arry[i]) );
// {Uart1Send((u8)((arry[i])>>16)); //
// Uart1Send((u8)((arry[i])>>8 ));
// Uart1Send((u8)((arry[i]) ));
}
Uart1Send(0xCC);Uart1Send(0xCC);//quiksort(arry,0,4);
//----???----------------
quiksort(arry,0,11);
//----???----------------
delay_ms(550);
Uart1Send(0xBB);Uart1Send(0xBB);
for(i=0;i<12;i++)
//{Uart1Send((u8)((int)(arry[i])>>8)); //
//Uart1Send((u8)((int)(arry[i]) ));
{Uart1Send((u8)((u16)(arry[i])>>8)); //
Uart1Send((u8)((u16)(arry[i]) ));
//{Uart1Send((u8)(u32)(arry[i])>>16)); //
// Uart1Send((u8)(u32)(arry[i])>>8 ));
// Uart1Send((u8)(u32)(arry[i]) ));
}
}
}
/******************************************* */
void Uart1Isr() interrupt 4
{ if (TI)
{ TI = 0;
busy = 0;
}
if (RI)
{RI = 0;
}
}
復制代碼
pai_xu0求教.rar
2024-9-17 11:31 上傳
點擊文件名下載附件
1.57 KB, 下載次數(shù): 0
作者:
glinfei
時間:
2024-9-17 20:01
我在用手機看,32位排序每次都不能成功嗎?這是八位機,你這種超過八位的運算不要開中斷
作者:
123156fsadf
時間:
2024-9-18 09:09
你quiksort函數(shù)的入?yún)⒍际莍nt類型的,51里面int類型是16位有符號數(shù),范圍是-32768到32767;而16位無符號數(shù)是0-65535,32位無符號數(shù)就更大了,所以你排序肯定是失敗的。如果想排序16位無符號數(shù)可以把入?yún)㈩愋透臑閡nsigned int,排序32位無符號數(shù)可以把入?yún)㈩愋透臑閡32
作者:
wjhhhhh
時間:
2024-9-18 15:29
謝謝先生們指教。
在keil 5 C251下試驗 對應變量數(shù)據(jù)類型在子函數(shù)里相同都是u16或
u32,排序不成功。程序文本寫了不同類型 屏蔽和去除屏蔽很方便
請設置到u16或u32,試一下,看能否找到不成功的原因。
8位機應該能處理16、32位數(shù)據(jù),int類型(-32768~ +32767)就是16位
它就可以排序。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1