HSPではC言語と違う点が多々ある。
相違点1:計算精度について
C言語
2*1.1 = 2.2
intとdoubleの計算は、double型の計算結果となる。
HSP
2*1.1 = 2
このように、計算精度が落ちてしまうので、intとdoubleで計算したからといって、
double型に合わせてくれると思わない方が良い。
ただし、
1.1*2 = 2.2
となるので、おそらく最初の数字がintであるか、doubleであるかを判断しているものと思われる。
相違点2:loop+returnのスタック
C言語
for(;;){ if( a == 5 ): return }
上記の記述は、OK
HSP
repeat if( a == 5 ): return loop
上記の記述は、NG
スタックが積みあがってしまい、いずれオーバーフローを起こす。
(repeatが来たら、loopを通らずに抜けられるようなパスを作ってはいけない)
相違点3:存在しない機能について
C言語にあって、HSPにないもの
とりあえず、気がついたものだけ挙げておくと、
- 構造体
- 変数の動的確保(要するにmalloc)
構造体がないことに対する対処法
構造体は、HSPでは、配列で代用することが多い。
モジュール変数なんていうのもあるが、使い勝手がよくわからない。
mallocがないことに対する対処法
対処法はない。
HSPでは変数の動的確保は、隠蔽されてしまっている。
HSPでは、適当な文字列を書けば変数になってしまうので、mallocという概念がない。
これで何が困るかというと、HSPでポインタをいじろうと思ったときに困る。
struct LIST* p, *newcell; newcell = malloc( sizeof(struct LIST) );
みたいなことは、HSPではできない
(ちょっと理解しづらいかも、リスト構造のプログラムの移植などをやってみるとわかります)
相違点4:HSPでは、サブルーチンで受け取った文字列は読み取り専用
#module
#deffunc test str a
a = "sss" ; error 23 「変数名が指定されていません」
return
#global
sdim moji, 256
moji = "string"
test moji
testというサブルーチンの中で、引数でとった、文字列aを変更しようとするとエラー
相違点5:defineは #define globalとしないと、サブルーチンに適用されない
#define
#module
#deffunc
#ifdef DEBUG_
title "デバッグ" ; ←実行されない
#endif
return
#global
test
相違点6:文字列でも配列になっているものは arrayで引数にしないと駄目
#module
#deffunc
title aaa(1) ; error(4) システムエラーが発生しました
return
#global
sdim moji, 100, 3
moji(0) = "りんご"
moji(1) = "いちご"
moji(2) = "かぼちゃ"
test moji
相違点7.サブルーチンの後の定義は無効
#enum
#enum
#module
#deffunc
title ""+ DEF5 ; 0と表示されてしまう
return
#global
#enum
#enum
#enum
test
これが以外と厳しかったりする。
ファイルが増えてきて、#include をすると、
違うファイルにある定義が使えなくなったりする。