HSPで擬似構造体

HSPというのは小規模なソフトを作るときに非常に使いやすいんですが、それ以上になってくるとソースがごちゃごちゃになってきますよね。いや、ソースの書き方が汚いだけかもしれませんが。
構造体が使えればソースがスッキリしそうですね。
早速見て行きましょう。


宣言するときはこちら。

#define volume 0
#define expression 1
dim midi,2

参照するときはこちら。

mes "volume : " + midi.volume
mes "expression : " + midi.expression

HSPには、配列を参照する方法が2つあります。

dim n,2,2
mes n(0,1)
mes n.0.1

2行目の n(0,1) はHSP3で追加された配列参照の方法です。
3行目の n.0.1 はHSP2からある方法です。
今回の擬似構造体では3行目の配列参照の方法を使っています。


例えば。

dim n,2
mes n.0

この場合で言えば、0の部分を定数に置き換えてしまえばいいわけです。

#define first 0
#define second 1
dim n,2
mes n.first

構造体っぽいですか?っぽいですね。「っぽい」っていうのは見た目に関わってくるので割と大事。

これをC言語で書くとこうなります。

struct{
    int first;
    int second;
}n;

わお簡潔。名前に意味はありません。

2次元配列でも同じことをすればいいわけです。


もう1つ例をあげると、時間の情報を格納する変数もこれを使えばスッキリまとまります。
こんな感じ。

#define sec 0
#define min 1
#define hour 2
dim time,3
mes time.hour + "時" + time.min + "分" + time.sec + "秒"

お好みで年月日も追加できます。



お疲れ様でした。

C言語のHelloWorldについて

よく入門サイトで見かけるHelloWorldはこれ。

#include <stdio.h>
int main(){
    printf("HelloWorld");
    return 0;
}

でもこれ、実行したらウィンドウが開いて一瞬で閉じられてしまうんですよ。
初心者の私はここでつまずきました。(諦めそうになりました)
そこでこれを入れましょう。

getchar();

このgetcharという関数はstdio.hで定義されているのでまた新しいファイルをインクルードする必要はありません。楽チン。
最終的にソースはこんなカタチになるんですね。

#include <stdio.h>
int main(){
    printf("HelloWorld");
    getchar();
    return 0;
}

これを実行するとウィンドウが開いて HelloWorld が表示されます。さっきと違うのはここでウィンドウが閉じられないところです。キーボードのボタン(どれでもいい)を押すと return 0 が実行されウィンドウが閉じられます( = プログラムを終了する)。

getchar という関数はその場でプログラムの進行を止めてくれる便利な関数です。と言うと簡単なんですが、本当は違います。getchar はキーボードのボタンが押されるまでプログラムの実行を止め、押されたならばそのキーボードの値を返すという2つの役割を持つ関数です。ここではプログラムの進行を止めるためだけに使っています。

C言語 入門」で検索をかけて出てきたサイトのソースで、printf(~) で計算結果を表示させて、直後に return文が書かれている、というのをよく見かけます。よく見かけるというか getchar 挟んでいるのを私は見たことがないです。
Visual Studio Express 2012 を私は使っていますが、何でしょうか、環境によって return文の前で止まったりするんですかね?よくわかりません。

[追記]

デバッグなしで開始」がありました。こうすることで「続行するには何かキーを押してください . . . 」が末尾に挿入されてキーボード入力待ちになるんですね。getchar いらず。
でもF5キーを押してパッと実行させたいのでやはり getchar は有効ではないかと思います。Releaseビルドで特に有効ですね。

HSPでClearTypeの実験

HSPで画像を3分の1(辺)に縮小するスクリプトを組みました。
それだけではつまらないのでClearTypeと同じ仕組みで縮小するサンプルを作りました。ClearTypeとはWindowsのフォントの描画で使われている技術です。ClearTypeについて詳しいのはこのサイト→ http://www.atmarkit.co.jp/fpc/xp_feature/cleartype/cleartype.html

それではスクリプトです。

screen 0
dialog "",16
if stat==0:dialog "キャンセルされました":end
picload refstr
sw=ginfo(12)
sh=ginfo(13)
title "Orginal Image size: "+sw+","+sh

buffer 1,3,3

screen 2,sw/3,sh/3
title "Default"
redraw 0
repeat sh/3
	cnt1=cnt
	repeat sw/3
		cnt2=cnt
		gsel 1
		gcopy 0,cnt2*3,cnt1*3,3,3
		clr=0
		repeat 9
			pget cnt\3,cnt/3
			clr+=(ginfo_r+ginfo_g+ginfo_b)/3
		loop
		gsel 2
		color clr/9,clr/9,clr/9
		pset cnt2,cnt1
	loop
loop
redraw 1

screen 3,sw/3,sh/3
title "ClearType"
redraw 0
repeat sh/3
	cnt1=cnt
	repeat sw/3
		cnt2=cnt
		gsel 1
		gcopy 0,cnt2*3,cnt1*3,3,3
		dim clr,3
		repeat 3
			cnt3=cnt
			repeat 3
				pget cnt3,cnt
				clr.cnt3+=(ginfo_r+ginfo_g+ginfo_b)/3
			loop
		loop
		gsel 3
		color clr.0/3,clr.1/3,clr.2/3
		;color clr.2/3,clr.1/3,clr.0/3//←きれいに表示されないときはこちらのコメントアウトを外して真上の行をコメントアウトする
		pset cnt2,cnt1
	loop
loop
redraw 1

スクリプトが開始されたときに、まずファイルオープンのダイアログが出ますのでお好きな画像を選択してください。
選択されるとすぐに縮小が開始されます。
縮小作業は画像サイズが大きいほど時間がかかります。CPU依存なので縮小なのでCPUをそれなりに食います。

スクリーン0は元画像表示用のウィンドウ、バッファー1は作業用バッファ、スクリーン2は標準の方法での縮小の表示用ウィンドウ、スクリーン3はClearTypeでの縮小の表示用ウィンドウです。

使う画像によってClearTypeの効果が出たり出なかったりします。どういった画像でよく効果が出るのかというのを考えてみるのもいいかもしれません。

雑談でも

DSiの手書き入力からこんにちは。
今この時点で手書き入力をやめてます。誤認識多すぎ…

雑談をこのブログに取り入れてみました。3日坊主になるかもしれませんが…。

とりあえずよろしくお願いします。