春招最后去了个制造业的小公司,被派去写发那科机器人的通信程序,要用到karel语言,看了一周多手册和资料,自己总结了以下几点:
Karel与C的区别
数组索引从1开始而不是从0开始, FOR s TO e的遍历区间是[s,e]而不是[s,e), 注意
不能操作变量地址,也不能隐式转换,因此在面临一些类型转换的情况很不灵活,虽然Karel本身有一些自带的例程比如CNV_STR_INT,CHR,ORD这些,但是有一些特殊情况,像字节串转换成数字之类的情况, 还是有必要自制函数。
ROUTINE的参数列表,每个参数是以;
区分的,而不是,
区分的,别被坑了。
相同类型的参数可以用,
写在一起,比如
ROUTINE func(x1,x2,y1,y2 : INTEGER)
不存在重载和重写,函数名确定下来了就是唯一的ID,不可重复实现,和C一样
数据类型对比:STRING - const char*, INTEGER - int, BYTE - char, REAL - float, STRUCTURE - struct, Karel还有一些独有类型比如VECTOR,XYZWPR, POS等
Karel的STRING是只读的,可以拼接扩展(类似C的strcat,推测本质是另开辟更大的内存用于存放新拼接的字符,并重定向到那块内存), 有SUB_STR, STR_LEN等内置函数,没法下标索引取字节, 更没法通过下标赋值,但却是Karel的基本类型之一,可以直接=
赋值 / READ / WRITE
各数据类型的转换总结:
BYTE,INTEGER和REAL:
INTEGER(范围局限在0-255内) 可直接赋值给 BYTE
BYTE 可直接赋值给 INTEGER, REAL
BYTE和STRING:
BYTE ---CHR---> STRING
STRING --ORD---> BYTE
STRING和INTEGER:
STRING单个字符转换成INTEGER可用ORD的方法
STRING整体转化成INTEGER用CNV_STR_INT,注意实现类似于C++的stoi而不是隐式转换,如果STRING存在非法值如无法打印的字符是无法转换INTEGER的(返回UNINIT),因此幻想用它将HEX串转成数字就算了,必须自行实现
INTEGER可通过CHR转换成对应的ASCII字符
INTEGER也可通过CNV_INT_STR转换成对应的字符串,类似C++ to_string方法
IO对比:都有文件读写(FILE类型对FILE指针)和终端读写(TPDISPLAY和stdout)的形式,Karel的READ 还可以直接括号变量从外界输入取值,起到Python中input
的作用
FROM是个有用的东西,利用FROM可以实现头文件和模块化的编程,注意你要程序FROM引用的模块要确保已经编成pc程序放入示教器中了。
Karel没有自己的自动化构建工具,但是也可以用C的makefile实现统一构建打包(把编好的各pc程序放在一个文件夹),配合ftp脚本把构建好的包内pc程序一次性加载到示教器上,再也不用到roboguide上一个个构建了,美滋滋!
关于怎么搞自动化构建,可参考github的这位大佬:https://github.com/onerobotics/strings
Karel的调试方法包括:
Karel的循环方式:REPEAT-UNTIL, FOR-TO-DO-ENDFOR, WHILE-ENDWHILE,在Karel中没有continue和break这样的语句来实现循环内的条件控制,只能用GOTO这样的方法代劳(很古老吧,不过现代语言的continue和break本质上也是GOTO)
Karel学习最有力的三大工具:手册, github, 交接资料上的相关视频及衍生群组(如飘雨阁i)
Keep Learning!