• ベストアンサー

ユーザーとプログラマーの配列の1始めと0始め

配列は0番からありますが、 ユーザーに見せるものは1番から表示にしています。 でも時々その為に変数の扱いをミスする事があります。 勘違いからの設計ミスを減らす知恵ってないでしょうか?

noname#228046
noname#228046

質問者が選んだベストアンサー

  • ベストアンサー
noname#252929
noname#252929
回答No.1

尻尾がいくつかわかりません。 間違えたくないのなら、0を未使用にして1から使い始めれば良いのではないでしょうか? 配列の0がどれくらいの規模の大きさなのかわかりませんが。 桁違いに大きなものなら、配列数から-1してアクセスするサブルーチンを共通で作ったって良いわけですし。 ただ、そこまでやる必要は通常なく、感覚的にわかると思いんですけどね。 そもそもソフト側は、16進法考えた方が都合が良いので、それで考えて居るはずのわけですが。。。

noname#228046
質問者

お礼

0を未使用にしても良いんですね。 やらない方がいいとか言われるのかなと思ってました。 サブルーチンも手ですよね。管理する数が多い場合そうします。 集中力が低下している時に他の事を考えつつコードを書いてしまって 動作テスト~修正というパターンが何度かあったので、 面倒だなぁと感じてミス軽減の定石でもあるのかなと質問を。 ご回答ありがとうございます。

その他の回答 (1)

  • chie65535
  • ベストアンサー率43% (8526/19383)
回答No.2

>配列は0番からありますが、 配列が「Zero based」なのか「One Based」なのか(0から始まるか、1から始まるか)は、言語により異なります。必ず0番からとは限りません。 C言語などは「Zero based(日本独特の言い回しで「0オリジン」と言ったりします)」になっていて、0番から始まります。 Fortran言語では、デフォルトで「One Based(日本独自の表現で「1オリジン」)」になっていて、1番から始まります。 VBAやVB6では「Option Base 1」と書くと「1始まり」になり「Option Base 0」と書くと「0始まり」になります(初期値は0始まり) >勘違いからの設計ミスを減らす知恵ってないでしょうか? C言語で可能な「裏技」があります。 int base_array[100]; int *array; などのように「配列の実体」と「アクセス用のポインタ変数」を定義しておきます。そして「アクセス用のポインタ変数」を array = base_array; array--; のように初期化します。 こうすると 「array[1]」にアクセスすると「base_array[0]」にアクセス出来るようになります。 これで「array[1]~array[100]」にアクセスする事で「base_array[0]~base_array[99]」にアクセス出来ます。

noname#228046
質問者

お礼

今はC言語じゃないので使う事はできませんが、 後でその設計を忘れて編集すると大変かもですが、 ポインタでそういう事もできるんですね。ありがとうございます。

