找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 913|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

16位有符號(hào)數(shù)據(jù)排序成功 16位無(wú)符號(hào)和32位長(zhǎng)整型數(shù)據(jù)排序不行?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:91150 發(fā)表于 2024-9-17 11:31 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
   網(wǎng)上抄來(lái)例程  16位有符號(hào)數(shù)據(jù) 快速排序 成功,而16位無(wú)符號(hào)和32位長(zhǎng)整型數(shù)據(jù)排序不能通過(guò)。
請(qǐng)各位指教,哪里沒(méi)有弄好,應(yīng)該怎么辦?  謝謝

單片機(jī)源程序如下:
  1. #include "STC32G.h"
  2. #include "stdio.h"
  3. #include "intrins.h"

  4. typedef     unsigned char      u8;
  5. typedef     unsigned int       u16;
  6. typedef     unsigned long int  u32;

  7. #define  SYSCLK    132710400UL/6  //13....M/6=22.1184M
  8. #define  BRT      (65536 - SYSCLK/4/19200)    //  


  9. bit busy;
  10. u8  i;
  11. int aaa[6]={8,2,3,1,7,0};
  12. int bbb[6];
  13. //int AQ[5] = {123,1,521,400,619};
  14. //int arry[12] = {123,1,501,8,2,400,3,1,7,0,400,319};
  15. int arry[12] = {123,1,31501,8,2,400,3,1,7,0,21400,319};
  16. //u8 arry[12] = {123,1,201,8,2,200,3,1,7,0,100,219};
  17. //u32 arry[12] = {123,1,95201,8,10000,200,3,1,7,0,100,109219};
  18. //u16 arry[12] = {123,1,25201,8,10000,200,3,1,7,0,100,9219};

  19. /*=======延時(shí)函數(shù)  大約1mS===========*/
  20. void  delay_ms(u16 ms)
  21. { u16 i;
  22.         do
  23.          {i = SYSCLK / 6000;   
  24.                 while(--i)        ;
  25.    }while(--ms);
  26. }



  27. /*****Uart1Init********************************/
  28. void Uart1Init(void)                //19200bps@22.1184MHz
  29. { SCON = 0x50;                //8位數(shù)據(jù),可變波特率
  30.         AUXR |= 0x01;                //串口1選擇定時(shí)器2為波特率發(fā)生器
  31.         AUXR |= 0x04;                //定時(shí)器時(shí)鐘1T模式
  32.         T2L = 0xE0;                        //設(shè)置定時(shí)初始值
  33.         T2H = 0xFE;                        //設(shè)置定時(shí)初始值
  34.         AUXR |= 0x10;                //定時(shí)器2開(kāi)始計(jì)時(shí)
  35.         ES=1;
  36.         EA=1;
  37. }
  38. /*=======發(fā)字節(jié) ===========        */
  39. void Uart1Send(u8 dat)
  40. {   while (busy);
  41.     busy = 1;
  42.     SBUF = dat;
  43. }
  44. /******************/
  45. #pragma FUNCTIONS (reentrant) //F1幫助里: C251 generates reentrant CODE
  46. //void quiksort(u16 a[],u16 low,u16 high)//reentrant
  47. //void quiksort(u8 a[],int low,int high)//reentrant
  48. //void quiksort(u32 a[],u32 low,u32 high)//reentrant
  49. void quiksort(int a[],int low,int high)//reentrant
  50. {   int i = low;
  51.     int j = high;  
  52.     int temp = a[i];
  53.     //u32 i = low;
  54.     //u32 j = high;  
  55.     //u32 temp = a[i];   
  56.     //u16 i = low;
  57.     //u16 j = high;  
  58.     //u16 temp = a[i];   
  59.           if( low < high)
  60.      {while(i < j)
  61.        {while((a[j] >= temp) && (i < j))
  62.          {j--;
  63.          }
  64.         a[i] = a[j];
  65.         while((a[i] <= temp) && (i < j))
  66.          {i++;    //Uart1Send(0x1A);
  67.          }  
  68.         a[j]= a[i];
  69.        }
  70.      a[i] = temp;
  71.      quiksort(a,low,i-1);
  72.      quiksort(a,j+1,high);
  73.     }
  74. }


  75. void main()
  76. {   WTST = 0x00;
  77.     P_SW2 = 0x80;
  78.     EAXFR = 1; //擴(kuò)展寄存器(XFR)訪問(wèn)使能
  79.     CKCON = 0; //提高訪問(wèn)XRAM速度
  80.     P0M0 = 0x00; P1M0 = 0x00; P2M0 = 0x00; P3M0 = 0x00;
  81.           P0M1 = 0x00; P1M1 = 0x00; P2M1 = 0x00; P3M1 = 0x00;
  82.           P4M0 = 0x01; P5M0 = 0x00; P6M0 = 0x00; P7M0 = 0x00;
  83.           P4M1 = 0x00; P5M1 = 0x00; P6M1 = 0x00; P7M1 = 0x00;
  84.         Uart1Init();  
  85.   Uart1Send(0x1A);Uart1Send(0x2A);Uart1Send(0x3A);Uart1Send(0x4A);
  86.   while (1)
  87.    {         delay_ms(550);
  88.                          Uart1Send(0xAA);Uart1Send(0xAA);
  89.     for(i=0;i<12;i++)
  90.     //{Uart1Send((u8)((int)(arry[i])>>8)); //
  91.                 // Uart1Send((u8)((int)(arry[i])   ));
  92.      {Uart1Send((u8)((u16)(arry[i])>>8)); //
  93.                   Uart1Send((u8)((u16)(arry[i])   ));
  94.    //{Uart1Send((u8)((u16)(arry[i])>>8)); //
  95.                 //{        Uart1Send((arry[i])   );
  96.     // {Uart1Send((u8)((arry[i])>>16)); //
  97.                 //  Uart1Send((u8)((arry[i])>>8 ));
  98.                 //  Uart1Send((u8)((arry[i])    ));
  99.      }
  100.                          Uart1Send(0xCC);Uart1Send(0xCC);//quiksort(arry,0,4);
  101.                 //----???----------------
  102.                 quiksort(arry,0,11);
  103.                 //----???----------------
  104.                          delay_ms(550);
  105.                          Uart1Send(0xBB);Uart1Send(0xBB);
  106.     for(i=0;i<12;i++)
  107.      //{Uart1Send((u8)((int)(arry[i])>>8)); //
  108.                         //Uart1Send((u8)((int)(arry[i])   ));
  109.                  {Uart1Send((u8)((u16)(arry[i])>>8)); //
  110.                         Uart1Send((u8)((u16)(arry[i])   ));
  111.      //{Uart1Send((u8)(u32)(arry[i])>>16)); //
  112.                  // Uart1Send((u8)(u32)(arry[i])>>8 ));
  113.                  // Uart1Send((u8)(u32)(arry[i])    ));
  114.                  }         
  115.   }
  116. }
  117. /******************************************* */
  118. void Uart1Isr() interrupt 4
  119. {  if (TI)               
  120.     {   TI = 0;         
  121.         busy = 0;
  122.     }
  123.    if (RI)
  124.     {RI = 0;

  125.     }
  126. }
