找回密码
 点一下
查看: 4265|回复: 20

吐槽,jass的坑爹之处

[复制链接]
发表于 2012-4-25 23:48:54 | 显示全部楼层 |阅读模式
..1. 不能隐式转换类型(如handle类转整数)
  2.函数不能传递数组
   3.数组有最大上限8192
      4.声明变量不赋值初值(比如
[jass]
local location p
call RemoveLocation(p)
.......
[/jass]
导致下面的代码毫无反应
  5.莫名奇妙的编译...我一个函数声明了,编译时提示没声明,再写一个相同的,又提示重复定义
发表于 2012-4-26 10:29:13 | 显示全部楼层
LZ不介意我反吐槽下吧……


首先作为魔兽地图语言,JASS足够强大了,完全不需要像正规高级语言那样支持很多内容,那样反而会不方便不会编程的人做图

1. 不做评论,不过个人觉得有没有都无所谓

2. JASS虽然是模仿C的语法,但是其数据类型却是类似python的做法,没有指针,所以没有关于指针的操作也很正常

3. 数组上限。。这个也很正常啊,防止不懂编程的一下子声明一万两万的数组,然后又有N多浪费;这个也是限制内存使用量的一种方式,反正对于魔兽来说,8192足够矣~

4. 这个在大部分语言里都是会出错的,只不过JASS的编译器不会检查这个部分而已,比如C/C++的编译器就会报错说这个变量没赋值

5. 个人没有遇到过类似的问题,JASS的编译器可能存在不完善的地方,但是现阶段的使用个人认为足够矣~
回复

使用道具 举报

 楼主| 发表于 2012-4-26 23:22:26 | 显示全部楼层

回 chyj4747 的帖子

chyj4747:LZ不介意我反吐槽下吧……

首先作为魔兽地图语言,JASS足够强大了,完全不需要像正规高级语言那样支持很多内容,那样反而会不方便不会编程的人做图

1. 不做评论,不过个人觉得有没有都无所谓
....... (2012-04-26 10:29) 
  其实我只是吐槽啊!!
回复

使用道具 举报

发表于 2012-5-24 10:18:02 | 显示全部楼层
声明必须放在使用的代码之前
回复

使用道具 举报

发表于 2012-5-26 09:48:32 | 显示全部楼层
..1. 不能隐式转换类型(如handle类转整数)
其实可以的
  2.函数不能传递数组
这个很正常 C#里可以吗?也 不是用指针传递.
   3.数组有最大上限8192
VJass 提供了一次超过8192上限的方法,比如
globals
integer arrary i[15000]
endglobals
      4.声明变量不赋值初值(比如
谬论啊...
你连函数都没有
回复

使用道具 举报

发表于 2012-5-26 10:14:31 | 显示全部楼层
楼上同学,1里写了是隐式哦,用各种方法转换出来的就不是隐式了
回复

使用道具 举报

 楼主| 发表于 2012-5-29 22:50:22 | 显示全部楼层

回 牵手再恤 的帖子

牵手再恤:..1. 不能隐式转换类型(如handle类转整数)
其实可以的
  2.函数不能传递数组
这个很正常 C#里可以吗?也 不是用指针传递.
   3.数组有最大上限8192
....... (2012-05-26 09:48)
    我来反吐槽
   尽管隐式转换可能带来某些问题,可你连这个都区分不了
    楼主难道是用C#吗?  .无能是C#还是C++,还是C,他们传递数组的办法都是传递的指针(数组名即一个指针变量),沙发也说了这个,你真懂?
   对于VJass的提供超过8192的方法,好吧,他是将数组大小/8192...用几个数组拼接,
   编译时换代码,换成函数提取...
  4.声明变量不赋值初值,你可能连我讲的什么意思都没听懂
  难道是要写成这样
[jass]
function Debug takes nothing returns nothing
local location p
call RemoveLocation(p)
endfunction
[/jass]
    那我就懒得说了 ....
     不会反吐槽就别吐 ...
  沙发吐槽是多么的正确  ....
回复

使用道具 举报

发表于 2012-5-30 11:45:14 | 显示全部楼层
1、本来玻璃渣就没开放handle,最开始的handle值完全是靠RB或UB转换的,没有隐式转换很正常吧。1.24后提供了一个转换函数,不过也是受限的,并非任何handle都可以转换

2、这个倒是个诟病,不过1.24后出现HashTable就实现了,直接传递一个HashTable然后根据存储格式解析即可,虽然麻烦点,但是终归实现了不是么

3、数组上限确实是为了考虑内存原因,毕竟WAR3发布的时候我们的配置才不过512内存,1.24的HashTable出现后,数组的问题就OK了

4、说实话我也没看懂呢,执行删除点后导致后面的脚本不能执行么?我不知道为什么要这么用,不管怎么说,变量赋初值不是正常的么?怎么说也是个好习惯吧。

5、WE的语法检查各种渣……另外经常出现RPBUG……
回复

使用道具 举报

 楼主| 发表于 2012-5-31 12:31:29 | 显示全部楼层

回 疯人¢衰人 的帖子

疯人¢衰人:
1、本来玻璃渣就没开放handle,最开始的handle值完全是靠RB或UB转换的,没有隐式转换很正常吧。1.24后提供了一个转换函数,不过也是受限的,并非任何handle都可以转换

2、这个倒是个诟病,不过1.24后出现HashTable就实现了,直接传递一个HashTable然后根据存储格式解析即可,虽然麻烦点,但是终归实现了不是么

3、数组上限确实是为了考虑内存原因,毕竟WAR3发布的时候我们的配置才不过512内存,1.24的HashTable出现后,数组的问题就OK了
.......
4.执行删除点后导致后面的脚本不能执行
  没错,就是这样
      有时候忘了赋给初值...
  结果测试时候毫无反应.......
  赋初值确实是个好习惯
2. 确实,我一直在用这种HashTable的方法在传递数据
1.这个按头目来说,是太危险了,给河蟹了,如同SC2的指针(貌似记得隐式会导致某些危险的东西)

  其实我一直都不太明白Handle是个什么东西,(句柄)..是这翻译吧,很多Jass教材中说这是指针,可明显不是

hanle.png 任务管理器中有个句柄计数,头目也做过一个句柄站位研究(比如漂浮文字是倒着数的)
   hanle到底是个什么东西了,是指针的面向对象结构?指针难得理解,搞个Hanle?
    jass的hangle操作跟指针实在很像...(以上是胡扯)
回复

使用道具 举报

发表于 2012-5-31 13:05:59 | 显示全部楼层
handle不是指针,只是很类似指针的东西
其实这玩意是简化Jass虚拟机存储表的。看LS的回复应该是比较熟悉数据结构吧。
其实我不熟悉正常编程语言的数据结构,所以也许表达的不恰当

整数、实数、布尔值这三种变量类型是整齐的,也就是在内存中的数据长度是固定的,这样这三种变量类型的存储表很容易处理
而String、code和Handle这三个变量类型不同,因为他们的存储实体的大小不同,所以这样的数据没法类似整数这样存储,所以采用了替代办法。因为handle本身是个整数,所以数据长度是固定的,比较好维护。
也就是handle。所以在1.24以前采用rb或者ub可以获得属于这三种类型的handle值

实质上比如单位unit这种变量,在读取时过程是变量-》handle-》unit这样过程的。当对变量赋值时,比如unit a、b直接的赋值a=b只是将b的handle值赋值给a。而对应的实体压根没有处理。

关于handle的排泄,则是判断引用数的,如果一个点的handle值为1(实质这个值是从2m开始的)如果没有变量引用它,(不光是我们的脚本,还包括WAR3本身的引用),这个handle值将会被释放,可以重新给另外的handle型变量使用。如果你压根没有remove这个点,那么这个点的实体,绝对无法释放掉内存了,因为你引用不到它。

handle的使用方式是类似栈的东西,释放的handle存储到另外的链表中,如果此链表为空,那么采用总计数+1作为新链表。
回复

使用道具 举报

 楼主| 发表于 2012-5-31 15:51:07 | 显示全部楼层

回 疯人¢衰人 的帖子

疯人¢衰人:handle不是指针,只是很类似指针的东西
其实这玩意是简化Jass虚拟机存储表的。看LS的回复应该是比较熟悉数据结构吧。
其实我不熟悉正常编程语言的数据结构,所以也许表达的不恰当

整数、实数、布尔值这三种变量类型是整齐的,也就是在内存中的数据长度是固定的,这样这三种变量类 .. (2012-05-31 13:05)
  数据结构也就那么几中
  队列和栈
   看过内存的分配办法
         应该是双向栈吧(猜的)
  ...只可惜在Jass中实现这些数据结构(我没试过)可能比较麻烦或者根本不行吧,我手上只有C语言和pascal语言的实现办法.....  
   原先没有hashtab时自己就想模拟这个,不过一般的数据结构可以用HashTable来模拟,不过那样舍本逐末了。
  HahTable自身这个结构很给力了,基本不要别的了
回复

使用道具 举报

发表于 2012-5-31 16:19:38 | 显示全部楼层
我倒是用过location做单向链表
效率各种低。

后来想采用排序handle值法,就是讲一个handle变量存入指定的handle值中
做了很多研究,后来发现控制起来十分麻烦,最终hashtable出现,就放弃了

不知道啥是双向栈
回复

使用道具 举报

 楼主| 发表于 2012-5-31 16:24:20 | 显示全部楼层

回 疯人¢衰人 的帖子

疯人¢衰人:我倒是用过location做单向链表
效率各种低。

后来想采用排序handle值法,就是讲一个handle变量存入指定的handle值中
做了很多研究,后来发现控制起来十分麻烦,最终hashtable出现,就放弃了
....... (2012-05-31 16:19)
  确实是HashTable拯救世界
   ...  话说jass能实现表达式求值吗?
回复

使用道具 举报

发表于 2012-5-31 16:34:04 | 显示全部楼层

回 lia77593 的帖子

lia77593:  确实是HashTable拯救世界
   ...  话说jass能实现表达式求值吗? (2012-05-31 16:24)
输入一个字符串,返回计算结果么?

逆波兰式写算法?做着玩没问题,实际上貌似没啥大用吧
1方面我不知道这个有什么意义,除非是弹幕图运算轨迹
2方面因为jass会有string泄露,于是高速重复执行可能导致卡图
回复

使用道具 举报

发表于 2012-5-31 22:01:53 | 显示全部楼层
算24点吧
回复

使用道具 举报

 楼主| 发表于 2012-5-31 23:03:06 | 显示全部楼层

回 疯人¢衰人 的帖子

疯人¢衰人:输入一个字符串,返回计算结果么?

逆波兰式写算法?做着玩没问题,实际上貌似没啥大用吧
1方面我不知道这个有什么意义,除非是弹幕图运算轨迹
....... (2012-05-31 16:34)
   ...确实就是输入一个字符串,返回计算结果
     ....好吧,卡图就算了,本来想做做玩玩的.....
回复

使用道具 举报

发表于 2012-6-1 06:54:59 | 显示全部楼层

回 lia77593 的帖子

lia77593:   ...确实就是输入一个字符串,返回计算结果
     ....好吧,卡图就算了,本来想做做玩玩的..... (2012-05-31 23:03)
非高速运算还是可以的,其实我原本打算用Galaxy写个求导的运算系统的,用来通过轨迹方程运算某一时刻弹幕的坐标。不过暂时还有等1.5的升级
回复

使用道具 举报

发表于 2012-6-1 09:30:35 | 显示全部楼层
LZ去综合区搜一下吧,夜星有做过加减乘除什么的~
回复

使用道具 举报

 楼主| 发表于 2012-6-1 13:47:29 | 显示全部楼层

回 chyj4747 的帖子

chyj4747:LZ去综合区搜一下吧,夜星有做过加减乘除什么的~ (2012-06-01 09:30)
做个24点游戏也不错
  随机给出4个数字,玩家给出答案,进行运算,是24得到某个奖励
     不过jass能运算出一个正确答案吗?在我那本信息学高级竞赛中算24点的运算那叫一个多啊
    不过我还是喜欢自己写,实在不行(或自己写好后)再看别人的吧
   先写一个逆波兰的,.....要堆栈(汗...)
回复

使用道具 举报

发表于 2012-6-1 21:13:36 | 显示全部楼层
模拟栈很简单……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-2 16:22 , Processed in 0.199348 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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