RealBasic University

このコラムはStone Table Softwareのオーナーであり、またREALbasic Developerの編集者でもあるMarc Zeedar氏により書かれたものを、著者の許可を得て翻訳したものです。この翻訳はHREM Researchにより提供されています。この日本語版へのご意見はRBU-Jまでご連絡下さい。

URL: http://www.applelinks.com/rbu/009/
INDEXに戻る

モジュールの追加

先週、GenderChangerのデータ構造を検討しました。fileTypeClassという新しいクラスを作ったことを憶えているでしょうか?しかし、我々はまだそのクラスの項目に対して保存するものを割り当ててはいません。我々はクラスを定義しただけです -- 我々はまだそれを使って何も行なっていません。

ですから、今日、我々がしようとしていることはfileTypeClass型の配列 array を作ることです。

しかし、この属性をどこに置けばいいでしょうか?もし、Window1の中に置くとすると、その情報はWindow1に限定されます。我々はプログラムの全てのところからこの情報にアクセスしたいので、その配列を大局的(グローバル)変数として作成しましょう。このためには、モジュール module を作らなければなりません。

モジュールは特別なREALbasicのオブジェクトです。それはユーザと相互作用するインターフェイスを持っていません。その代わりに、モジュールはライブラリのようなコードの単純な集合です:それは定数、属性およびメソッドを含むことができます。モジュールに属する属性と定数は大局的(グローバル)です:プログラムのどの部分でもそれらにアクセスすることができます。モジュール内のメソッドもまた大局的(グローバル)です:どのルーチンからもそれらを呼び出すことが可能です。

モジュールは本質的にグループなので、多くの目的に再利用しようとしているコードにとって理想的です。例えば、標準的なヘルプシステムを作って、それをあなたのすべてのプログラムで使うことができます。モジュールをイクスポートするには、それをプロジェクトウィンドウからハードディスク(またはデスクトップ)にただドラッグするだけです。モジュールをプロジェクトにインポートするには、逆のことを行ないます。

モジュールはまた定数 constant を作ることのできる唯一のところです:定数とはその値がプログラムが起動されたときに設定され、変更することのできない項目のことです。例えば、文字列定数を使用して、プログラムの初期設定ファイルの名前をそこに設定することができます。なぜ、ファイル名をコードに直接書き込まないのでしょうか?なぜ、変数ではなく自由度の低い定数を使うのでしょうか?

そうですね、あなたのプログラムで初期設定ファイルにアクセスするところが数箇所あったとしましょう。もし、それぞれのところで"GenderChanger Prefs"という名前をコードに書き込んだとすると異なるファイル名とフォーマットを使用するGenderChangerの第二版を公開するときには何が起るでしょうか?あなたはプログラム全体を検索して"GenderChanger Prefs"を"GenderChanger 2 Prefs"と置換なければなりません。もしあなたがその1つを見逃して、古いフォーマットの初期設定ファイルを開けば、プログラムは正常には動作せず、そしてクラッシュするかもしれません。定数を使うことにより、その名前はただ一箇所で設定されますので、変更すのが容易になります。

もちろん、同じことを変数を用いても行なえます、しかし、仕事が多くなります:プログラムが起動したときに、その変数に適切な値を設定することを憶えておかねばなりません。

定数は強力ですし、大いに推奨されます。定数をあらゆることに使いましょう。例えば、ファイル名の長さ、サポートされている項目の数というような設定すべき制限がプログラムにあるときには、値を直接書き込むのではなく定数を使いましょう。このようにすれば、将来その値を変更しなければならないときに、あなたはただ一箇所でそれを容易に変更できます。例えば、Mac OS はファイル名を31文字に制限していますが、WindowsやMac OS Xの文字制限は255のように。

REALbasicはまた定数にMacintoshではある値に、そしてWindowsでは異なる値に設定することもできます(REALbasicのprofessional versionではプログラムをWindowsアプリケーションとしてコンパイルすることができます)。また、プログラムをローカライズ localize する (別の言語へ翻訳する)ときには定数を使います。REALbasicではそれぞれの言葉に対して定数に異なる値を割当てることが可能です。プログラムが表示するどのようなテキストに対しても定数を用いれば、プログラムをコンパイルするときに異なる対象の言語を簡単に選択することができます。そうすれば、RBはその言語に対してあなたが入力したテキストを使用します。(もちろん、あなたは翻訳されたテキストを準備しなければなりません。REALbasicは手品ではありません。)

