易码技术论坛

 找回密码
 加入易码
搜索
查看: 123799|回复: 7

这段程序哪出问题了?请高手帮忙回答

[复制链接]
发表于 2006-2-19 16:03:00 | 显示全部楼层
稍稍扫描了一下你的代码,没仔细看。

但至少这里是错误的:

你一开是声明:char textB[26];

但后面确用了:memset(textB,0,28);

这样会把tp,t也清零。


 楼主| 发表于 2006-2-19 16:51:00 | 显示全部楼层
#define LINE_LENTH 26

char text2[200]={"一个十七八岁青年正在窗外的院子里练习散打功夫,他看上去的年龄要比实际年龄大好几岁,因长期习武的关系,他的眼睛露出一种坚毅的光芒,又让人觉着他有无限的心事。"};

char text_out(addr text){
  char textY;
  char textB[LINE_LENTH];
  char tp,t,tpp;
  
  t=0;
  tpp=0;
  tp=0;
  
  ClearScreen();
  while (t<5){
   
    textB[tpp]=*(text+tp);
   
    if (*(text+tp)>=0xa1){//汉字
       tp=tp+2;
       tpp=tpp+2;
       textB[tpp-1]=*(text+tp+1);//添加另一半
       if (tpp==25){//满行
          textY=textY+11*t+2;
          TextOut(1,textY,textB,0x40);//显示当前字串
          tpp=0;
          t++;//行号
          memset(textB,0,LINE_LENTH);
          continue;
       }else if(tpp>25){//超出
          tp--;//指针退格
          textB[LINE_LENTH]=0;
          textY=textY+11*t+2;
          TextOut(1,textY,textB,0x40);//显示当前字串
          tpp=0;
          t++;//行号
          memset(textB,0,LINE_LENTH);
          continue;
       }
    }else {//字符
         if (tpp==25){//满行
            textY=textY+11*t+2;
            TextOut(1,textY,textB,0x40);//显示当前字串
            tpp=0;
            t++;//行号
            memset(textB,0,LINE_LENTH);
            continue;
         }else if (tpp<25){
              tp++;
              tpp++;
              continue;
          }
    }
   
    if ((*(text+tp)==13)&&(*(text+tp+1)==10)){//回车换行
       textY=textY+11*t+2;
       TextOut(1,textY,textB,0x40);//显示当前字串
      
       tpp=0;
       t++;//行号
       memset(textB,0,LINE_LENTH);
     }
      
  }
Refresh();
getchar();
}

void main(){

ClearScreen();
text_out(text2);
}

修改了一下,但我还是不明白为何它显示不出文本呢?
发表于 2006-2-19 18:30:00 | 显示全部楼层
汗,错误多多。。。

  1. #define LINE_LENTH 26

  2. char text2[200]={"一个十七八岁青年正在窗外的院子里练习散打功夫,他看上去的年龄要比实际年龄大好几岁,因长期习武的关系,他的眼睛露出一种坚毅的光芒,又让人觉着他有无限的心事。"};

  3. char text_out(addr text){
  4.   char textY;
  5.   char textB[LINE_LENTH+1];
  6.   char tp,t,tpp;
  7.   
  8.   t=0;
  9.   tpp=0;
  10.   tp=0;
  11.   textY=-12;
  12.   
  13.   ClearScreen();
  14.   while (t<6){
  15.    
  16.     if(!(textB[tpp]=*(text+tp))){
  17.         textY=textY+12;
  18.         TextOut(1,textY,textB,0x40);//显示当前字串  
  19.         break;
  20.     }
  21.    
  22.     if (*(text+tp)>=0xa1){//汉字
  23.        tp=tp+2;
  24.        tpp=tpp+2;
  25.        textB[tpp-1]=*(text+tp-1);//添加另一半
  26.        if (tpp==LINE_LENTH){//满行
  27.           textY=textY+12;
  28.           TextOut(1,textY,textB,0x40);//显示当前字串
  29.           tpp=0;
  30.           t++;//行号
  31.           memset(textB,0,LINE_LENTH+1);
  32.           continue;
  33.        }else if(tpp>LINE_LENTH){//超出
  34.           tp=tp-2;//指针退格
  35.           tpp=tpp-2;
  36.           textB[tpp]=0;
  37.           textY=textY+12;
  38.           TextOut(1,textY,textB,0x40);//显示当前字串
  39.           tpp=0;
  40.           t++;//行号
  41.           memset(textB,0,LINE_LENTH+1);
  42.           continue;
  43.        }
  44.     }else {//字符
  45.          tpp++;
  46.          tp++;
  47.          if (tpp==LINE_LENTH){//满行
  48.             textY=textY+12;
  49.             TextOut(1,textY,textB,0x40);//显示当前字串
  50.             tpp=0;
  51.             t++;//行号
  52.             memset(textB,0,LINE_LENTH+1);
  53.             continue;
  54.          }
  55.     }
  56.    
  57.     if ((*(text+tp)==13)&&(*(text+tp+1)==10)){//回车换行
  58.        textY=textY+12;
  59.        TextOut(1,textY,textB,0x40);//显示当前字串
  60.        tp=tp+2;
  61.        tpp=0;
  62.        t++;//行号
  63.        memset(textB,0,LINE_LENTH+1);
  64.      }
  65.       
  66.   }
  67. getchar();
  68. }

  69. void main(){

  70. ClearScreen();
  71. text_out(text2);
  72. }
复制代码

 楼主| 发表于 2006-2-19 21:49:00 | 显示全部楼层
首先感谢你帮我解决了问题.

但是我还不太明白,为何不见Refesh();而可以显示?难道这与memset有关吗?textB[LINE_LENTH+1];加1是为结束符准备的吗?

还有你认为这篇程序最大的问题是我对什么问题没搞明白?

不好意思,问题很多,但我真的很想请你帮帮我,我搞了好多天都解决不了
[em03][em03][em03]
发表于 2006-2-19 22:21:00 | 显示全部楼层
1.
TextOut
原型 void TextOut(int x,int y,addr string,int type);
功能 把字符串绘制到屏幕缓冲区
说明 在屏幕的(x,y)坐标处绘制字符串,string为字符串的地址
      type的bit7=1:大字体,bit7=0:小字体。
            bit6为1时直接在屏幕上绘图。
            bit3为1时字形取反。
            bit2-0: 1:copy 2:not 3r 4:and 5:xor



注意:

bit6为1时直接在屏幕上绘图,所以不用Refresh了

2。如果你想保存一个长LEN的字符串,一般要为它分配LEN+1的空间,因为还有一个结尾标记'\0'。

3。从代码看来楼主写的程序估计不多,对一些常见的错误不了解。对LAVAX的某些函数功能也不是很清楚。一句话,楼主还要多多练习。

   刚学编程时会很郁闷的,但是犯过一些错误之后水平自然会提高。
 楼主| 发表于 2006-2-20 08:11:00 | 显示全部楼层
多谢,真不好意思,麻烦你这么多,原来是基础问题[em06]
发表于 2006-3-17 00:44:00 | 显示全部楼层
哈,多谢了~我也没注意这个问题~

8174_36788_5355.rar

27 KB, 下载次数: 132

 楼主| 发表于 2006-2-19 12:13:11 | 显示全部楼层 |阅读模式
这段程序哪出问题了?请高手帮忙回答:

char text2[200]={"一个十七八岁青年正在窗外的院子里练习散打功夫,他看上去的年龄要比实际年龄大好几岁,因长期习武的关系,他的眼睛露出一种坚毅的光芒,又让人觉着他有无限的心事。"};

char text_out(addr text){
  char textY;
  char textB[26];
  char tp,t,tpp;
  
  t=0;
  tpp=0;
  tp=0;
  
  ClearScreen();
  while (t<4){
   
    textB[tpp]=*(text+tp);
   
    if (*(text+tp)>=0xa1){//汉字
       tp=tp+2;
       tpp=tpp+2;
       textB[tpp-1]=*(text+tp+1);//添加另一半
       if (tpp==25){//满行
          textY=textY+11*t+2;
          TextOut(1,textY,textB,0x40);//显示当前字串
          tpp=0;
          t++;//行号
          memset(textB,0,28);
          continue;
       }else if(tpp>25){//超出
          tp--;//指针退格
          textB[26]=0;
          textY=textY+11*t+2;
          TextOut(1,textY,textB,0x40);//显示当前字串
          tpp=0;
          t++;//行号
          memset(textB,0,28);
          continue;
       }
    }else {//字符
         if (tpp==25){//满行
            textY=textY+11*t+2;
            TextOut(1,textY,textB,0x40);//显示当前字串
            tpp=0;
            t++;//行号
            memset(textB,0,26);
            continue;
         }else if (tpp<25){
              tp++;
              tpp++;
              continue;
          }
    }
   
    if ((*(text+tp)==13)&&(*(text+tp+1)==10)){//回车换行
       textY=textY+11*t+2;
       TextOut(1,textY,textB,0x40);//显示当前字串
      
       tpp=0;
       t++;//行号
       memset(textB,0,28);
     }
      
  }
Refresh();
getchar();
}

void main(){

ClearScreen();
text_out(text2);
}
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-5-10 07:22 , Processed in 0.011021 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表