いや、まだだから

やまだの仮想庭園 ~ いつか実体の伴う日まで

目次

Blog 利用状況

記事カテゴリ

書庫

日記カテゴリ

リンク

0 ベースなんだけど……

ネタ元:0 ベース vs 1 ベース

ネタ元:どんだけ~?

ちと出遅れた感がありますが。

Visual Basic で特に変だと思うところ。

Dim i As Integer
Dim aaa(10) As Integer
For i = 0 To 9
    aaa(i) = i
Next

とかって書く代わりに、1 ベースで

Dim i As Integer
Dim aaa(10) As Integer
For i = 1 To 10
    aaa(i) = i
Next

と書く。それは良いと思う。

Java とかに慣れた人には違和感があるかもしれないけど、この辺は文化の問題かもしれない。

確かに、サイズ10の配列なら10番目の要素を「10というインデックスで」アクセスしたい、という主張もわからないでもない。

でも、だったら、1ベースで数え始めるべきじゃないのか?

Dim i As Integer
Dim aaa(10) As Integer
For i = 0 To 10
    aaa(i) = i
Next

って書けるのはおかしくないか?

実際、MSILでも、配列宣言のところは

IL_0001:  ldc.i4.s   11
IL_0003:  newarr     [mscorlib]System.Int32

とかってコード吐いてるし。単に一つ余分に作ってるだけでは……。

10個のつもりで11個の配列を作ってることの弊害の方が大きいような気がする。下手するとバグの温床?

せめて Option base 1 をデフォルトにできないものなのかなぁ。

投稿日時 : 2007年7月30日 15:49

Feedback

# re: 0 ベースなんだけど…… 2007/07/30 16:02 片桐

うん、VB.NETから、Option Baseは0固定になって、
Dimの配列の括弧の中の数字は、配列の個数から配列の上限インデックスになった、ってことらしいの

VB4脳では、

dim Hoge (1 to 10 ) as string

と書けたのがだめになったってことだね。

発想の切り替え、ここが進化の分かれ目らしいよ>おい

# re: 0 ベースなんだけど…… 2007/07/30 16:07 やまだ

いや、だめにはなってないのが問題かと。
配列ひとつ作るたびに、0番目の要素が無駄になる、と。
いーのかそれで、と思ったりするわけです。

# re: 0 ベースなんだけど…… 2007/07/30 16:51 囚人

話の真意が掴めないので、教えて欲しいのですが

Dim i As Integer
Dim aaa(10) As Integer
For i = 1 To 10
aaa(i) = i
Next

が、「良い」理由って何なんでしょう。
0 番目が無視されているのはダメなんですよね?

サイズ 10 の配列を作るのは以下が正しいんですよね?

Dim i As Integer
Dim aaa(9) As Integer
For i = 0 To 9
aaa(i) = i
Next

# re: 0 ベースなんだけど…… 2007/07/30 16:55 刈歩 菜良

> いや、だめにはなってないのが問題かと。
Visual Studio 2005 だとエラーになりましたよ。
“配列の下限に指定できるのは'0'のみです。”
だそうです。

どうやったらOKになるのでしょうか?
コンパイラオプションいぢるのかしら?

# re: 0 ベースなんだけど…… 2007/07/30 16:55 とりこびと

>って書けるのはおかしくないか?

書けること自体はおかしくないと思いますけど・・・。

i(ループコントロール変数) は aaa のためだけにあるわけではないですし・・・。