Tip:それらが定数か大局的(グローバル)変数かがよく判るように、プログラマは定数と大局的変数をある流儀にしたがって命名します。私は小文字の"k"を定数の名前の前に付け、大局的変数の前には小文字の"g"を使います。これは約束事ですので、もしあなたがこれに従わないとしても何も不都合は起らないでしょう、しかし、これはあなたのコードの可読性をかなり容易にしますので、これに従うのはいい考えです。

では、幾つかの大局的変数と定数をGenderChangerに追加しましょう! 先ず最初に、モジュールを追加します。Fileメニューに行き、"New Module"を選択します。これによりModule1がプロジェクトに付け加えられます。 これはあまり利口な名前ではないので、globalsModuleに変更しましょう。(名前を変えるには、プロジェクトウィンドウでモジュールを選択し、属性ウィンドウのname欄を修正します。)

よくできました。今度はそれをダブルクリックして開きましょう。左の欄に3つのセクション:定数(Constants)、 メソッド(Methods)と属性( Properties)、が見えるでしょう。最初に定数を1つ追加しましょう。Editメニューに行って、"New Constant"を選択します。すると次のようなダイアログが現れるでしょう:

名前(Name)というところに、"kPrefName" (引用符は無しで、これと同じように大文字にして)と入力します。タイプ(Type)ポップアップメニューがStringに設定されていることを確認して、それから値(Value)欄に"GenderChanger Prefs"とタイプします。そして、OKをクリックします。これであなたはGenderChangerの初期設定ファイルの名前に対する定数を追加したのです!

今度は大局的な属性を2つ追加します。Editメニューに行って、"New Property"を選択し、入力ダイアログボックスに"gDialogReturn as string" とタイプします。同じく、2つ目の属性を"gTheFileList(0) as fileTypeClass"として追加します。これで終わりです。

最後に行なったのは fileTypeClass 型の配列変数 (gTheFileList) を追加したのです。この配列がどれだけの要素を必要とするのかわからないので、そのサイズをゼロにしています。前もってサイズを設定する代わりに、必要になったときに配列を動的に大きくするのです。

他の属性、gDialogReturn、はダイアログボックスと情報をやり取りするために使用される単純な文字列変数です。(これにより、例えば、ユーザがダイアログをキャンセルしたか、あるいは変更をしたかを知ることができます。詳しくは、後で示します。)

あなたの globalsModule は次のようになっているでしょう(訳注:メソッドはまだ追加していません):

読み込み/保存ルーチンの追加

これで、我々は簡単な部分を終わりました。今度は2つの重要なメソッドを作らねばなりません。それらはプログラムのデータを読み込み、または保存します。それらのメソッドのどれも引数(パラメータ)や返り値を必要としないので、それは簡単です。ただEditメニューに行って、"New Method"を選択します。最初のものを"openFile"と名前を付けて、同じことをもう一度行なって、2つ目を"saveFile"という名前にします。(もちろん、メソッドは何時でも作ることが可能です。しかし、私は必要となったときに1つずつ作るよりも、まとめて一度に作るほうが容易だと思います。)

では、これからコードを書きます!我々はsaveFileから始めます。どうして?それには正当理由があります:実際、保存ルーチンを最初に作成し、それから読み込みルーチンを保存ルーチンを基礎に作成するというのが、どのようなときでもうまくいきます。(読み込みルーチンと保存ルーチンとは本質的に逆のものです。)もし、読み込みルーチンを最初に作ったとすると、それをテストするものはなにもありません!保存部分を最初に作ることによって、何かのデータを保存することができます。そうすれば、プログラムがそれを正しく開くことができるか試すことが可能になります。また、保存ルーチンを作成している間に、保存する必要のある重要な部分を忘れていたことを見いだすことがしばしばあるでしょう。このような時に読み込みルーチンを後で修正するのは誤りが入り込みやすいものです。

先ず最初に、saveFileは何をすればいいのかを考えましょう。(これはこのルーチンがどのような変数を必要とするかを決定するのに役立つでしょう。)

すべてのデータはGenderChangerの初期設定ファイルに保存されるでしょう:それは起動時に自動的に 回復され、終了時にはユーザの介入無く保存されます。ですから、まず、初期設定ファイルを見つける必要があります。それから、それに我々のデータを書き込まなければなりません。最後に、そのファイルを閉じます。

しかし、データを保存するのにどのようなフォーマットを使えばいいでしょうか? 先週に定義した我々のデータ構造は一連の fileTypeClass オブジェクトです。それぞれのfileTypeClassオブジェクトは3つの要素(属性)を持っています:

最も単純なファイルは通常のテキストファイルですので、それを使うことにしましょう。それから、REALbasicは一度に一行のテキストを読み書きするファイルコマンドを持っていますので、一行のテキストを我々のデータの個々のレコードとして使用するのが便利です。このため、それぞれの行はファイルの名前、クリエータ、およびタイプを保持しています。例えば次のように:StuffitSIT!SIT5。

しかし、それらはどのように押し縮められているのか調べて見ましょう。我々はどのようにして、1つが終わって、別のものが始まるのはどこであるかが判るのでしょう?簡単です:我々は区切り子 delimiter、特殊な分割用文字、を使います。それはユーザが入力できない文字であることが重要です -- そうでないと、ユーザがその文字をファイルタイプの名前に使ったとすると、我々はそれが名前の最後を示すと思ってしまうでしょう。我々はすでにreturnを使っているので、それを区切り子に使うことはできません。すなわち、それぞれの行は新しいレコードです、そして、returnは行の終わりを示しています。ではタブ(tab)はどうでしょうか?それは理想的です:REALbasicは通常ユーザがタブをダイアログボックスに入力するのを許していませんので、ユーザは入力項目の名前を付けるときにタブを挿入することはできません。

我々のデータがどのようにフォーマットされているかを正確に知ることは重要です:事実、GenderChangerのように単純なフォーマットでは、初期設定ファイルのデータと同様な模擬データを手で作成することさえ可能です。(下の図はBBEditで表示されています;三角形はタブを示しています。)

素晴らしい。我々は今や我々のルーチンがどうあるべきかというアイデアが決まりましたので、次にどのような変数が必要であるかを決定しましょう。REALbasicはファイルを現す folderItem と呼ばれる特別なタイプのオブジェクトを使用しますので、我々はそれが1つ必要でしょう。また、ファイルに書かれるテキストのためのREALbasicの別の特別なオブジェクトである textOutputStream オブジェクトも必要でしょう。

Tip: REALbasicのオンラインレファレンスをみれば、強力な folderItem オブジェクトについてもっと多くのことを知ることができます。

ほかに何が必要でしょうか?ファイルの各行を現す 文字列 string 変数、それからデータ構造を廻るループにための幾つかの整数変数 integer。それ以外のものは考えつきませんので、次に行くことにしましょう。

REALbasicは変数の保存場所を確保するのにDIMコマンドを使用します。前に変数gDialogReturnを作ったときを覚えていますか?DIMコマンドがないことを除いて、我々はそれと本質的に同じことをすることになります(RBはそれがそこにあると推測しています)。構文は同じです:変数の名前、キーワード"as"、それからデータタイプです。

幾つかの変数を作ってみましょう。saveFileメソッド行きましょう。(正しいメソッドにいるということを確認しましょう:2つを取り間違えて、読み込みルーチンがファイルを保存しようとするようなことはあなたも望まないでしょう!)

右側の欄に以下のコードを入力します:

  dim f as folderItem
  dim out as textOutputStream
  dim theLine as string
  dim i, n as integer

よくできました!これで我々のルーチンが使用する変数を定義できましたので、これからそれらを使うことができます。このメソッドで最初にすることは何だったでしょうか?初期設定ファイルを捜すことですね、違いますか?

しかし、それがどこにあるのかをどのようにして知るのでしょうか?それはユーザの初期設定フォルダの中です。しかし、それはどこでしょう?現在のMac OSでは、初期設定フォルダはユーザの動作中のシステムフォルダの中にあります。しかし、ユーザが異なる、将来のOSで プログラムを走らせるとどうなるでしょうか?異なるユーザは異なる初期設定フォルダを持つ OS 9のマルチユーザのような新しい機能をユーザが使う場合にはどうなるでしょうか?

何の問題も生じません。REAL Software社の技術陣は、Mac OSを調べて、ユーザの初期設定フォルダがどこにあるかを見いだす特別な関数を作りました。 我々がしなければならないことは、どこに初期設定フォルダがあろうと、ユーザの初期設定フォルダが設定された folderItem を返す preferencesFolder コマンドを使うことです!

GenderChangerの初期設定ファイルは初期設定フォルダの中にありますので、それはそのフォルダの"子供(child)"です。我々は希望するファイルのfolderItemを返すREALbasicのchildメソッドを使うことができます。それは次のようです:

 f = preferencesFolder.child(kPrefName)