復(fù)制代碼



pai_xu0求教.rar

1.57 KB, 下載次數(shù): 0

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:844772 發(fā)表于 2024-9-17 20:01 來(lái)自手機(jī) | 只看該作者
我在用手機(jī)看,32位排序每次都不能成功嗎?這是八位機(jī),你這種超過(guò)八位的運(yùn)算不要開(kāi)中斷
回復(fù)

使用道具 舉報(bào)

板凳
ID:744809 發(fā)表于 2024-9-18 09:09 | 只看該作者
你quiksort函數(shù)的入?yún)⒍际莍nt類(lèi)型的,51里面int類(lèi)型是16位有符號(hào)數(shù),范圍是-32768到32767;而16位無(wú)符號(hào)數(shù)是0-65535,32位無(wú)符號(hào)數(shù)就更大了,所以你排序肯定是失敗的。如果想排序16位無(wú)符號(hào)數(shù)可以把入?yún)㈩?lèi)型改為unsigned int,排序32位無(wú)符號(hào)數(shù)可以把入?yún)㈩?lèi)型改為u32
回復(fù)

使用道具 舉報(bào)

地板
ID:91150 發(fā)表于 2024-9-18 15:29 | 只看該作者
謝謝先生們指教。
在keil 5 C251下試驗(yàn)  對(duì)應(yīng)變量數(shù)據(jù)類(lèi)型在子函數(shù)里相同都是u16或
u32,排序不成功。程序文本寫(xiě)了不同類(lèi)型 屏蔽和去除屏蔽很方便
請(qǐng)?jiān)O(shè)置到u16或u32,試一下,看能否找到不成功的原因。
8位機(jī)應(yīng)該能處理16、32位數(shù)據(jù),int類(lèi)型(-32768~ +32767)就是16位
它就可以排序。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表