| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 709 人关注过本帖
标题:TURBOC 2.0 巨型动态数组佳例(兼“素数筛法”例)
只看楼主 加入收藏
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
结帖率:71.43%
收藏
 问题点数:0 回复次数:3 
TURBOC 2.0 巨型动态数组佳例(兼“素数筛法”例)
#include<stdio.h>
#include<alloc.h>
void main( )
{
      char huge* prime;
      unsigned long i,j,NUM;
      printf("远堆空闲字节数=%lu\n",farcoreleft());
      printf("动态数组字节数="); scanf("%lu",&NUM);
      if((prime=(char huge*)farmalloc(NUM+1))==NULL)
      {
          printf("远堆空闲内存不足...\n");
      }
      else
      {
          prime[0]=prime[1]=0;
          for(i=2;   i<=NUM;i++)prime[i]=1;
          for(i=2;i*i<=NUM;i++)if(prime[i])
          for(j=i+i;j<=NUM;j+=i)prime[j]=0;
          printf("%-8lu",2L);
          for(i=3;i<=NUM;i+=2)
          if(prime[i])printf("%-8lu",i);
          farfree((void far*)prime);
      }
}

建议使用下列编译连接命令处理上面的程序:
tcc -mc thisfile.c
因为这样做出来的程序,运行时给出的“远堆空闲字节数”是最多的。
我在某机器上的实战经验如下
编译模式   给出的“远堆空闲字节数”
-mc        594168
-ml        593864
-mh        593064
-mt        544536 (先转换成com文件再运行)
-ms        534360
-mm        534088
换句话说,compact模式下给出的堆自由空间最大、在midium模式下运行时给出的远堆自由空间最小。

还有一点必须交代清楚,就是TC 2.0似乎有个瑕疵:当你使用
tcc -mh filename.c
或者
tcc -ml filename.c
进行编译连接时,如果源程序中调用下列库函数
foreleft()、malloc()、free()
则编译连接器实际引用的是
farcoreleft()、malloc()、farfree()
注意当中那个,tcc竟然不知道应该去调用farmalloc(),而只是继续调用小模式下的那个“近堆”内存分配函数!这样一来,为了确保huge型动态数组创建成功,你就必须在代码中明确写出完整的函数名即farmalloc()--尽管按“理”说既不应该也不需要写出这种“终极的”函数名!
理想情况则应该是这样一个效果,即源代码中出现malloc()时,编译器应该根据用户所选择“模式”自动进行“匹配”:对于"-mh"、"-ml"自动调整为farmalloc()、对于"-mt"、"-ms"等自动调整为malloc()--实际相当于nearmalloc()。


搜索更多相关主题的帖子: TURBOC 动态 素数筛法 
2010-05-20 12:32
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
收藏
得分:0 
TC 2.0 里边的farcoreleft( )函数是用来测试“远堆”空闲字节数的,也就是返回可供程序动态申请的内存大小。因此,程序员如果自己能用c语言编写该函数的代码是有意义的。下面发布的就是这样一段代码:
unsigned long farcoreleft( void )
{   /*返回far heap中空闲字节数*/
    extern unsigned short _heaptop[2];
    extern unsigned short _brklvl[2];
    return 16L*(_heaptop[1]-_brklvl[1])+(_heaptop[0]-_brklvl[0]);
}
【注意】全局变量 _heaptop、_brklvl是在 c0s.obj(或c0h.obj等)中定义的。令人遗憾的是这个代码恐怕只能在Turboc中使用,因为其他的c语言编译器似乎“不承认”这样名字的全局变量哦!如果把上面的代码写成内嵌asm格式,则为
unsigned long farcoreleft( void )
{   /*返回far heap中空闲字节数*/
    extern unsigned short _heaptop[2];
    extern unsigned short _brklvl[2];
    asm push Ds              /*为兼容 -mh 即huge模式而设*/
    asm mov ax,SEG _heaptop  /*为兼容 -mh 即huge模式而设*/
    asm mov Ds,ax            /*为兼容 -mh 即huge模式而设*/
    asm mov ax,_heaptop[2]   /*其实是_heaptop[]的1号元素*/
    asm sub ax,_brklvl[2]    /*情况同上*/
    asm mov dx,16
    asm mul dx
    asm add ax,_heaptop[0]
    asm adc dx,0
    asm sub ax,_brklvl[0]
    asm sbb dx,0
    asm pop Ds               /*为兼容 -mh 即huge模式而设*/
}
2010-05-20 12:35
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
收藏
得分:0 
/*-----------------------------------
  申请远堆资源,建立巨型动态数组例子
  编译连接命令:tcc  -mc  thisfile.c
  所得空闲字节数较 -ms,-ml或-mh 略多
  特点:内嵌汇编代码使程序体积尽量小
-------------------------------------*/