preferencesFolderfolderItemを返すということを覚えていますか。ですから、それは実際にfolderItemなのです。それで、単純に .child の構文で用いることで、 folderItemの childメソッドを使うことができるのです。childメソッドはファイルの名前を要求しますので、前に作った初期設定ファイル名の定数をそれに渡しています。等号の右側全体は初期設定ファイルを表す新しいfolderItemを返し、それを変数 f に代入しています。簡単でしょう!(1行のコードがその全てを行なっているとは驚きでしょう、ねえ?)

我々はファイルを表す folderItem を手に入れましたので、今すぐに開くべきでしょうか。そんなに急いではいけません。もし、何かの理由で folderItem が間違っているときはどうなるでしょう?そんなことはまれでしょうが、無いとも限りません。もし、 folderItem が間違っていて、それを使おうとすると、プログラムはクラッシュするでしょう!我々はそのようなことは望みませんので、folderItem を使う前に、それが正しいかを確かめるエラーチェックをするようにしましょう。

REALbasicは folderItem を適切に作成できない場合には、nilと呼ばれる特別な値をそこに設定します。nilは何もないことを意味します。それはその項目が死んでいる、あるいは存在しないということです。(folderItem のようなオブジェクト変数を定義して、それに何も設定していないときには、そのデフォルトの値は nil です。)このため、それが nil であるかを調べることにより、 folderItem が妥当であるかをチェックすることができます。もし nil であれば、それを使うプログラム部分をスキップして、エラーメッセージを返すようにします。

注意:生成時に nil であるのは オブジェクトのデータタイプのみです。他のデータタイプは単に空(empty)です:文字列変数は"" 、整数変数は0 (ゼロ)。

ではコードを示します:

  if f <> nil then

  end if // f = nil

  beep
  msgBox "Unknown error. Couldn't save the preferences file!"

この if 文では妥当な folderItem だけを通過させます:そうでなければ、ビープ音を鳴らし、エラーメッセージを表示します。

注意// はその行のそれ以降のテキストが注釈(コメント)である、コードではない、ことを REALbasicに知らせます。(一重引用符 ' を使うこともできます。)あとで何をしようとしているのか理解するのを容易にするので、コメントをプログラムに付けるのはいい考えです。上の例では、 end if コマンドとそのコマンドの最初とを結びつけています。これにより多重の end if があっても、どれがどれに対応するか混乱することはなくなるでしょう。

それでは、folderItemが妥当なときには、我々は何をすればいいのでしょう?我々のしなければならないのは folderItem に対するtextOutputStream(テキストファイルへの書き出すのに使われる特別なRBのオブジェクトタイプ)を生成することです。我々は以前に outtextOutputStream オブジェクトとして定義しましたので、ここでそれをテキストファイルに設定します。それを行なうには、folderItemの createTextFile メソッドを使います。このメソッドは、あなたも想像されるように、 textOutputStream オブジェクトを返します。これによりテキストファイルを書き出し用に開きます。

この行を先の if 文の下に書きます:

 out = f.createTextFile 

さて、テキストファイルを生成するのにエラーがある -- 例えば、ハードディスクが書込み禁止である(あるいは、その他まれなことが起る)-- と outnil に設定されます。ですから、先に進む前にそのチェックをしましょう。

これを前の行に追加します:

  if out <> nil then

  end if // out = nil

よくできました。我々は起りうるエラーのチェックをしましたので、次にすることは実際のデータを保存することです。そのための我々の基本的な手法は、データの各レコードに対してテキストの1行を書きながらデータ構造を一巡することです。

それを行なうには、ループ構文を必要とします。単純な for/next ループは最も道理にかなっていますが、前もってループの大きさを知っている必要があります。我々のデータ構造にはどれだけのレコードがあるのでしょうか?

幸いにも、REALbasicではそれは問題ではありません。我々は配列の大きさを知るのに uBound コマンドを使うことができます。

重要:厳密にはuBound コマンドは配列の大きさを返すのではありません。それは配列の最後の要素の番号を知らせます。別の言い方をすれば、もし添え字5が配列の最後の要素であるならば、uBound は5を返します。しかしながら、これは配列の大きさではありません:REALbasicの配列は0番目の要素を持っていますので、大きさ(全要素数)はいつも uBound の値よりも1大きいことになります。GenderChangerの場合には、我々は配列の0番目の要素を使いませんので、uBound 値と大きさは同じになりますが、いつもはそういう訳ではありません。これは覚えておいて下さい!(このことについてはさらにこのコラムに続くLettersを見て下さい。)