って、なんか読み間違えてますか?(^^;

# re: 0 ベースなんだけど…… 2007/07/30 21:51 片桐

うーん、つまり、

Dim Hoge(10) as string

というのが、VBさんでは
Hoge要素が10個、という定義だった過去があるのに
VB.NETさんでは
Hoge要素のUboundは10です、
という宣言のみになっちゃったってこと……
過去は捨てたの、生まれ変わったのよ私!とでもいうのかな(汗)

かるぼさんが困っちゃったことは私も困ったもの。今は慣れたけど。つまり、作る側の脳みそを、VB脳から.NET脳へ切り替えないとね、というのがシーラカンスな私の意見だったのですです。

源氏物語の原典をばさっと出されて読めっていわれて、平安時代の草書をすらすらと読める人が稀有なように、時代の流れで同じ「言語」でも意味が変わっていっちゃうってことだと思うの。

# re: 0 ベースなんだけど…… 2007/07/30 21:57 やまだ

すみません、紛らわしい書き方でした。
>“配列の下限に指定できるのは'0'のみです。"
です。
いや、仕様として、この場合'1'のみにしないと変なのでは、と。
だって、Dim aaa(10)って宣言してるのに、11個の要素の配列になるんですよ。私はその辺が気持ち悪いのですが、そんなことないですか?
#まず VB より日本語をちゃんと書けるようにするのが私の急務かも。

# re: 0 ベースなんだけど…… 2007/07/30 22:03 片桐

うーん、Cは実は配列のインデックス下限=0が当たり前だったと思うの。
このあたり、実はVBがずっと異端児というか鎖国でいたんだけど、.NET Freameworkだの、なんだのと.NETな黒船がやってきて開国させられて、好きに出来た配列要素の定義を「(C系言語の)世界共通の必ず0から」に合わせられちゃった、と言うほうが正しいと思う。

だから要素インデックス上限=10は11個の配列宣言、になっちゃったんですよ……

char Hoge[10]; と同意になっちゃった、と。

気持ち悪いというより、ちょんまげ切るしかなくない?っていう気持ち(遠い目)

# re: 0 ベースなんだけど…… 2007/07/30 22:21 やまだ

鎖国したままで良いじゃん、とか思ったりしますが。
んで、こっそりMSILレベルで、他の.NETと密輸する、と。
1ベースにして、MSILに変換するときに -1 すれば良いだけなのでは、とか思うんですけどねー。
#ちょんまげ切っても、かつらかぶれば誤魔化せる?

# re: 0 ベースなんだけど…… 2007/07/31 9:14 とりこびと

なるほど・・・
「Option Baseのサポートは維持してほしかった」
ということですか?

このあたりは個人的な想いになるとおもいますが、私は.NET以降で

Dim i As Integer
Dim aaa(10) As Integer
For i = 1 To 10
aaa(i) = i
Next

こう書く事のほうがちょっといやです。

# re: 0 ベースなんだけど…… 2007/07/31 9:33 Mr.T

Mr.Tです、こんにちは。

いちいち脳内で配列の添え字を考えなくちゃならないよりも、Size=10の方がなんぼか好きです。

配列を1から数えたい場合って、その配列を順位リストのように、添え字そのものに順位の意味をもたせてしまっているのが原因ではないかと個人的には感じてます。

# re: 0 ベースなんだけど…… 2007/08/01 0:59 やまだ

>「Option Baseのサポートは維持してほしかった」
> ということですか?
というより、消すならデフォルトは1じゃないの?と思うんですよね。
> こう書く事のほうがちょっといやです。
好き嫌いの話はおいておくとしても、今の仕様って考え方が一貫してないのでは?と思うのですが。
サイズ10で配列を宣言したのだから、0~9もしくは1~10のどっちかにして欲しい。

# re: 0 ベースなんだけど…… 2007/08/01 10:31 囚人

まだちょっと理解できなくて申し訳ないのですが、

>サイズ10で配列を宣言したのだから、0~9もしくは1~10のどっちかにして欲しい。

C系列言語では
int aaa[10]
と書けば、「サイズが10の配列」という意味ですが、

VB.NETでは
Dim aaa(10) As Integer
と書けば、「添字が10までの配列」という意味ですよね。決して「サイズ10の配列宣言」という意味ではないと思うのですが。

# re: 0 ベースなんだけど…… 2007/08/01 12:26 やまだ

> まだちょっと理解できなくて申し訳ないのですが、
いえ、私の理解の浅さと文章力の低さにおつきあいいただいてるので、こちらの方が申し訳ないです。

あ、今はそういう位置づけなわけですね。
でも、「以前は option base 0 だと 9 までだったけど、10 という添え字も使いたいからという理由で拡張された」という話を聞いたことがあるので。
旧バージョンからの概念的移行が難しいなぁ、と。

# re: 0 ベースなんだけど…… 2007/08/01 13:07 囚人

>でも、「以前は option base 0 だと 9 までだったけど、10 という添え字も使いたいからという理由で拡張された」という話を聞いたことがあるので。
>旧バージョンからの概念的移行が難しいなぁ、と。


あぁなるほど。旧バージョンをよく知らないのですが、確かにそんな経緯があると混乱しそうですね。

# re: 0 ベースなんだけど…… 2007/08/02 9:26 とりこびと

>添字が10までの配列

こう書けばよかったんですね・・・私も日本語がまだまだです。orz

# re: 0 ベースなんだけど…… 2007/08/03 2:36 やまだ

この前、日本語検定の二級はとったんだけどなぁ。
うーむ、実態が伴ってないですね。精進しなきゃー。
……何か違うっ!

# [画像処理](x1,y1,x2,y2) vs (x,y,width,height) 2008/03/16 8:16 myugaruの色々構想中・・・!

[画像処理](x1,y1,x2,y2) vs (x,y,width,height)

# [画像処理](x1,y1,x2,y2) vs (x,y,width,height) 2008/03/16 8:19 myugaruの色々構想中・・・!

[画像処理](x1,y1,x2,y2) vs (x,y,width,height)

タイトル  
名前  
Url
コメント