過去の桐井戸端BBS (桐ver.8)
13689 未定義値の変数の計算結果は未定義値? 小川 伸二 2001/10/24-16:46
お世話になります。桐Ver8 SP6 & Win200 です。
タイトルの通り未定義値の変数を計算(加算等)に加えると結果が未定義値になるのですが、
表の項目のように変数にも未定義値処理(ゼロ or 未定義)のパラメータがあるのでしょうか?

現状
フォームからのイベントのメイン部にて変数宣言をします。
変数宣言 固有,数値{&A,&B}

フォームに各変数の入力用にテキストボックスを作成してます。
更に &A+&B をソースにしたテキストボックスも配置。

&A に入力しても&A+&B をソースにしたテキストボックスは
未定義値のままです。

変数宣言時に初期値を入れると計算します。
変数宣言 固有,数値{&A=0,&B=0}

これは仕様でしょうか?宣言時に初期値を入れれば良いのですが
画面上に 0 が出て目障りなのと、実際は配列を使っており、
かなりの数の変数があるので初期値設定を忘れると大変です。

よろしくお願いします。

PS.以前はこんな事なかった様な気がするのですが...
13690 Re:未定義値の変数の計算結果は未定義値? アックン 2001/10/24-18:17
記事番号13689へのコメント
小川 伸二さん、こんばんは。

題名の「未定義値の変数の計算結果は未定義値?」はその通りです。
そもそも算術で未定義値を四則演算できないからなんでしょうけど、桐はエラーは返しませんので、あれっと思うんでしょうね。

こういうときには、#未定義値変換(#NVL)という関数を使います。

例1: #nvl(&A+&B,0)

&A か &B のどちらかまたは両方が未定義値のとき、0 を表示します。

画面上の 0 が目障りとのことでしたら、下のようにもできます。

例2: #nvl(&A,"")+#nvl(&B,"")
例3: #nvl(&C[1],"")+#nvl(&C[2],"") ←配列変数使用時

またこれ以外に用途によっては、文字でエラー表示することもできます。

それと、すでにご存じかもしれませんが、

変数宣言 数値 { &C[100]={0} }

という書式で、100個の配列に一斉に 0 を代入できます。

アックン(=^・^=)
13696 Re:未定義値の変数の計算結果は未定義値? アックン 2001/10/25-01:03
記事番号13690へのコメント
例の2と3は計算結果をわざわざ未定義値にしても意味ないから、ボツ。(^^;

例1の解はウソだから、これもボツ。(^^;
そこで、新たに・・・・

例4: #nvl(&A,0)+#nvl(&B,0)

なんてすれば、入力しないテキストボックスは 0 として扱うという、
表のゼロと未定義値の設定もどきになると思います。
あくまでフォームがそういう用途に限定される使い方ですけど。

とはいえ、未定義値は未定義値としてとして扱うのが一番素直です。
&Aと&Bのテキストボックスに何も入力されてないときは、
答えのテキストボックスに何も表示されないのが普通でしょうし、それが正解なのですから。

(=^・^=)

13697 未定義値は 佐田 守弘 2001/10/25-01:33
記事番号13689へのコメント
小川 伸二さん
過去ログにも書いてありますが、改めて「未定義値は何?」
を説明します。

問題となるのは、数値系の値の未定義値なのですが、未定義値は文字どおり値が定義されていない値、何もない値なのです。
「何もないならゼロではないか」
と思いたくなりますが、ゼロは「0」という値があります。
しかし、未定義値な全く値が書いてない状態なのです。

詳しくは過去ログを参照してもらえば分かりますが、表ファイルに書かれている状態を調べてみると、本当に何も書かれていません。
これはちょうど文字列であればヌルストリング(「""」と同じ)の状態です。

つまり、「0」と書かれているのがゼロの値なのに対して、未定義値は全くの白紙の状態です。

分かりやすい喩えで申しましょう。
空っぽの財布(空だと分かっている財布)の金額は0です。
これに対して、買ったばかりの宝くじの当選金額が未定義値だと思って下さい。
「暮れのボーナスに宝くじの当選金額を足したらいくらになるだろう」
これは分からないですよね(想像を膨らませるのは勝手ですが)。

ですから、どんな値でも、分からない値(未定義値)を足すと、分からない値になってしまうのです。

佐田守弘(KS-00119)

13700 Re:未定義値の変数の計算結果は未定義値? 小川 伸二 2001/10/25-08:45
記事番号13689へのコメント
アックンさん、佐田さん 有難うございました。
大変よく判りました。

> 変数宣言 数値 { &C[100]={0} }

知りませんでした助かりました。
繰り返しコマンドで代入しようかと思ってました。

> とはいえ、未定義値は未定義値としてとして扱うのが一番素直です。
> &Aと&Bのテキストボックスに何も入力されてないときは、
> 答えのテキストボックスに何も表示されないのが普通でしょうし、それが正
> 解なのですから。

すいません、書き漏らしました。
&Aと&B両方未定義値なら良いのですが&Aだけに値を入力した所
&A+&Bの式のテキストボックスが未定義値だったもので
オロオロしてしまいました。

> 過去ログにも書いてありますが、改めて「未定義値は何?」
> を説明します。

すいません、以後気をつけます。


有難うございました。

戻る