それでは、変数 n に配列 gTheFileListuBound を代入しましょう。それから、 1 から n までの for/next ループをスタートさせましょう。

解説:forループは1つの値から別の値までを数えて行きます。ループを回るごとに、現在のカウントが指定した変数に代入されます。それで、下のコードでは、i は最初1から始まって、それから2,さらに3と変化します。すべてのfornext の間にあるコードは毎回ループを回るごとに繰返されます。(追加:カウンタの値が無意味な場合、例えば1 から -1までというような場合、はどうなるのでしょうか?何も起りません!ループ全体がただスキップされます。)

   n = uBound(gTheFileList)
   for i = 1 to n

   next

質問:我々はなぜ 1 から uBound(gTheFileList) までカウントするのではなく、uBound の値を n に代入するのでしょうか?考えて見て下さい。(答えはこのコラムの最後にあります。)

これでループはできました。次に、我々は個々のレコードを適当な保存用フォーマットに編成する必要があります。どのように個々の要素をタブで分離するか決めたのを覚えていますか?我々がしなければならないのは個々の情報をタブで分離してつなぎ合わせた文字列にすることです。

では、コードを示します(これは for/next ループの中に入れます):

   theLine = gTheFileList(i).name + chr(9)
   theLine = theLine + gTheFileList(i).macCreator + chr(9)
   theLine = theLine + gTheFileList(i).macType

まず、名前を変数 theLine に代入する、それからタブで区切って、クリエータとタイプ要素を追加していることが判るでしょう。要素を結合するのに + オペレータを使っています。theLineに追加するのに、等号の右辺に theLine を含んでいることに注意して下さい。これは「新しい情報をtheLineに追加して、全部を theLineに代入せよ」ということをコンピュータに伝える常套手段です。(注意深い読者は最初の行は追加しているのではなく、theLine に値を設定しているのだと気付いたでしょう。もし、このようにしなかったとすると、theLine は 以前のループからの内容を含むことになるでしょう。)

chr 関数は数値を受け入れて、その番号に対応するASCII(アスキー)文字を返します。タブはASCII 番号9なので、chr(9) はタブ記号そのものです。(ASCII は American Standard Code for Information Interchange (情報交換用米国標準コード)です。コンピュータは実際には文字では動きません -- 全ては数字です。タブや改行のような幾つかの記号は見える文字コードを持っていません。)

さて、変数 theLine にデータを詰めましたので、それを保存しなければなりません。我々はtextOutputStreamオブジェクト outwriteLine メソッドを使います。次の行を上のコードの後で、 next コマンドの前に追加します。

   out.writeLine theLine

素晴らしい。我々はほとんど終わりに近づいています。ただ2つのことが残っているだけです。1つ目は、使った後のファイルを閉じなければなりません。for/next ループの next コマンドの後に close コマンドが必要です(もしそうでないとすると、ファイルはループごとに毎回閉じられることになるでしょう)。2つ目は、メソッドが終了することを報せるためにREALbasicの return コマンドを使う必要があります。(もしそれを追加しないとすると、ルーチンは いつも ビープ音をならし、エラーメッセージを表示するでしょう(訳注:GenderChangerではループの直後にエラー処理があります)。ほとんどのルーチンでは return はルーチンの最後に暗黙に追加されています。関数では、適切な応答を返すのに return が使われます。)

ですから、next コマンドの後に、次のような2行を挿入します:

  out.close
  return

できました!これで終わりです。エディタで全体のルーチンがどのように見えるかを示しますので、間違いなくできたか確かめてみてください(これはREALbasic ver.3 からのものです;あなたの表示の色付けは異なるかも知れません):

では、次は?もう時間がなくなりました!そうですね、今回は長いレッスンになりました。次回のために saveFile ルーチンを保存しましょう。実際に、openFile は単に saveFileの逆のことですので、かなり容易です。自分でそれを書いてみませんか?

(openFileは安全です:ファイルを扱ってはいますが、何も書くのではなく、ただ開くだけです。saveFileのように何かの情報を書く場合には、既存のファイルに上書きする可能性があります。)

以下はあなたの助けになる幾つかのヒントです:

ヒント #1textOutputStreamtextInputStreamになります。
ヒント #2redim コマンドを使って配列 gTheFileList にメモリー領域を確保して、 new コマンドをによって個々の fileTypeClass オブジェクトを使用する前に初期化する必要があります。
ヒント #3:入力した行を分割するのには nthField コマンドを使います。

