HSP関連ネタ/C言語とHSPの相違点

Last-modified: 2010-02-18 (木) 04:11:17

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にないもの

とりあえず、気がついたものだけ挙げておくと、

  1. 構造体
  2. 変数の動的確保(要するに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 をすると、
違うファイルにある定義が使えなくなったりする。