関連するQ&A

  • VB6で配列の最大値を簡単に求める。

    VB6で配列の最大値を簡単に求める方法はありますでしょうか? 今は、1番目と2番目を比較して、大きい方を変数に格納して、 変数と3番目を比較して、・・・・ 以下繰り返して、求めています。

  • 配列の中に配列をセットし、呼び出したい

    配列@listの要素として@pickupの配列をセットしたいと思っています。 ループ文の中で繰り返し、$countというループの回数をカウントしている変数によってセットする場所を変えていきたいのです。 for($count=0;$count>100;$count++){ (中略しますが、ファイルを読み込み正規表現で値を吸い出しています) @pickup=("$1","$2","$3");#@pickupはループごとに中身が変わります。 @list[$count] = @pickup;#ここで@listの要素として@pickupをセット } 上記のように記述したとします。 print $list[80];とすると、@pickupの[0]の要素しか表示しません。 print @list[80];としても上に同じ。 質問1.どうやったら@list[$count]で配列の要素に配列を入れられますか? 質問2.その後どうやって配列の中の配列の要素を取り出せますか? イメージとしては@listの50番目の要素@pickupの0番目もしくは1番目の要素を取り出したいという感じです。

    • ベストアンサー
    • Perl
  • Perlで二次配列は可能?

    毎度御世話になっております。 Perlスクリプトで二次配列のような配列の使い方は可能でしょうか? (A*B)種類の変数を配列の形で操作したいと考えています。 A,B共に8~256ぐらいで、処理の途中で増やせる様にしたいのです。 連想配列を用いればそれらしいことが出来るのではないかと思ったのですが、 うまく行きません。どうかお知恵を御貸し下さい。

    • ベストアンサー
    • Perl
  • 配列を自由に増やすには

    swingでGUIを作成しています。ドラッグされた文字を配列に加えるプログラムは作ることが出来たのですがその配列の数、要素数も未定です。ユーザーがどれだけドラッグするか不明な為。 a[5],b[6],c[6]の3つの配列の場合もあればa[4],b[4],c[7],d[3]4つの配列の場合もあります。 始めの段階で定義せずにその時々で作成していくというのはできないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 配列の定義について

    配列とは、同じ形式のデーターを連続した記憶領域で確保するためのものである。 配列を構成する個々の領域を要素と呼び、要素の位置を添え字で示す。 Javaでは配列の先頭の要素を(0)番目と呼ぶ。 今、hairetsuという名前で10個の整数からなる配列を定義したい。 この場合の配列は(0)番目から始まり、終端は(9)番目である。 これを定義するには (int[] hairetsu;) (hairetsu = new int[10];) のように2行で行う方法と、 (int[] hairetsu = (new int[10];) のように、一行で行う方法がある。 Javaでは定義済みの配列の要素数は、配列変数名.(length)で知ることができ、 終端は(length + 1)番目となる。 したがって(length + 1)番目以降を使おうとすると、 配列要素の範囲外で(例外)が発生する。 この文章の( )の中は間違っていますか?

    • ベストアンサー
    • Java
  • ユーザーフォームのリストボックスの設定を標準モジュール内で取得した配列

    ユーザーフォームのリストボックスの設定を標準モジュール内で取得した配列にしたい。 題名のままの説明ですが、ユーザーフォームのリストボックス値を配列にして動的に動作させるようにしたいのですが、標準モジュールでPublicで配列を宣言しているのですが、うまくユーザーフォームモジュールに渡っていないというか、その配列変数をユーザーフォームモジュール内に書くと配列が存在しません。 というエラーが出てしまいます。 かといってユーザーフォームでPublicで配列を宣言することもできないのでどうやってリストボックスに 配列を設定すればいいのかわかりません。 配列は2次元配列で視覚的に説明するとは列数が3行、行数は標準モジュール内でRedimにより可変します。この配列をそのままレコードセットみたいにリストボックスに設定したのですが、 なにか良い方法はありますでしょうか?

  • 関数で配列を返す方法

    ユーザー関数で、値を返す方法はしっています。 return 変数名; では配列を返す場合はどうすればよいのでしょうか?

  • 配列の挿入方法

    $a = array('1','2','3'); の配列に、 指定した配列の要素の場所に値を挿入するには PHPの場合どうするのが一般的でしょうか? 期待する事は、 例えば2番目に値77を挿入したいときに、 array_insert(2,77); のようにユーザ関数を指定し、 1,2,77,3のような配列になることです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列や連想配列について

    言語一般の配列や連想配列について 最近どういう解釈をしていいのか わからなくなってしまいました。 仮にPerlで話をさせてもらいますと、 連想配列%FORMがあるとき、 個々の要素にアクセスする場合 例えば$FORM{'name'}などと記述しますが、 この$FORM{'name'}を みなさんはどのように解釈しているでしょうか? $FORM{' '}にキー nameを 代入しているようなイメージで、 「連想配列%FORMからキー'name'の値を取得する」 という考え方でしょうか? わたしは最近、 $FORM{'name'}はそれ自体が一つの変数という 考え方が出来るのではないかという気がしているのですが、 連想配列の実装から考えると この考え方は正しいのでしょうか? 以前、配列について同様の質問を したことがあります。 例えばC言語でint a[100]と宣言した場合は、 連続的なアドレスに確保されるため、 a[2]はaという名前のアドレスから a + 2 番目の場所という意味になるが、 言語によっては不連続なアドレスに 確保されるため、a[2]は一つの変数名として 考える必要がある・・ との回答でした。 ならば連想配列の場合も もし不連続なアドレスに確保されるならば、 $FORM{'name'} は一つの変数名と 考えたほうが正しいのではないかと 思ったからです。 連想配列の内部的な処理がどうなっているのか 教えて頂きたいです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 動的配列の賢い使い方

    動的配列について質問です。 構造体を動的配列で今ボタンを押すたびに値を追加しています。 i = i+1 Redim preserve a(i) as ユーザ定義 ただこの方法だと追加するだけならよいのですが、 削除の時に問題があります。 例えば、配列が5つあるとします。 削除のボタンをクリックし2番目の配列を削除したとします。次に追加ボタンをクリックすると6番目に追加します。 これですと、2番目の値がないのに(5つしかないのに)6つ分のメモリを確保することになると思います。 上手はメモリ確保方法はないでしょうか? 構造体のデータは、 ・index ・文字列 ・数値 をそれぞれ持っており、indexは一応追加するごとに増えていくようになっています。 うまく説明できませんが、よろしくお願い致します。