あなたの宿題を楽しんで下さい。次回に完全なコードと説明を示します。

次週

openFile を完成し、そしてインターフェイスをコードして、プログラムが実際に何かをするようにします。

質問の解答:速度です。uBound コマンドはその実行に数ミリ秒かかります。ループを実行しているときに、ループを回る毎にuBound コマンドが呼ばれます。数ミリ秒が積み重なってあなたのルーチンは遅くなります。(GenderChangerの場合には、ループは非常に短いので問題にはなりません。しかし、このように代入を行なうことはプログラムをする上での良い習慣です。)

Letters

今週はすべて同じトピックの幾つかの手紙を頂きました。Ryan Goudelocke、Dennis、そしてRonさんはすべて配列に関する先週の私の説明の「誤り」(手抜かり)を指摘されました。

Dennisさんは次のように書いています:

私は最初のプロジェクトとしてGenderChangerを見て喜んでいます;あなたがそれを持ち出す前に私もそのようなプログラムができないかと考えていました!今週のコラム(#8)に関して、私がもし何か見落としていない限り、あなたは配列に関する部分を書き換えようとされているようです。そして、RB 3.0 のdevelopers guideが169ページの"Using Arrays"の節で言っている次のことを無視しています:

「配列はその要素数を括弧のなかに指定して生成します。REALbasicの配列はいつのゼロ番目の要素を持っていますので、実際には、Dim文で指定する数値は配列要素の実際の数より1つ小さくなります。このような配列はしばしばゼロ基底の配列と呼ばれます。例えば、構文:Dim aNames(10) as string は11 個の要素の文字列配列を作ります。」

ですから、Marcさん、あなたが「...配列名(12)は配列の12番目の要素を参照する」と書いているときには、「12番目」は実際には「13番目」であるべきでしょう。また、あなたの例の配列(Steve Jobsなどの)は5つの要素ではなく、全体として6個を含んでいます。

このコラムに大変感謝しています!

実のところ、私の説明は故意に簡単にしていました:私は最初からゼロ基底の配列というような込み入った議論に陥りたくはなかったのです。しかし、そのことに言及すべきたったのでしょう。それは、特に初心者にとって、非常に混乱させるものです。しかしながら、今週のコラムでその厄介なものに火をつける uBound コマンドの使用について学びました。もし、配列がREALbasicでどのように機能するかを理解しないと、それは混乱を引き起こすでしょう。

要するに、全てのREALbasicの配列は0番目の要素を持っています。しかし、微妙なところがあります:0番目を使う必要はないのです。もし、0番目を使えば、配列はすべて1つ多い要素を持つことになります。そのことに気が付いているかぎり、このことは問題とはなりません。重要なことは矛盾しない(0番目の要素を使うか、あるいは使わないない)ということです。(私は通常は使いません、しかし、例外はあります。)

REAL Software社でさえ一貫してはいません。REALbasicのある関数はゼロ基底で、他のものは1基底です。例えば、listBox.List メソッドはゼロ基底ですが、folderItem.item は1基底です。ですから、いつも配列が1基底かゼロ基底であるか見分けましょう。

最後に、用語に関して:私は配列の添字番号5を5番目の要素と呼ぶのを好みます。そうです、これは理論的には間違っています:それは実際には6番目の要素です(5プラス1です)。しかし、これは私を混乱させます。私は0番目の要素は0番目、1番目は1番、2番目は2番等々と思います。そうでないようにしようとすると、私の頭はすぐにひどく痛くなってくるのです!

ですから、次のことは知っておいて下さい:私は配列はゼロ基底であることを知っています。そして、もし、それが重要であれば、私は0番目の要素を直接に参照します。もし私が「1番目」の要素を言ったときには、私は添字1、ゼロではなく、について話しているのです。今後のコラムでそれが問題となるときには、できるだけ明確にするように最善を尽くします。

話しは変わって、あなたのコラムへの提案、質問、および訂正をお寄せ下さい!(さらに内容が複雑になってくるにしたがい、我々は多分後者がもっと必要になるでしょう。;-)

RBUの通知への申し込み!

別のお知らせ:Applelinksは要望の大きかったREALbasic Universityへのメーリングリストを開設しました。今日申し込みをすれば、コラムが発表されるたびにお知らせの emailがあなたに届きます!これはRBUに遅れを取らないための便利なお知らせです。

RBU-Jの通知サービス!コラムが発表されるたびに日本語版REALbasic Universityのお知らせの emailがあなたに届きます。登録・削除は ここ から。

INDEXに戻る