変数

変数とは、よく箱のようなものと例えられており、変数を利用すると数値や文字といった値を格納することができます。

でもここはアマちゃんのための場っぽくないので、詳しいことはカットカットしていきますね。Yahooでググれ




変数一覧表

変数型名 値/参照 具体例 説明 備考
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のどちらかの値をとる。 真偽値を意味し、 falsetrue を表す
enum 値型 列挙型。いくつか定義された中からいずれかの値をとる。 詳しくはenumを参照
byte 値型 ビット演算やオーバーフローを駆使する場合に用いる整数型
[](array) 参照型 [9,1,7]int
"kuina"
動的配列。値が複数連なったものを表す。
Kuinでは、文字列はcharの配列([]char)として扱う
O(1)でアクセス出来る素敵データ構造
テンプレ 値型or参照型 ○○ ここに説明が入る 特記事項があればここに



int型

説明

整数の値を扱える変数型です。
扱える範囲は-2^(63)~2^(63)-1です。かなり大きい数字も扱えるので、普段は上限や下限を意識する必要はありません。

サンプルコード(Ver1.00)

  1. func Main()
  2. var a : int {int型変数aを宣言}
  3. var b : int :: 1 {宣言と同時に代入も可能}
  4. var c : int
  5.  
  6. do a :: 9 {aに9を代入する(do忘れに注意)}
  7.  
  8. try
  9. do c :: 2^62 {262乗を代入して}
  10. do c :* 2 {それを2倍すると、c>=(2^63)になるので、例外が発生する!}
  11. catch(3003) {3003は、int型オーバーフロー例外のコード番号}
  12. {オーバーフローの例外を受け取ったらログ表示(実際表示される)}
  13. do Dbg@Log("cの値が大きすぎたみたいです。")
  14. do c :: 7 {それっぽい数字に戻す}
  15. end try
  16.  
  17. do Dbg@Log(a.ToStr() ~ b.ToStr() ~ c.ToStr()) {917」と表示される}
  18. end func

所有メソッド

Abs()

int型の値の絶対値を返します
  • 引数
    • なし
  • 戻り値
    • int
      • 値の絶対値が帰ります
  • サンプルコード(Ver1.00)
  1. func Main()
  2. var a : int :: -1
  3. do Dbg@Log(a.ToStr()) {-1 と表示される}
  4. do Dbg@Log(a.Abs().ToStr()) {1 と表示される}
  5. end func

ToStr()

int型変数を文字列に変換します
  • 引数
    • なし
  • 戻り値
    • []char
      • 文字列に変換された数値が返されます
      • 文字のフォーマットまで指定する場合には、後述のToStrF()を利用する

ToStrF()

フォーマットを指定してint型変数を文字に変換します
フォーマットの形式は、ほとんどC言語のprintfと一緒なので、C言語のprintfの仕様を確認してほしい(Wikipedia様はこちらから)
  • 引数
    • []char
      • フォーマット文字列
  • 戻り値
    • []char
      • 指定したフォーマットの形で、文字列に変換された数値が返されます
  • サンプルコード(Ver1.00)
  1. func Main()
  2. var kuina : int :: 2#100100010111 {2進数で値を代入する}
  3. do Dbg@Log(kuina.ToStrF("x")) {16進数に変換された文字列として、「917」と表示される}
  4. end func



float型

説明

浮動小数の値を扱える変数型です。
扱える範囲は±10^(-308)~±10^(308)です。(有効桁数は15桁)
かなり大きい数字も扱えるので、普段は上限や下限を意識する必要はありません。

サンプルコード(Ver1.00)

  1. func Main()
  2. var pi : float :: 3.14
  3. do Dbg@Log(pi.ToStr()) {3.14 と表示される}
  4. end func

所有メソッド

Abs()

float型の値の絶対値を返します
  • 引数
    • なし
  • 戻り値
    • float
      • 値の絶対値が帰ります
  • サンプルコード(Ver1.00)
  1. func Main()
  2. var a : float :: -1.79
  3. do Dbg@Log(a.ToStr()) {-1.79 と表示される}
  4. do Dbg@Log(a.Abs().ToStr()) {1.79 と表示される}
  5. end func

ToStr()

float型変数を文字列に変換します
  • 引数
    • なし
  • 戻り値
    • []char
      • 文字列に変換された数値が返されます
      • 文字のフォーマットまで指定する場合には、後述のToStrF()を利用する

ToStrF()

フォーマットを指定してfloat型変数を文字に変換します
フォーマットの形式は、ほとんどC言語のprintfと一緒なので、C言語のprintfの仕様を確認してほしい(Wikipedia様はこちらから)
  • 引数
    • []char
      • フォーマット文字列
  • 戻り値
    • []char
      • 指定したフォーマットの形で、文字列に変換された数値が返されます
  • サンプルコード(Ver1.00)
  1. func Main()
  2. var pi : float :: 3.14
  3. do Dbg@Log(pi.ToStrF("08.4f")) {003.1400 と表示される}
  4. end func



char型

説明

文字型。1文字が格納できる変数です。
この項ではあくまで1文字の変数として紹介します。文字列は[]へ。
なお、int型にキャストすることで、文字コードを得ることが出来る。[要出典]だが、どうせUTF-16LEでしょう(

サンプルコード(Ver1.00)

  1. func Main()
  2. var a : char :: 'k' {ダブルクォーテーションマークではないので注意}
  3. var b : char :: 'く' {全角文字も気にせず入れられる。}
  4.  
  5. do Dbg@Log(a.ToStr()) {k と表示される}
  6. do Dbg@Log((a$int).ToStr()) {107 と表示される([一応]ASCII)}
  7.  
  8. do Dbg@Log(b.ToStr()) {く と表示される}
  9. do Dbg@Log((b$int).ToStr()) {12367 と表示される(UTF-16)}
  10. end func

所有メソッド

ToStr()

char型変数を文字列に変換します
  • 引数
    • なし
  • 戻り値
    • []char
      • 文字列に変換された文字が返されます
      • Dbg@Logの引数は、charではなく[]charなので、このメソッドを挟まないと 型が違います とエラーを吐く



bool型

説明

論理型。falseかtrueのどちらかの値をとる。
C言語などでは0は偽、0以外は真となりますが、Kuinで同様のことをするには、bool型に明示的にキャストする必要があります。
文字や文字列は、それ自体をboolにキャストすることは出来ないっぽいです。

サンプルコード(Ver1.00)

  1. func Main()
  2. var one : int :: 1 / 3 {13で割って}
  3. var two : int :: 2 / 3 {23で割る}
  4.  
  5. do one :* 3{それぞれを3倍して、}
  6. do two :* 3{元の値に戻す。}
  7.  
  8. var res : bool :: (one = two) {同じ値かを比較。true or falseがresに入る}
  9.  
  10. if(res)
  11. do Dbg@Log("1 = 2 [Q.E.D]") {こっちを表示}
  12. else
  13. do Dbg@Log("1 <> 2 [Q.E.D]")
  14. end if
  15.  
  16. do Dbg@Log("res : " ~ res.ToStr() ~ ",one : " ~ one.ToStr() ~ ",two : " ~ two.ToStr())
  17. {res : true,one : 0,two : 0 と表示される。何故なのかは、考えてみてください。}
  18.  
  19. if(1 $ bool)
  20. do Dbg@Log("1 is true") {こっちを表示}
  21. else
  22. do Dbg@Log("1 is false")
  23. end if
  24.  
  25. if(0 $ bool)
  26. do Dbg@Log("0 is true")
  27. else
  28. do Dbg@Log("0 is false") {こっちを表示}
  29. end if
  30. end func

所有メソッド

ToStr()

bool型変数を文字列に変換します
  • 引数
    • なし
  • 戻り値
    • []char
      • 文字列に変換された真偽値が返されます
      • 文字列としての「true」もしくは「false」が帰ります。



enum型

説明

列挙型。いくつか定義された中からいずれかの値をとる。
bool型がtrueもしくはfalseの2択のいずれかの値をとるならば、enum型は自分で定義した複数の選択肢の中からいずれかの値を取ります。
使い道は様々で、enumにリストアップしたものに対して、ユニークなIDを割り振って、それを使って分岐したりするなどの用途があります。

サンプルコード(Ver1.00)

  1. {グローバル変数としてenumを定義する。}
  2. enum ErrorCode
  3. {中略}
  4. WINDOW_CLOSING :: 500
  5. {中略}
  6. MY_EXCEPTION :: 2000
  7. {中略}
  8. ASSERT_EXCEPTION :: 3000
  9. ARRAY_OUT_OF_RANGE :: 3002
  10. INT_OVERFLOW
  11. {中略}
  12. end enum
  13.  
  14. {try-catch-finally構文でキャッチされなかったエラーは、全てこのErr関数に飛んでくる(闇Kuin活用テクニック)}
  15. func Err(err:Kuin@CExcpt)
  16. {
  17. Kuin@CExcept型のプロパティであるCodeには、実行時エラーのコード番号がint型で入っている。
  18. それをErrorCode型のenumにキャストしてから、swich文で分岐させる(可読性の向上ってやつです☆)
  19. }
  20. switch(err.Code $ @ErrorCode) {ちなみにグローバル変数にアクセスするときは、変数名の先頭に「@」を付ける必要がある}
  21. case(@ErrorCode#MY_EXCEPTION)
  22. do Dbg@Log("自分で定義したエラーが発生しました")
  23. case(@ErrorCode#ASSERT_EXCEPTION)
  24. do Dbg@Log("assert文で偽となる結果が出ました")
  25. case(@ErrorCode#ARRAY_OUT_OF_RANGE)
  26. do Dbg@Log("配列の範囲外参照をしました")
  27. case(@ErrorCode#INT_OVERFLOW)
  28. do Dbg@Log("int型の値がオーバーフローしました")
  29. case(@ErrorCode#WINDOW_CLOSING)
  30. do Dbg@Log("ウィンドウを閉じます")
  31. default
  32. do Dbg@Log("原因不明のエラーが発生しました")
  33. do Dbg@Log(err.Code.ToStr())
  34. end switch
  35. end func
  36.  
  37. func Main()
  38. do Dbg@Log("キーボードでZXCVのいずれかのキーを入力してください。")
  39. do Dbg@Log("意図的に発生させたエラーによって、例外が起こります")
  40. while(true)
  41. do Kuin@Act()
  42. if(Input@Pad(0, Input@EBtn#A) > 0) {Aボタンが押されたら}
  43. var a : int :: 2^62
  44. do a :* 2 {int型オーバーフローを発生させる}
  45. end if
  46. if(Input@Pad(0, Input@EBtn#B) > 0) {Bボタンが押されたら}
  47. var a : []int :: #[5]int
  48. do a[999] :: 917 {配列の範囲外参照を発生させる}
  49. end if
  50. if(Input@Pad(0, Input@EBtn#C) > 0) {Cボタンが押されたら}
  51. var a : int :: 10
  52. assert (a<5) {アサート文で偽を発生させる}
  53. end if
  54. if(Input@Pad(0, Input@EBtn#D) > 0) {Dボタンが押されたら}
  55. throw @ErrorCode#MY_EXCEPTION $ int {自分で定義したエラーを投げる。throw文はintを投げるものなのでキャスト必須。}
  56. end if
  57. end while
  58. end func



[](array)型

説明

動的配列。値が複数連なったものを表す。
Kuinでは文字列を扱いたい場合には、char型の配列として扱います。
応用的な使い方として、クラス型の配列を作ることなんかも可能です。詳しくはサンプルコードで。

サンプルコード(Ver1.00)

  1. func Main()
  2. {サンプル① int型配列の例}
  3. do Dbg@Log("サンプル1開始")
  4. block testIntArray
  5. do Kuin@Act()
  6. var intArr : []int :: [9,1,7]int {int型配列を宣言し、[0]番目から順に9,1,7という数字を入れる}
  7. var dummy : []int :: #[5]int {今回は使用しないが、サイズ5の空のint型配列を作成したいときはこう書く}
  8.  
  9. for i(0,intArr.Len()-1,1)
  10. do Dbg@Log(intArr[i].ToStr()) {配列の[0]番目から配列の最後の要素までを列挙する}
  11. end for
  12. end block
  13. do Dbg@Log("サンプル1終了")
  14.  
  15. {サンプル② char型配列(文字列)の例}
  16. do Dbg@Log("サンプル2開始")
  17. block testCharArray
  18. do Kuin@Act()
  19. var str1 : []char :: "kuina" {[]charの配列の初期化では、ダブルクオーテーションの構文糖が存在する}
  20. var str2 : []char :: ['c','h','a','n']char {こっちのほうが原理的な書き方ではある(誰得な記法ではあるが)}
  21. var str3 : []char :: []char {空っぽのchar型配列を作成することも可能}
  22. do str3 :~ "6sai" {このように、空っぽのを作ったあとで、中身を追加で結合してくという方法もある。}
  23.  
  24. {因みに ~ という演算子は配列同士を結合して1つの配列にする演算子だったりする}
  25. do Dbg@Log(str1 ~ " " ~ str2 ~ " " ~ str3) {kuina chan 6sai と表示される}
  26. end block
  27. do Dbg@Log("サンプル2終了")
  28.  
  29. {サンプル③ char型配列(文字列)の配列の例(いわゆる二次元配列)}
  30. do Dbg@Log("サンプル3開始")
  31. block testArrayOfCharArray
  32. do Kuin@Act()
  33. {初期化と同時に文字列を代入するには以下のようにする}
  34. var strs1 : [][]char :: ["kuina","chan","6sai"][]char
  35. {とりあえず空の2次配列を作り、後から付け足していく場合は以下のように書く}
  36. var strs2 : [][]char :: [][]char
  37. do strs2 :~ ["くいなちゃん"][]char
  38. do strs2 :~ ["朝から"][]char
  39. do strs2 :~ ["元気"][]char
  40.  
  41. {
  42. {今回は使用しないが、int型などでは以下のようになる(初期化と同時に代入例)}
  43. var intArr1 : [][]int :: [[9,1,7]int,[3,1,4]int,[7,1,9]int][]int
  44. {今回は使用しないが、int型で空っぽ配列を作成後に、後から付け足し例も載せておく}
  45. var intArr2 : [][]int :: [][]int
  46. do intArr2 :~ [[9,1,7]int][]int
  47. do intArr2 :~ [[3,1,4]int][]int
  48. do intArr2 :~ [[7,1,9]int][]int
  49.  
  50. {これで、例えばintArr1[1][2]とすれば、 4 という数値が得られる。}
  51. do Dbg@Log(intArr1[1][2].ToStr())
  52. }
  53.  
  54. var mes : []char :: ""
  55. for i(0,strs1.Len()-1,1)
  56. do mes :~ strs1[i] ~ " "
  57. end for
  58.  
  59. do Dbg@Log(mes) {kuina chan 6sai と表示される}
  60.  
  61. do mes :: ""
  62. for i(0,strs2.Len()-1,1)
  63. do mes :~ strs2[i] ~ " "
  64. end for
  65.  
  66. do Dbg@Log(mes) {くいなちゃん 朝から 元気 と表示される}
  67. end block
  68. do Dbg@Log("サンプル3終了")
  69.  
  70. {サンプル④ クラス型の配列}
  71. do Dbg@Log("サンプル4開始")
  72. block testCTexArray
  73. {Kuin同梱サンプルの0007_fontや、自分で用意したものなど、なんでもいいからTrueTypeFontを手に入れてくる}
  74. var fontName : []char :: "font.ttf"
  75. var fontSize : int :: 24
  76. var fontMargin : int :: 5
  77. var font : Draw@CFont
  78.  
  79. {ファイルの存在の有無を確認してから代入する}
  80. if(File@ReadPack(fontName) <>& null) {nullは参照なので比較は <>& を使う。超注意}
  81. do font :: Draw@LoadFont(fontName)
  82. else
  83. do Dbg@Log(fontName ~ "が見つかりません。Resフォルダに" ~ fontName ~ "を入れてください")
  84. break testCTexArray
  85. end if
  86.  
  87. {空っぽのDraw@CTex型配列を作成する。基本的な部分はサンプル②と同じだよね?}
  88. var texArr : []Draw@CTex :: []Draw@CTex
  89. {MakeTexの戻り値を配列化して配列結合する}
  90. do texArr :~ [font.MakeTex(fontSize,"くいなちゃん",fontMargin)]Draw@CTex
  91. do texArr :~ [font.MakeTex(fontSize,"朝から",fontMargin)]Draw@CTex
  92. do texArr :~ [font.MakeTex(fontSize,"元気",fontMargin)]Draw@CTex
  93.  
  94. do Dbg@Log("文字を描画します。Zボタンを押すと終了します")
  95. while(Input@Pad(0, Input@EBtn#A) = 0)
  96. for i(0,texArr.Len()-1,1)
  97. 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)
  98. end for
  99. do Kuin@Act()
  100. end while
  101. end block
  102. do Dbg@Log("サンプル4終了")
  103. end func

所有メソッド

Len()

配列の長さを返します
  • 引数
    • なし
  • 戻り値
    • int
      • 配列の長さがint型で返ってきます
      • 配列連結演算子「~」を用いて結合すると、結合の前後で値は当然変わります()
  • サンプルコード
  1. func Main()
  2. {散々使ってますので↑ので許してください()}
  3. end func



テンプレ型

説明

ここに変数型の説明が入ります
改行するときは&br()で。

サンプルコード(Ver○○)

  1. func Main()
  2. {ここにサンプルコードをキメろ!}
  3. end func

所有メソッド

メソッド1(引数1:引数型1,引数2:引数型2,...) : 戻り型

メソッド1の説明をここに
  • 引数
    • 引数1:引数型1
      • 引数1の説明をここに
    • 引数2:引数型2
      • 引数2の説明をここに
    • 引数3(ry
      • ひk(ry
  • 戻り値
    • 戻り値型
      • 戻り値の説明

メソッド2(引数1:引数型1,引数2:引数型2,...) : 戻り型

メソッド2の説明をここに
  • 引数
    • ひ(ry
      • h(ry
  • 戻り値
    • 戻り値(ry
      • 戻r(ry