「変数」の編集履歴(バックアップ)一覧はこちら
変数 - (2013/09/19 (木) 16:29:21) の最新版との変更点
追加された行は緑色になります。
削除された行は赤色になります。
>変数とは、よく箱のようなものと例えられており、変数を利用すると数値や文字といった値を格納することができます。
でもここはアマちゃんのための場っぽくないので、詳しいことはカットカットしていきますね。&u(){[[Yahooでググれ>https://www.google.co.jp/search?q=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%20%E5%A4%89%E6%95%B0%E3%81%A8%E3%81%AF]]}
----
#contents(fromhere=true)
----
*変数一覧表
|BGCOLOR(#ccccff):CENTER:変数型名|BGCOLOR(#ccccff):CENTER:値/参照|BGCOLOR(#ccccff):CENTER:具体例|BGCOLOR(#ccccff):CENTER:説明|BGCOLOR(#ccccff):CENTER:備考|
|[[int>#int]]|値型|5|-2^(63)~2^(63)-1の範囲の整数が扱える|オーバーフローすると例外が発生する|
|[[float>#float]]|値型|3.14|浮動小数点型。±10^(-308)~±10^(308)で有効桁数15桁の巨大な小数が扱える|Kuinに&color(blue){double}は存在しない|
|[[char>#char]]|値型|'K'|文字型。1文字が格納できる。|文字&color(red){列}を扱いたいときは、charの配列「[]char」を用いる|
|[[bool>#bool]]|値型|true|論理型。falseかtrueのどちらかの値をとる。|真偽値を意味し、&color(red){false}は&color(red){偽}、&color(blue){true}は&color(blue){真}を表す|
|[[enum>#enum]]|値型||列挙型。いくつか定義された中からいずれかの値をとる。|詳しくは[[enum>#enum]]を参照|
|[[byte>#byte]]|値型||ビット演算やオーバーフローを駆使する場合に用いる整数型||
|[[[](array)>#array]]|参照型|[9,1,7]int&br()"kuina"|動的配列。値が複数連なったものを表す。&br()Kuinでは、文字列はcharの配列([]char)として扱う|O(1)でアクセス出来る素敵データ構造|
|[[テンプレ>#テンプレ]]|値型or参照型|○○|ここに説明が入る|特記事項があればここに|
----
*&aname(int){int型}
**&aname(int説明)説明
>整数の値を扱える変数型です。&br()扱える範囲は-2^(63)~2^(63)-1です。かなり大きい数字も扱えるので、普段は上限や下限を意識する必要はありません。
**&aname(intサンプルコード)サンプルコード(Ver1.00)
#highlight(linenumber){{func Main()
var a : int {int型変数aを宣言}
var b : int :: 1 {宣言と同時に代入も可能}
var c : int
do a :: 9 {aに9を代入する(do忘れに注意)}
try
do c :: 2^62 {2の62乗を代入して}
do c :* 2 {それを2倍すると、c>=(2^63)になるので、例外が発生する!}
catch(3003) {3003は、int型オーバーフロー例外のコード番号}
{オーバーフローの例外を受け取ったらログ表示(実際表示される)}
do Dbg@Log("cの値が大きすぎたみたいです。")
do c :: 7 {それっぽい数字に戻す}
end try
do Dbg@Log(a.ToStr() ~ b.ToStr() ~ c.ToStr()) {「917」と表示される}
end func}}
**&aname(int所有メソッド)所有メソッド
***&aname(intAbs){Abs()}
>int型の値の絶対値を返します
-引数
--なし
-戻り値
--int
---値の絶対値が帰ります
-サンプルコード(Ver0.04)
#highlight(linenumber){{func Main()
var a : int :: -1
do Dbg@Log(a.ToStr()) {-1 と表示される}
do Dbg@Log(a.Abs().ToStr()) {1 と表示される}
end func}}
***&aname(intToStr){ToStr()}
>int型変数を文字列に変換します
-引数
--なし
-戻り値
--[]char
---文字列に変換された数値が返されます
---文字のフォーマットまで指定する場合には、後述のToStrF()を利用する
***&aname(intToStrF){ToStrF()}
>フォーマットを指定してint型変数を文字に変換します&br()フォーマットの形式は、ほとんどC言語のprintfと一緒なので、C言語のprintfの仕様を確認してほしい(&u(){[[Wikipedia様はこちらから>http://ja.wikipedia.org/wiki/Printf#.E6.9B.B8.E5.BC.8F.E5.8C.96.E6.96.87.E5.AD.97.E5.88.97]]})
-引数
--[]char
---フォーマット文字列
-戻り値
--[]char
---指定したフォーマットの形で、文字列に変換された数値が返されます
-サンプルコード(Ver0.04)
#highlight(linenumber){{func Main()
var kuina : int :: 2#100100010111 {2進数で値を代入する}
do Dbg@Log(kuina.ToStrF("x")) {16進数に変換された文字列として、「917」と表示される}
end func}}
----
*&aname(float){float型}
**&aname(float説明)説明
>浮動小数の値を扱える変数型です。&br()扱える範囲は±10^(-308)~±10^(308)です。(有効桁数は15桁)&br()かなり大きい数字も扱えるので、普段は上限や下限を意識する必要はありません。
**&aname(floatサンプルコード)サンプルコード(Ver0.04)
#highlight(linenumber){{func Main()
var pi : float :: 3.14
do Dbg@Log(pi.ToStr()) {3.14 と表示される}
end func}}
**&aname(float所有メソッド)所有メソッド
***&aname(floatAbs){Abs()}
>float型の値の絶対値を返します(が、&color(red){Ver0.031では未実装です})
-引数
--なし
-戻り値
--float
---値の絶対値が帰ります
-サンプルコード(Ver0.04)
#highlight(linenumber){{func Main()
var a : float :: -1.0
do Dbg@Log(a.ToStr()) {-1.0 と表示される}
do Dbg@Log(a.Abs().ToStr()) {1.0 と表示される}
{↑の行で、E9999が発生します。注意されたし。}
end func}}
***&aname(floatToStr){ToStr()}
>float型変数を文字列に変換します
-引数
--なし
-戻り値
--[]char
---文字列に変換された数値が返されます
---文字のフォーマットまで指定する場合には、後述のToStrF()を利用する
***&aname(floatToStrF){ToStrF()}
>フォーマットを指定してfloat型変数を文字に変換します&br()フォーマットの形式は、ほとんどC言語のprintfと一緒なので、C言語のprintfの仕様を確認してほしい(&u(){[[Wikipedia様はこちらから>http://ja.wikipedia.org/wiki/Printf#.E6.9B.B8.E5.BC.8F.E5.8C.96.E6.96.87.E5.AD.97.E5.88.97]]})
-引数
--[]char
---フォーマット文字列
-戻り値
--[]char
---指定したフォーマットの形で、文字列に変換された数値が返されます
-サンプルコード(Ver0.04)
#highlight(linenumber){{func Main()
var pi : float :: 3.14
do Dbg@Log(pi.ToStrF("08.4f")) {003.1400 と表示される}
end func}}
----
*&aname(char){char型}
**&aname(char説明)説明
>文字型。1文字が格納できる変数です。&br()この項ではあくまで1文字の変数として紹介します。文字列は[[[]>#array]]へ。&br()なお、int型にキャストすることで、文字コードを得ることが出来る。[要出典]だが、どうせUTF-16LEでしょう(
**&aname(charサンプルコード)サンプルコード(Ver0.04)
#highlight(linenumber){{func Main()
var a : char :: 'k' {ダブルクォーテーションマークではないので注意}
var b : char :: 'く' {全角文字も気にせず入れられる。}
do Dbg@Log(a.ToStr()) {k と表示される}
do Dbg@Log((a$int).ToStr()) {107 と表示される([一応]ASCII)}
do Dbg@Log(b.ToStr()) {く と表示される}
do Dbg@Log((b$int).ToStr()) {12367 と表示される(UTF-16)}
end func}}
**&aname(char所有メソッド)所有メソッド
***&aname(charToStr){ToStr()}
>char型変数を文字列に変換します
-引数
--なし
-戻り値
--[]char
---文字列に変換された文字が返されます
---Dbg@Logの引数は、charではなく[]charなので、このメソッドを挟まないと&color(red){型が違います}とエラーを吐く
----
*&aname(bool){bool型}
**&aname(bool説明)説明
>論理型。falseかtrueのどちらかの値をとる。&br()C言語などでは0は偽、0以外は真となりますが、Kuinで同様のことをするには、bool型に明示的にキャストする必要があります。&br()文字や文字列は、それ自体をboolにキャストすることは出来ないっぽいです。
**&aname(boolサンプルコード)サンプルコード(Ver0.04)
#highlight(linenumber){{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)
do Dbg@Log("1 = 2 [Q.E.D]") {こっちを表示}
else
do Dbg@Log("1 <> 2 [Q.E.D]")
end if
do Dbg@Log("res : " ~ res.ToStr() ~ ",one : " ~ one.ToStr() ~ ",two : " ~ two.ToStr())
{res : true,one : 0,two : 0 と表示される。何故なのかは、考えてみてください。}
if(1 $ bool)
do Dbg@Log("1 is true") {こっちを表示}
else
do Dbg@Log("1 is false")
end if
if(0 $ bool)
do Dbg@Log("0 is true")
else
do Dbg@Log("0 is false") {こっちを表示}
end if
end func}}
**&aname(bool所有メソッド)所有メソッド
***&aname(boolToStr){ToStr()}
>bool型変数を文字列に変換します
-引数
--なし
-戻り値
--[]char
---文字列に変換された真偽値が返されます
---文字列としての「true」もしくは「false」が帰ります。
----
*&aname(enum){enum型}
**&aname(enum説明)説明
>列挙型。いくつか定義された中からいずれかの値をとる。&br()bool型がtrueもしくはfalseの2択のいずれかの値をとるならば、enum型は自分で定義した複数の選択肢の中からいずれかの値を取ります。&br()使い道は様々で、enumにリストアップしたものに対して、ユニークなIDを割り振って、それを使って分岐したりするなどの用途があります。
**&aname(enumサンプルコード)サンプルコード(Ver0.04)
#highlight(linenumber){{
{グローバル変数として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)
do Dbg@Log("自分で定義したエラーが発生しました")
case(@ErrorCode#ASSERT_EXCEPTION)
do Dbg@Log("assert文で偽となる結果が出ました")
case(@ErrorCode#ARRAY_OUT_OF_RANGE)
do Dbg@Log("配列の範囲外参照をしました")
case(@ErrorCode#INT_OVERFLOW)
do Dbg@Log("int型の値がオーバーフローしました")
case(@ErrorCode#WINDOW_CLOSING)
do Dbg@Log("ウィンドウを閉じます")
default
do Dbg@Log("原因不明のエラーが発生しました")
do Dbg@Log(err.Code.ToStr())
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
assert (a<5) {アサート文で偽を発生させる}
end if
if(Input@Pad(0, Input@EBtn#D) > 0) {Dボタンが押されたら}
throw @ErrorCode#MY_EXCEPTION $ int {自分で定義したエラーを投げる。throw文はintを投げるものなのでキャスト必須。}
end if
end while
end func}}
----
*&aname(array){[](array)型}
**&aname(array説明)説明
>動的配列。値が複数連なったものを表す。&br()Kuinでは文字列を扱いたい場合には、char型の配列として扱います。&br()応用的な使い方として、クラス型の配列を作ることなんかも可能です。詳しくはサンプルコードで。
**&aname(arrayサンプルコード)サンプルコード(Ver0.04)
#highlight(linenumber){{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)
do Dbg@Log(intArr[i].ToStr()) {配列の[0]番目から配列の最後の要素までを列挙する}
end for
end block
{サンプル② char型配列(文字列)の例}
block testCharArray
do Kuin@Act()
var str1 : []char :: "kuina chan" {[]charの配列の初期化では、ダブルクオーテーションの構文糖が存在する}
var str2 : []char :: ['6','s','a','i']char {こっちのほうが原理的な書き方ではある(誰得な記法ではあるが)}
do Dbg@Log(str1 ~ " " ~ str2) {因みに ~ という演算子は配列同士を結合して1つの配列にする演算子だったりする}
end block
{サンプル③ char型配列(文字列)の配列の例(いわゆる二次元配列)}
block testArrayOfCharArray
do Kuin@Act()
{
var strs : [][]char :: ["kuina","chan","6sai"][]char
var dummyInt : [][]int :: [[3]int,[1,4,1]int,[5,9,2]int][]int
var dummyInt2 : [][]int :: [#[9]int,#[1]int,#[7]int][]int
{
以上のように、宣言と同時に初期化することは、文法上おかしくはないはずなのですが、
Ver0.031現在、動作が不安定で、エラー落ちすることがあるので現状非推奨です。
面倒ではありますが、初期化はdo文で1つづつ行なっていきましょう。(for文との組み合わせは問題ない)
}
}
var strs : [][]char :: #[3][]char {長さ3のchar型配列の配列を宣言します}
do strs[0] :: "kuina"
do strs[1] :: "c" ~ "h" ~ "a" ~ "n"
do strs[2] :: ['6','s','a','i']char
{様々な方法で初期化できます(ぶっちゃけ[0]番目以外の入れ方はほぼネタですが)}
var mes : []char :: ""
for i(0,strs.Len()-1,1)
do mes :~ strs[i] ~ " "
end for
do Dbg@Log(mes) {kuina chan 6sai と表示される}
end block
{サンプル④ クラス型の配列(※参考になりません)}
block testCTexArray
{Drawとかとかを使用します。リンクは張りませんが知らない方は各自標準ライブラリのDrawを参照ください。}
do Dbg@Log("サンプル4のロードはちょっと時間かかるから待っててね")
do Kuin@Act()
const MESSAGE : []char :: "ルイズ!ルイズ!ルイズ!ルイズぅぅうううわぁああああああああああああああああああああああん!!! あぁああああ…ああ…あっあっー!あぁああああああ!!!ルイズルイズルイズぅううぁわぁああああ!!! あぁクンカクンカ!クンカクンカ!スーハースーハー!スーハースーハー!いい匂いだなぁ…くんくん んはぁっ!ルイズ・フランソワーズたんの桃色ブロンドの髪をクンカクンカしたいお!クンカクンカ!あぁあ!! 間違えた!モフモフしたいお!モフモフ!モフモフ!髪髪モフモフ!カリカリモフモフ…きゅんきゅんきゅい!! 小説12巻のルイズたんかわいかったよぅ!!あぁぁああ…あああ…あっあぁああああ!!ふぁぁあああんんっ!! アニメ2期放送されて良かったねルイズたん!あぁあああああ!かわいい!ルイズたん!かわいい!あっああぁああ! コミック2巻も発売されて嬉し…いやぁああああああ!!!にゃああああああああん!!ぎゃああああああああ!! ぐあああああああああああ!!!コミックなんて現実じゃない!!!!あ…小説もアニメもよく考えたら… ル イ ズ ち ゃ ん は 現実 じ ゃ な い?にゃあああああああああああああん!!うぁああああああああああ!! そんなぁああああああ!!いやぁぁぁあああああああああ!!はぁああああああん!!ハルケギニアぁああああ!! この!ちきしょー!やめてやる!!現実なんかやめ…て…え!?見…てる?表紙絵のルイズちゃんが僕を見てる? 表紙絵のルイズちゃんが僕を見てるぞ!ルイズちゃんが僕を見てるぞ!挿絵のルイズちゃんが僕を見てるぞ!! アニメのルイズちゃんが僕に話しかけてるぞ!!!よかった…世の中まだまだ捨てたモンじゃないんだねっ! いやっほぉおおおおおおお!!!僕にはルイズちゃんがいる!!やったよケティ!!ひとりでできるもん!!! あ、コミックのルイズちゃああああああああああああああん!!いやぁあああああああああああああああ!!!! あっあんああっああんあアン様ぁあ!!シ、シエスター!!アンリエッタぁああああああ!!!タバサァぁあああ!! ううっうぅうう!!俺の想いよルイズへ届け!!ハルゲニアのルイズへ届け "
const FONTSIZE : int :: 36
const CHARMARGIN : int :: 1
const TEXTMARGIN : int :: 20
const LINEHEIGHT : float :: 5.0
class CPoint()
var x : int
var y : int
end class
var cursor : CPoint :: #CPoint
var font : Draw@CFont :: Draw@LoadFont("meiryo.ttc")
var linesChar : [][]char :: #[50][]char {適当に大きいサイズにする(あまり良いコーディングはない)}
var linesTex : []Draw@CTex
var lineCnt : int :: 0
var maxHeight : float :: 0.0
{色々と初期化していく}
var tmpMes : []char :: ""
var tmpLine : Draw@CTex
for i(0,MESSAGE.Len()-1,1)
do tmpLine :: font.MakeTex(FONTSIZE,tmpMes ~ MESSAGE[i].ToStr(),CHARMARGIN)
if(maxHeight < (tmpLine.Height()$float))
do maxHeight :: tmpLine.Height()$float
end if
if(tmpLine.Width() < (1600 - TEXTMARGIN*2))
do tmpMes :~ MESSAGE[i].ToStr()
if(i <> (MESSAGE.Len()-1))
continue i
end if
end if
do linesChar[lineCnt] :: ##tmpMes
do lineCnt :+ 1
do tmpMes :: ""
if(i <> (MESSAGE.Len()-1))
do i :- 1
end if
end for
do linesTex :: #[lineCnt]Draw@CTex
for i(0,lineCnt-1,1)
do linesTex[i] :: font.MakeTex(FONTSIZE,"",CHARMARGIN)
end for
do cursor.x :: -1
do cursor.y :: 0
do Dbg@Log("サンプル4のロード完了!")
while(true)
do Kuin@Act()
if(Kuin@Cnt() % 2 = 0)
if(cursor.x < (linesChar[cursor.y].Len()-1))
do cursor.x :+ 1
else
do cursor.x :: 0
do cursor.y :: (cursor.y<(lineCnt-1))?(cursor.y+1,0)
for i(0,cursor.y-1,1)
{文字が増えてる行より以前のものは常に全文字表示}
do linesTex[i] :: font.MakeTex(FONTSIZE,linesChar[i],CHARMARGIN)
end for
for i(cursor.y+1,lineCnt-1,1)
{文字が増えてる行より後のものは常に非表示}
do linesTex[i] :: font.MakeTex(FONTSIZE,"",CHARMARGIN)
end for
end if
if(cursor.x = 0)
do tmpMes :: linesChar[cursor.y][cursor.x].ToStr()
else
do tmpMes :~ linesChar[cursor.y][cursor.x].ToStr()
end if
{文字が増えている行は増えるたびに反映する}
do linesTex[cursor.y] :: font.MakeTex(FONTSIZE,tmpMes,CHARMARGIN)
end if
var wid : float
var hei : float
for i(0,lineCnt-1,1)
do wid :: linesTex[i].Width()$float
do hei :: linesTex[i].Height()$float
do linesTex[i].DrawScale(0.0,0.0,wid,hei,TEXTMARGIN$float,(maxHeight+LINEHEIGHT)*(i$float)+(TEXTMARGIN$float),wid,hei,1.0,1.0,1.0,1.0)
end for
end while
end block
end func}}
**&aname(array所有メソッド)所有メソッド
***&aname(arrayLen){Len()}
>配列の長さを返します
-引数
--なし
-戻り値
--int
---配列の長さがint型で返ってきます
---配列連結演算子「~」を用いて結合すると、結合の前後で値は当然変わります()
-サンプルコード
#highlight(linenumber){{func Main()
{散々使ってますので↑ので許してください()}
end func}}
----
*&aname(テンプレ){テンプレ型}
**説明
>ここに変数型の説明が入ります&br()改行するときは&br()で。
**サンプルコード(Ver○○)
#highlight(linenumber){{func Main()
{ここにサンプルコードをキメろ!}
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
----
>変数とは、よく箱のようなものと例えられており、変数を利用すると数値や文字といった値を格納することができます。
でもここはアマちゃんのための場っぽくないので、詳しいことはカットカットしていきますね。&u(){[[Yahooでググれ>https://www.google.co.jp/search?q=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%20%E5%A4%89%E6%95%B0%E3%81%A8%E3%81%AF]]}
----
#contents(fromhere=true)
----
*変数一覧表
|BGCOLOR(#ccccff):CENTER:変数型名|BGCOLOR(#ccccff):CENTER:値/参照|BGCOLOR(#ccccff):CENTER:具体例|BGCOLOR(#ccccff):CENTER:説明|BGCOLOR(#ccccff):CENTER:備考|
|[[int>#int]]|値型|5|-2^(63)~2^(63)-1の範囲の整数が扱える|オーバーフローすると例外が発生する|
|[[float>#float]]|値型|3.14|浮動小数点型。±10^(-308)~±10^(308)で有効桁数15桁の巨大な小数が扱える|Kuinに&color(blue){double}は存在しない|
|[[char>#char]]|値型|'K'|文字型。1文字が格納できる。|文字&color(red){列}を扱いたいときは、charの配列「[]char」を用いる|
|[[bool>#bool]]|値型|true|論理型。falseかtrueのどちらかの値をとる。|真偽値を意味し、&color(red){false}は&color(red){偽}、&color(blue){true}は&color(blue){真}を表す|
|[[enum>#enum]]|値型||列挙型。いくつか定義された中からいずれかの値をとる。|詳しくは[[enum>#enum]]を参照|
|[[byte>#byte]]|値型||ビット演算やオーバーフローを駆使する場合に用いる整数型||
|[[[](array)>#array]]|参照型|[9,1,7]int&br()"kuina"|動的配列。値が複数連なったものを表す。&br()Kuinでは、文字列はcharの配列([]char)として扱う|O(1)でアクセス出来る素敵データ構造|
|[[テンプレ>#テンプレ]]|値型or参照型|○○|ここに説明が入る|特記事項があればここに|
----
*&aname(int){int型}
**&aname(int説明)説明
>整数の値を扱える変数型です。&br()扱える範囲は-2^(63)~2^(63)-1です。かなり大きい数字も扱えるので、普段は上限や下限を意識する必要はありません。
**&aname(intサンプルコード)サンプルコード(Ver1.00)
#highlight(linenumber){{func Main()
var a : int {int型変数aを宣言}
var b : int :: 1 {宣言と同時に代入も可能}
var c : int
do a :: 9 {aに9を代入する(do忘れに注意)}
try
do c :: 2^62 {2の62乗を代入して}
do c :* 2 {それを2倍すると、c>=(2^63)になるので、例外が発生する!}
catch(3003) {3003は、int型オーバーフロー例外のコード番号}
{オーバーフローの例外を受け取ったらログ表示(実際表示される)}
do Dbg@Log("cの値が大きすぎたみたいです。")
do c :: 7 {それっぽい数字に戻す}
end try
do Dbg@Log(a.ToStr() ~ b.ToStr() ~ c.ToStr()) {「917」と表示される}
end func}}
**&aname(int所有メソッド)所有メソッド
***&aname(intAbs){Abs()}
>int型の値の絶対値を返します
-引数
--なし
-戻り値
--int
---値の絶対値が帰ります
-サンプルコード(Ver1.00)
#highlight(linenumber){{func Main()
var a : int :: -1
do Dbg@Log(a.ToStr()) {-1 と表示される}
do Dbg@Log(a.Abs().ToStr()) {1 と表示される}
end func}}
***&aname(intToStr){ToStr()}
>int型変数を文字列に変換します
-引数
--なし
-戻り値
--[]char
---文字列に変換された数値が返されます
---文字のフォーマットまで指定する場合には、後述のToStrF()を利用する
***&aname(intToStrF){ToStrF()}
>フォーマットを指定してint型変数を文字に変換します&br()フォーマットの形式は、ほとんどC言語のprintfと一緒なので、C言語のprintfの仕様を確認してほしい(&u(){[[Wikipedia様はこちらから>http://ja.wikipedia.org/wiki/Printf#.E6.9B.B8.E5.BC.8F.E5.8C.96.E6.96.87.E5.AD.97.E5.88.97]]})
-引数
--[]char
---フォーマット文字列
-戻り値
--[]char
---指定したフォーマットの形で、文字列に変換された数値が返されます
-サンプルコード(Ver1.00)
#highlight(linenumber){{func Main()
var kuina : int :: 2#100100010111 {2進数で値を代入する}
do Dbg@Log(kuina.ToStrF("x")) {16進数に変換された文字列として、「917」と表示される}
end func}}
----
*&aname(float){float型}
**&aname(float説明)説明
>浮動小数の値を扱える変数型です。&br()扱える範囲は±10^(-308)~±10^(308)です。(有効桁数は15桁)&br()かなり大きい数字も扱えるので、普段は上限や下限を意識する必要はありません。
**&aname(floatサンプルコード)サンプルコード(Ver1.00)
#highlight(linenumber){{func Main()
var pi : float :: 3.14
do Dbg@Log(pi.ToStr()) {3.14 と表示される}
end func}}
**&aname(float所有メソッド)所有メソッド
***&aname(floatAbs){Abs()}
>float型の値の絶対値を返します
-引数
--なし
-戻り値
--float
---値の絶対値が帰ります
-サンプルコード(Ver1.00)
#highlight(linenumber){{func Main()
var a : float :: -1.79
do Dbg@Log(a.ToStr()) {-1.79 と表示される}
do Dbg@Log(a.Abs().ToStr()) {1.79 と表示される}
end func}}
***&aname(floatToStr){ToStr()}
>float型変数を文字列に変換します
-引数
--なし
-戻り値
--[]char
---文字列に変換された数値が返されます
---文字のフォーマットまで指定する場合には、後述のToStrF()を利用する
***&aname(floatToStrF){ToStrF()}
>フォーマットを指定してfloat型変数を文字に変換します&br()フォーマットの形式は、ほとんどC言語のprintfと一緒なので、C言語のprintfの仕様を確認してほしい(&u(){[[Wikipedia様はこちらから>http://ja.wikipedia.org/wiki/Printf#.E6.9B.B8.E5.BC.8F.E5.8C.96.E6.96.87.E5.AD.97.E5.88.97]]})
-引数
--[]char
---フォーマット文字列
-戻り値
--[]char
---指定したフォーマットの形で、文字列に変換された数値が返されます
-サンプルコード(Ver1.00)
#highlight(linenumber){{func Main()
var pi : float :: 3.14
do Dbg@Log(pi.ToStrF("08.4f")) {003.1400 と表示される}
end func}}
----
*&aname(char){char型}
**&aname(char説明)説明
>文字型。1文字が格納できる変数です。&br()この項ではあくまで1文字の変数として紹介します。文字列は[[[]>#array]]へ。&br()なお、int型にキャストすることで、文字コードを得ることが出来る。[要出典]だが、どうせUTF-16LEでしょう(
**&aname(charサンプルコード)サンプルコード(Ver1.00)
#highlight(linenumber){{func Main()
var a : char :: 'k' {ダブルクォーテーションマークではないので注意}
var b : char :: 'く' {全角文字も気にせず入れられる。}
do Dbg@Log(a.ToStr()) {k と表示される}
do Dbg@Log((a$int).ToStr()) {107 と表示される([一応]ASCII)}
do Dbg@Log(b.ToStr()) {く と表示される}
do Dbg@Log((b$int).ToStr()) {12367 と表示される(UTF-16)}
end func}}
**&aname(char所有メソッド)所有メソッド
***&aname(charToStr){ToStr()}
>char型変数を文字列に変換します
-引数
--なし
-戻り値
--[]char
---文字列に変換された文字が返されます
---Dbg@Logの引数は、charではなく[]charなので、このメソッドを挟まないと&color(red){型が違います}とエラーを吐く
----
*&aname(bool){bool型}
**&aname(bool説明)説明
>論理型。falseかtrueのどちらかの値をとる。&br()C言語などでは0は偽、0以外は真となりますが、Kuinで同様のことをするには、bool型に明示的にキャストする必要があります。&br()文字や文字列は、それ自体をboolにキャストすることは出来ないっぽいです。
**&aname(boolサンプルコード)サンプルコード(Ver1.00)
#highlight(linenumber){{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)
do Dbg@Log("1 = 2 [Q.E.D]") {こっちを表示}
else
do Dbg@Log("1 <> 2 [Q.E.D]")
end if
do Dbg@Log("res : " ~ res.ToStr() ~ ",one : " ~ one.ToStr() ~ ",two : " ~ two.ToStr())
{res : true,one : 0,two : 0 と表示される。何故なのかは、考えてみてください。}
if(1 $ bool)
do Dbg@Log("1 is true") {こっちを表示}
else
do Dbg@Log("1 is false")
end if
if(0 $ bool)
do Dbg@Log("0 is true")
else
do Dbg@Log("0 is false") {こっちを表示}
end if
end func}}
**&aname(bool所有メソッド)所有メソッド
***&aname(boolToStr){ToStr()}
>bool型変数を文字列に変換します
-引数
--なし
-戻り値
--[]char
---文字列に変換された真偽値が返されます
---文字列としての「true」もしくは「false」が帰ります。
----
*&aname(enum){enum型}
**&aname(enum説明)説明
>列挙型。いくつか定義された中からいずれかの値をとる。&br()bool型がtrueもしくはfalseの2択のいずれかの値をとるならば、enum型は自分で定義した複数の選択肢の中からいずれかの値を取ります。&br()使い道は様々で、enumにリストアップしたものに対して、ユニークなIDを割り振って、それを使って分岐したりするなどの用途があります。
**&aname(enumサンプルコード)サンプルコード(Ver1.00)
#highlight(linenumber){{
{グローバル変数として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)
do Dbg@Log("自分で定義したエラーが発生しました")
case(@ErrorCode#ASSERT_EXCEPTION)
do Dbg@Log("assert文で偽となる結果が出ました")
case(@ErrorCode#ARRAY_OUT_OF_RANGE)
do Dbg@Log("配列の範囲外参照をしました")
case(@ErrorCode#INT_OVERFLOW)
do Dbg@Log("int型の値がオーバーフローしました")
case(@ErrorCode#WINDOW_CLOSING)
do Dbg@Log("ウィンドウを閉じます")
default
do Dbg@Log("原因不明のエラーが発生しました")
do Dbg@Log(err.Code.ToStr())
end switch
end func
func Main()
do Dbg@Log("キーボードでZXCVのいずれかのキーを入力してください。")
do Dbg@Log("意図的に発生させたエラーによって、例外が起こります")
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
assert (a<5) {アサート文で偽を発生させる}
end if
if(Input@Pad(0, Input@EBtn#D) > 0) {Dボタンが押されたら}
throw @ErrorCode#MY_EXCEPTION $ int {自分で定義したエラーを投げる。throw文はintを投げるものなのでキャスト必須。}
end if
end while
end func}}
----
*&aname(array){[](array)型}
**&aname(array説明)説明
>動的配列。値が複数連なったものを表す。&br()Kuinでは文字列を扱いたい場合には、char型の配列として扱います。&br()応用的な使い方として、クラス型の配列を作ることなんかも可能です。詳しくはサンプルコードで。
**&aname(arrayサンプルコード)サンプルコード(Ver1.00)
#highlight(linenumber){{
func Main()
{サンプル① int型配列の例}
do Dbg@Log("サンプル1開始")
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)
do Dbg@Log(intArr[i].ToStr()) {配列の[0]番目から配列の最後の要素までを列挙する}
end for
end block
do Dbg@Log("サンプル1終了")
{サンプル② char型配列(文字列)の例}
do Dbg@Log("サンプル2開始")
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つの配列にする演算子だったりする}
do Dbg@Log(str1 ~ " " ~ str2 ~ " " ~ str3) {kuina chan 6sai と表示される}
end block
do Dbg@Log("サンプル2終了")
{サンプル③ char型配列(文字列)の配列の例(いわゆる二次元配列)}
do Dbg@Log("サンプル3開始")
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 という数値が得られる。}
do Dbg@Log(intArr1[1][2].ToStr())
}
var mes : []char :: ""
for i(0,strs1.Len()-1,1)
do mes :~ strs1[i] ~ " "
end for
do Dbg@Log(mes) {kuina chan 6sai と表示される}
do mes :: ""
for i(0,strs2.Len()-1,1)
do mes :~ strs2[i] ~ " "
end for
do Dbg@Log(mes) {くいなちゃん 朝から 元気 と表示される}
end block
do Dbg@Log("サンプル3終了")
{サンプル④ クラス型の配列}
do Dbg@Log("サンプル4開始")
block testCTexArray
{Kuin同梱サンプルの0007_fontや、自分で用意したものなど、なんでもいいからTrueTypeFontを手に入れてくる}
var fontName : []char :: "font.ttf"
var fontSize : int :: 24
var fontMargin : int :: 5
var font : Draw@CFont
{ファイルの存在の有無を確認してから代入する}
if(File@ReadPack(fontName) <>& null) {nullは参照なので比較は <>& を使う。超注意}
do font :: Draw@LoadFont(fontName)
else
do Dbg@Log(fontName ~ "が見つかりません。Resフォルダに" ~ fontName ~ "を入れてください")
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
do Dbg@Log("文字を描画します。Zボタンを押すと終了します")
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
do Dbg@Log("サンプル4終了")
end func}}
**&aname(array所有メソッド)所有メソッド
***&aname(arrayLen){Len()}
>配列の長さを返します
-引数
--なし
-戻り値
--int
---配列の長さがint型で返ってきます
---配列連結演算子「~」を用いて結合すると、結合の前後で値は当然変わります()
-サンプルコード
#highlight(linenumber){{func Main()
{散々使ってますので↑ので許してください()}
end func}}
----
*&aname(テンプレ){テンプレ型}
**説明
>ここに変数型の説明が入ります&br()改行するときは&br()で。
**サンプルコード(Ver○○)
#highlight(linenumber){{func Main()
{ここにサンプルコードをキメろ!}
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
----