変数とは、よく箱のようなものと例えられており、変数を利用すると数値や文字といった値を格納することができます。
変数型名 | 値/参照 | 具体例 | 説明 | 備考 |
int | 値型 | 5 | -2^(63)~2^(63)-1の範囲の整数が扱える | オーバーフローすると例外が発生する |
float | 値型 | 3.14 | 浮動小数点型。±10^(-308)~±10^(308)で有効桁数15桁の巨大な小数が扱える | Kuinにdoubleは存在しない |
char | 値型 | 'K' | 文字型。1文字が格納できる。 | 文字列を扱いたいときは、charの配列「[]char」を用いる |
bool | 値型 | true | 論理型。falseかtrueのどちらかの値をとる。 | 真偽値を意味し、falseは偽、trueは真を表す |
enum | 値型 | 列挙型。いくつか定義された中からいずれかの値をとる。 | 詳しくはenumを参照 | |
byte | 値型 | ビット演算やオーバーフローを駆使する場合に用いる整数型 | ||
[](array) | 参照型 | [9,1,7]int "kuina" |
動的配列。値が複数連なったものを表す。 Kuinでは、文字列はcharの配列([]char)として扱う |
O(1)でアクセス出来る素敵データ構造 |
テンプレ | 値型or参照型 | ○○ | ここに説明が入る | 特記事項があればここに |
整数の値を扱える変数型です。
扱える範囲は-2^(63)~2^(63)-1です。かなり大きい数字も扱えるので、普段は上限や下限を意識する必要はありません。
int型の値の絶対値を返します
- func Main()
- var a : int :: -1
- end func
int型変数を文字列に変換します
フォーマットを指定してint型変数を文字に変換します
フォーマットの形式は、ほとんどC言語のprintfと一緒なので、C言語のprintfの仕様を確認してほしい(Wikipedia様はこちらから)
- func Main()
- var kuina : int :: 2#100100010111 {2進数で値を代入する}
- end func
浮動小数の値を扱える変数型です。
扱える範囲は±10^(-308)~±10^(308)です。(有効桁数は15桁)
かなり大きい数字も扱えるので、普段は上限や下限を意識する必要はありません。
float型の値の絶対値を返します
- func Main()
- var a : float :: -1.79
- end func
float型変数を文字列に変換します
フォーマットを指定してfloat型変数を文字に変換します
フォーマットの形式は、ほとんどC言語のprintfと一緒なので、C言語のprintfの仕様を確認してほしい(Wikipedia様はこちらから)
文字型。1文字が格納できる変数です。
この項ではあくまで1文字の変数として紹介します。文字列は[]へ。
なお、int型にキャストすることで、文字コードを得ることが出来る。[要出典]だが、どうせUTF-16LEでしょう(
- func Main()
- var a : char :: 'k' {ダブルクォーテーションマークではないので注意}
- var b : char :: 'く' {全角文字も気にせず入れられる。}
-
-
- end func
char型変数を文字列に変換します
論理型。falseかtrueのどちらかの値をとる。
C言語などでは0は偽、0以外は真となりますが、Kuinで同様のことをするには、bool型に明示的にキャストする必要があります。
文字や文字列は、それ自体をboolにキャストすることは出来ないっぽいです。
- func Main()
- var one : int :: 1 / 3 {1を3で割って}
- var two : int :: 2 / 3 {2も3で割る}
-
- do one :* 3{それぞれを3倍して、}
- do two :* 3{元の値に戻す。}
-
- var res : bool :: (one = two) {同じ値かを比較。true or falseがresに入る}
-
- if(res)
- else
- end if
-
- {res : true,one : 0,two : 0 と表示される。何故なのかは、考えてみてください。}
-
- if(1 $ bool)
- else
- end if
-
- if(0 $ bool)
- else
- end if
- end func
bool型変数を文字列に変換します
列挙型。いくつか定義された中からいずれかの値をとる。
bool型がtrueもしくはfalseの2択のいずれかの値をとるならば、enum型は自分で定義した複数の選択肢の中からいずれかの値を取ります。
使い道は様々で、enumにリストアップしたものに対して、ユニークなIDを割り振って、それを使って分岐したりするなどの用途があります。
- {グローバル変数としてenumを定義する。}
- enum ErrorCode
- {中略}
- WINDOW_CLOSING :: 500
- {中略}
- MY_EXCEPTION :: 2000
- {中略}
- ASSERT_EXCEPTION :: 3000
- ARRAY_OUT_OF_RANGE :: 3002
- INT_OVERFLOW
- {中略}
- end enum
-
- {try-catch-finally構文でキャッチされなかったエラーは、全てこのErr関数に飛んでくる(闇Kuin活用テクニック)}
- func Err(err:Kuin@CExcpt)
- {
- Kuin@CExcept型のプロパティであるCodeには、実行時エラーのコード番号がint型で入っている。
- それをErrorCode型のenumにキャストしてから、swich文で分岐させる(可読性の向上ってやつです☆)
- }
- switch(err.Code $ @ErrorCode) {ちなみにグローバル変数にアクセスするときは、変数名の先頭に「@」を付ける必要がある}
- case(@ErrorCode#MY_EXCEPTION)
- case(@ErrorCode#ASSERT_EXCEPTION)
- case(@ErrorCode#ARRAY_OUT_OF_RANGE)
- case(@ErrorCode#INT_OVERFLOW)
- case(@ErrorCode#WINDOW_CLOSING)
- default
- end switch
- end func
-
- func Main()
- while(true)
- do Kuin@Act()
- if(Input@Pad(0, Input@EBtn#A) > 0) {Aボタンが押されたら}
- var a : int :: 2^62
- do a :* 2 {int型オーバーフローを発生させる}
- end if
- if(Input@Pad(0, Input@EBtn#B) > 0) {Bボタンが押されたら}
- var a : []int :: #[5]int
- do a[999] :: 917 {配列の範囲外参照を発生させる}
- end if
- if(Input@Pad(0, Input@EBtn#C) > 0) {Cボタンが押されたら}
- var a : int :: 10
- end if
- if(Input@Pad(0, Input@EBtn#D) > 0) {Dボタンが押されたら}
- throw @ErrorCode#MY_EXCEPTION $ int {自分で定義したエラーを投げる。throw文はintを投げるものなのでキャスト必須。}
- end if
- end while
- end func
動的配列。値が複数連なったものを表す。
Kuinでは文字列を扱いたい場合には、char型の配列として扱います。
応用的な使い方として、クラス型の配列を作ることなんかも可能です。詳しくはサンプルコードで。
- func Main()
- {サンプル① int型配列の例}
- block testIntArray
- do Kuin@Act()
- var intArr : []int :: [9,1,7]int {int型配列を宣言し、[0]番目から順に9,1,7という数字を入れる}
- var dummy : []int :: #[5]int {今回は使用しないが、サイズ5の空のint型配列を作成したいときはこう書く}
-
- for i(0,intArr.Len()-1,1)
- end for
- end block
-
- {サンプル② char型配列(文字列)の例}
- block testCharArray
- do Kuin@Act()
- var str1 : []char :: "kuina" {[]charの配列の初期化では、ダブルクオーテーションの構文糖が存在する}
- var str2 : []char :: ['c','h','a','n']char {こっちのほうが原理的な書き方ではある(誰得な記法ではあるが)}
- var str3 : []char :: []char {空っぽのchar型配列を作成することも可能}
- do str3 :~ "6sai" {このように、空っぽのを作ったあとで、中身を追加で結合してくという方法もある。}
-
- {因みに ~ という演算子は配列同士を結合して1つの配列にする演算子だったりする}
- end block
-
- {サンプル③ char型配列(文字列)の配列の例(いわゆる二次元配列)}
- block testArrayOfCharArray
- do Kuin@Act()
- {初期化と同時に文字列を代入するには以下のようにする}
- var strs1 : [][]char :: ["kuina","chan","6sai"][]char
- {とりあえず空の2次配列を作り、後から付け足していく場合は以下のように書く}
- var strs2 : [][]char :: [][]char
- do strs2 :~ ["くいなちゃん"][]char
- do strs2 :~ ["朝から"][]char
- do strs2 :~ ["元気"][]char
-
- {
- {今回は使用しないが、int型などでは以下のようになる(初期化と同時に代入例)}
- var intArr1 : [][]int :: [[9,1,7]int,[3,1,4]int,[7,1,9]int][]int
- {今回は使用しないが、int型で空っぽ配列を作成後に、後から付け足し例も載せておく}
- var intArr2 : [][]int :: [][]int
- do intArr2 :~ [[9,1,7]int][]int
- do intArr2 :~ [[3,1,4]int][]int
- do intArr2 :~ [[7,1,9]int][]int
-
- {これで、例えばintArr1[1][2]とすれば、 4 という数値が得られる。}
- }
-
- var mes : []char :: ""
- for i(0,strs1.Len()-1,1)
- do mes :~ strs1[i] ~ " "
- end for
-
-
- do mes :: ""
- for i(0,strs2.Len()-1,1)
- do mes :~ strs2[i] ~ " "
- end for
-
- end block
-
- {サンプル④ クラス型の配列}
- block testCTexArray
- {Kuin同梱サンプルの0007_fontや、自分で用意したものなど、なんでもいいからTrueTypeFontを手に入れてくる}
- var fontName : []char :: "font.ttf"
- var fontSize : int :: 24
- var fontMargin : int :: 5
- var font : Draw@CFont
-
- {ファイルの存在の有無を確認してから代入する}
- do font :: Draw@LoadFont(fontName)
- else
- break testCTexArray
- end if
-
- {空っぽのDraw@CTex型配列を作成する。基本的な部分はサンプル②と同じだよね?}
- var texArr : []Draw@CTex :: []Draw@CTex
- {MakeTexの戻り値を配列化して配列結合する}
- do texArr :~ [font.MakeTex(fontSize,"くいなちゃん",fontMargin)]Draw@CTex
- do texArr :~ [font.MakeTex(fontSize,"朝から",fontMargin)]Draw@CTex
- do texArr :~ [font.MakeTex(fontSize,"元気",fontMargin)]Draw@CTex
-
- while(Input@Pad(0, Input@EBtn#A) = 0)
- for i(0,texArr.Len()-1,1)
- do texArr[i].Draw(0.0,0.0,texArr[i].Width()$float,texArr[i].Height()$float,0.0,(i*(texArr[i].Height()+10))$float,1.0,1.0,1.0,1.0)
- end for
- do Kuin@Act()
- end while
- end block
- end func
配列の長さを返します
- func Main()
- {散々使ってますので↑ので許してください()}
- end func
ここに変数型の説明が入ります
改行するときは&br()で。
- func Main()
- {ここにサンプルコードをキメろ!}
- end func
メソッド1の説明をここに
メソッド2の説明をここに