unsigned long farcoreleft( void       );
void              farfree( void far * );
void far *   farmalloc( unsigned long );

asm .386

void printf(char msg[])
{
     asm mov bx,offset msg
     asm jmp exam
     disp:
     asm mov ah,2
     asm int 0x21
     asm cmp dl,10
     asm jnz next
     asm mov dl,13
     asm mov ah,2
     asm int 0x21
     next:
     asm inc bx
     exam:
     asm mov dl,[bx]
     asm and dl,dl
     asm jnz disp
}

void scanf(char *hint,unsigned long *dat)
{
     unsigned long far *pul=(unsigned long far *)dat;
     printf( hint );
     asm sub edx,edx
     again:
         asm mov ah,1
         asm int 0x21
         asm cmp al,13
         asm jz go_out
         asm sub al,'0'
         asm movzx ecx,al
         asm mov eax,10
         asm mul edx
         asm mov edx,eax
         asm add edx,ecx
         asm jmp again
     go_out:
     asm les bx,pul
     asm mov es:[bx],edx
     printf("\n");
}

char *ltoa(long value,char *str)
{    char *p=str;
     if(value>9)
       p=ltoa(value/10,p);/*递归*/
     *p=value%10+'0';
     return p+1;
}

char *Ltoa(long value)
{
     static char str[10];
     int k;
     for(k=0;k<8;k++)
     str[k]=' ';
     str[k]='\0';
     ltoa(value,str);
     return str;
}

unsigned long farcoreleft( void )
{   /*返回far heap中空闲字节数*/
    extern unsigned short _heaptop[2];
    extern unsigned short _brklvl[2];
    asm push DS              /*为兼容 -mh 即huge模式而设*/
    asm mov ax,SEG _heaptop  /*为兼容 -mh 即huge模式而设*/
    asm mov DS,ax            /*为兼容 -mh 即huge模式而设*/
    asm mov ax,_heaptop[2]   /*其实是_heaptop[]的1号元素*/
    asm sub ax,_brklvl[2]    /*情况同上*/
    asm mov dx,16
    asm mul dx
    asm add ax,_heaptop[0]
    asm adc dx,0
    asm sub ax,_brklvl[0]
    asm sbb dx,0
    asm pop DS               /*为兼容 -mh 即huge模式而设*/
}

void main( )
{    char huge* array;
     unsigned long i,j;
     unsigned long NUM=farcoreleft();
     printf("远堆空闲字节数=");printf(Ltoa(NUM));
     scanf("\n动态数组字节数=",&NUM);
     if(!(array=(char huge*)farmalloc(NUM+1)))
     {
         printf("远堆空闲内存不足...\n");
     }
     else /*申请成功、开始筛法*/
     {
         array[0]=array[1]=0;
         for(i=2;i<=NUM;i++)array[i]=1;
         for(i=2;i*i<=NUM;i++)
           if(array[i])
             for(j=i+i;j<=NUM;j+=i)
               array[j]=0;
         /*至此"筛"出了NUM以内的素数*/
         printf("2       ");
         for(i=3;i<=NUM;i+=2)
         {
            if(array[i])printf(Ltoa(i));
         }
         farfree((void far*)array);
     }
}


[ 本帖最后由 yu_hua 于 2010-5-20 13:17 编辑 ]
2010-05-20 13:10
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
收藏
得分:0 
//VC 6.0 巨型动态数组佳例(兼“素数筛法”例)
//可以轻松地产生100,000,000以内的素数表哦!
#include <stdio.h>
#include <malloc.h>
void main( )
{    char * prime;
     unsigned long i,j,NUM;
   //printf("远堆空闲字节数=%lu\n",coreleft());VC无此函数,作罢
     printf("动态数组的大小=");scanf("%lu",&NUM);
     if(!(prime=(char *)malloc(NUM+1)))
     {
         printf("远堆空闲内存不足...\n");
     }
     else
     { //数组已创建、开始“筛”素数
         for(i=2;  i<=NUM;i++)prime[i]=1;
         for(i=2;i*i<=NUM;i++)if(prime[i])
         for(j=i+i;j<=NUM;j+=i)prime[j]=0;
         if(NUM>1)printf("%lu以内的素数表\n%-8lu",NUM,2L);
         for(i=3;i<=NUM;i++,i++)
         if(prime[i])printf("%-8lu",i);
         printf("\n");
         free(prime);
     }
}
2010-05-23 10:30
快速回复:TURBOC 2.0 巨型动态数组佳例(兼“素数筛法”例)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.081836 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved