易码技术论坛

 找回密码
 加入易码
搜索
楼主: yan

[工具] 编译器Y2.26最终版 08/5/10更新

[复制链接]
发表于 2007-8-28 23:32:53 | 显示全部楼层
为什么不加入对(int *)(long *)的支持呢?
 楼主| 发表于 2007-8-28 23:34:36 | 显示全部楼层
这种语法需要大量修改编译器,还是不要了,修改了造成其他bug就不好了。
 楼主| 发表于 2007-8-29 10:42:03 | 显示全部楼层
众所周知,LavaX中的变量是从0x2000开始定义变量的(最开始定义的那个变量的地址是0x2000),而位置相邻的变量的地址是连续的,最后才是LavaX程序运行栈(函数调用生成的堆栈),除了运行栈以外,其他都是在编译阶段分配好的,也就是说全局变量的地址是永远不会改变的。那么链接库是怎么插入到你的源程序当中呢?要知道链接库是已经编译过的代码,而它也是从0x2000开始定义变量的,位置相邻的变量的地址是连续的。如果直接插入到源程序中就会造成地址冲突,因为链接库和源程序共用了同一段内存,所以程序就长生了错误。如何解决这个错误?为了避免地址冲突,就需要在链接的时候对链接库的变量进行地址偏移,让它移到源程序所有变量之后不久行了?对,编译器在处理链接库的时候就是这样把链接库插入到你的源程序中的。但是链接库毕竟是编译过的代码而不是源程序,不能直接看出哪个是全局变量,哪个是局部变量。怎么分清全局变量是个问题。虽然大部分的代码是容易辨认的,但是有一点确是分不清的:LavaX语言是无类型语言,地址和数字在语法上是一样的,所以在制作链接库的时候一定要注意这一点!什么样的变量会被当成数字看待呢?数组会被当成数字看,比如:char a[10];printf("%d",a);这里的a的值是a的地址,编译器是把它当作数字看的,在制作链接库的时候可以把它写成&a[i=0](i是临时变量)。还有对全局变量取地址时也是当成数字看的,比如:char a;&a;应该避免这种写法。其余,在增加了若干编译命令后:#start,#skip,#unstart,#loaddata,这些都跟地址有关系的,所以链接库对偏移地址范围做了限制,只偏移0x2000~0x7000以内的变量,所有如果用以上几个编译命令定义变量时如果超出0x2000~0x7000就进行地址偏移了。
发表于 2007-8-29 13:54:52 | 显示全部楼层
星端编译器,不需要太全面,能满足普通需求就行
觉得现在已经很不错了。最大的诟病就是速度问题,但这是机能所限,能提升的空间太小了
 楼主| 发表于 2007-8-29 15:29:51 | 显示全部楼层
说得也是啊。
发表于 2007-8-29 18:20:44 | 显示全部楼层
来到EM,来到星界
我会了很多东西,也失去了很多东西
---------------------------
YAN 辛苦了
发表于 2007-8-30 20:15:37 | 显示全部楼层
119页了哈,太好了,顶
发表于 2007-9-5 17:09:40 | 显示全部楼层
希望yan能快点出新的gray.y
椭圆函数急用哦~~
发表于 2007-9-5 17:18:51 | 显示全部楼层
是啊,急救!
 楼主| 发表于 2007-9-5 18:23:32 | 显示全部楼层
就业忙啊,恐怕没时间了。
发表于 2007-9-5 18:28:24 | 显示全部楼层
我也就业着呢...
发表于 2007-9-5 21:03:12 | 显示全部楼层
不会吧.....
发表于 2007-9-5 21:26:25 | 显示全部楼层
都已经作了..
发表于 2007-9-7 18:36:02 | 显示全部楼层
第一种写法:
void main()
{
  static char  s[]="yan is great";
  printf("%s",s);
  getchar();
}

第二种写法:
void main()
{
  char  *s="yan is great";
  printf("%s",s);
  getchar();
}
两种都可以通过编译,但只有第一种正确,第二种显示一个名片中的电话图形,第二种应该怎么写才能正常运行呢?
 楼主| 发表于 2007-9-7 23:06:39 | 显示全部楼层
LavaX是无类型语言,没有指针。。。。
发表于 2007-9-8 10:40:13 | 显示全部楼层
#include<stdio.y>

void main()
{
  struct stu
  {
   int num;
   char name[20];
   char sex;
   int score;
  }boy1,boy2;
  boy1.num=102;
  gets(boy1.name);
  scanf("input sex:","%c",&boy1.sex);
  scanf("input score:","%d",&boy1.score);
  boy2=boy1;
  printf("Number=%d\nName=%s\n",boy2.num,boy2.name);
  printf("Sex=%c\nScore=%d\n",boy2.sex,boy2.score);
  getchar();
}

为什么以上代码编译后不能正常运行,运行结果为:
Number:8192
Name:
Sex:
Score:0
 楼主| 发表于 2007-9-8 15:25:51 | 显示全部楼层
boy2=boy1;有问题,但是编译器没有这种语法检查。
结构体之间传递数据不能这样简单的赋值,这是不允许的。
正确的语法是:memcpy(boy2,boy1,sizeof(boy1));
发表于 2007-9-8 15:39:46 | 显示全部楼层
了解。
发表于 2007-9-8 21:59:32 | 显示全部楼层
牛啊。。。
不知道现在这个版本带不带编辑器
 楼主| 发表于 2007-9-8 22:03:38 | 显示全部楼层
带。
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

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

GMT+8, 2025-5-14 06:19 , Processed in 0.013984 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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