「なでしこv1」開発掲示板

なでしこv1のバグや要望を書き込む掲示板
[一覧へ] > (@56) [低] [解決]
@56■ (#146) Nullを表ピックアップ・完全一致ピックアップ - なこちゅ (2008-10-10 10:46) /低 未処理
【症状】表ピックアップで「」の結果がおかしい。
「」以外はピックアップ出来ない。
【再現方法】
//
商品は「1,チョコレート,200
2,バナナ,180
3,バ バロア,300
4,,500
5,,」
A=「」
B≠「」
「表ピックアップ」を表示
商品の1からAを表ピックアップして表示
「---」を表示
商品の1からBを表ピックアップして表示
「表完全一致ピックアップ」を表示
商品の1からAを表完全一致ピックアップして表示
「---」を表示
商品の1からBを表完全一致ピックアップして表示
//
ピックアップ命令の使い方を間違えているのでしょうか?

(#150) 特に問題なし? - U D (2008-10-11 12:37) /低 未処理
http://nadesi.com/man/page/%E8%A1%A8%E3%83%94%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97
のサンプルコードですね。(なぜおでんだけ消滅しているんだ(笑))

こちらの環境では空でも空でなくても上手くピックアップされるようです。
どのような結果になったのでしょうか?

何かを表ピックアップ → 第1列が「何か」を含むような行ばかりを返す
空を表ピックアップ → 第1列が空を含むような行、つまり全ての行を返す

何かを表完全一致ピックアップ → 第1列が完全に「何か」に一致する行ばかりを返す
空を表完全一致ピックアップ → 第1列が完全に空に一致する行ばかりを返す

ちなみに、文字検索で空を探すと、必ず1が返ってきます。
どんな文字列に空を足しても元と同じ文字列ですから、
逆にいえばどんな文字列も空を含んでいると考えられるはずです。

では

(#151) 環境依存かな? - wo6 (2008-10-11 20:26) /低 未処理
うちの環境(vista)では空を表ピックアップすると空でない行が返ってきます。(空は返らない)
表完全一致ピックアップは問題ないようです。

表ピックアップや表完全一致ピックアップはなにかを含んでたり一致するものを返すのものなので、含まないものや一致しないもの返すということはできません。
なので空でない行を返すということは本来できないものだと思います。

あと、B≠「」でBに空ではないという意味をもたせることはできません。
宣言していない変数の中身は変数名の文字列なのでBの中身は「B」になってます。
Bでピックアップしたときなにも返らないのはそのためです。


(#152) 不覚orz - U D (2008-10-11 23:12) /低 未処理
1列目が空でない行は確かに返ってきてませんねぇ。
http://nadesiko.g.hatena.ne.jp/mr-80b/20081011
空は空を含まないみたいなので、下記訂正。
> 空を表ピックアップ → 第1列が空を含むような行、つまり全ての行を返す



> 空を表ピックアップ → 第1列が空を含むような行、つまり第1列が空以外の全ての行を返す

すみません<m(__)m>

空で空を文字検索しても0になるのか…むむむ。
これは……久しぶりになでしこのソースでも洗ってみるか。。。

# φ⊂∀A…ですよね。むしろNULLがどうこうとかなのか

> なので空でない行を返すということは本来できないものだと思います。
空以外の文字列に空が含まれるという判定は妥当だと思いますが。。。

これは結構むずい問題ですねぇ

(#153) 空はどこにあるのか? - wo6 (2008-10-12 02:12) /低 未処理
> なので空でない行を返すということは本来できないものだと思います。
これは表ピックアップの条件に「空でない」を指定して、「どんな文字列でも空でなければ抜き出す」ということはできないという意味で言ってます。
なぜか空を指定することでそれができてしまいますが。

>空で空を文字検索しても0になるのか…むむむ。
これが原因ですかね。
私もどんな文字列にも空が含まれると考えていいと思ってるんで、空は空を含まないというのにはすごく違和感を感じます。

「空はどこにあるのか?」を空で区切って言う
これにも違和感を感じます。
これはこれでいいような気もしますが。


(#155) あ、そういう意味でしたかf(^^; - U D (2008-10-12 14:55) /低 未処理
> > なので空でない行を返すということは本来できないものだと思います。
> これは表ピックアップの条件に「空でない」を指定して、「どんな文字列でも空でなければ抜き出す」ということはできないという意味で言ってます。
あ~そういう意味でしたか。なこちゅさんのサンプルのB≠空について言ってるんですね。
# てかなこちゅさんは単に空でない適当な文字を放り込むと、と言いたかったんだと思いますが^^;

ちなみに簡単にデルファイのコードをなでしこ的に要約すると:

●表ピックアップ
 もしI<0ならば
  Aを反復
   もしTOSTR(対象)でSを文字検索>0ならば
    結果に配列追加
 違えば
  Aを反復
   もし対象[I]でSを文字検索>0ならば
    結果に配列追加
●文字検索
 L=KEYの文字数
 結果=0。I=0
 SのN文字目がNULL文字でない間
  SのNからL文字抜き出す
  もしそれがKEYならば
   結果=N+1。抜ける
  N=N+1
※この簡略化コードはもちろん動きません

という感じ。空でない間進めるループだから、空から検索する場合はループせず初期値の0を返す。
それで、文字検索を使っているピックアップの方も、対象[I]が空だと、「空を含んでいる」と判定してくれない。
うーん。。。文字検索のメインループは後判定にしてもいいような……。

(#199) 文字列検索が修正されたので - なこちゅ (2008-10-15 09:28) /低 解決
こちらは解決と言う事で。
内部的に、表ピックアップ等の命令が内部では文字列検索にあたるのですよね…
混乱しそうなので、そっとしておこうw

(#146)へ返信する:

👆お手数ですが、いたずら防止のために、「真夏」の読み方を記入してください。

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能