【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.20695

HIGH-VALUEは存在しますか?
投稿者---ringo(2005/04/20 14:23:35)


Windows2000 Microsoft Visual C++ を使用しています。

質問なのですが、COBOLで言うところの「HIGH-VALUE」のようなものは
Cには存在しないのでしょうか?

キーのマッチングをしていて、ファイルEOFの場合、
キーエリアにHIGH-VALUEのようなものをセットしたいと考えています。

現在はEOFの時に'Z'でキーエリアを埋めています。
比較する値は数字しか入らない予定です。

いくつか下のツリーを見て「A < Z」は環境によって
そうじゃなくなる場合があると見まして不安になりました。
「数値<Z」の場合でも環境によっては保証されないのでしょうか?
現在の環境ではうまくいってるみたいですが・・・。

ご教授、宜しくお願い致します。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:HIGH-VALUEは存在しますか? 20696 Ban 2005/04/20 14:53:42


No.20696

Re:HIGH-VALUEは存在しますか?
投稿者---Ban(2005/04/20 14:53:42)


>質問なのですが、COBOLで言うところの「HIGH-VALUE」のようなものは
>Cには存在しないのでしょうか?

ありません。

>現在はEOFの時に'Z'でキーエリアを埋めています。
>比較する値は数字しか入らない予定です。

前提が数値以外全て無効値であれば、
isdigit なり isalpha なりの比較(もしくは直接 == 'Z'とか)
でもいいのではないでしょうか。

>「数値<Z」の場合でも環境によっては保証されないのでしょうか?

C 言語の標準規格(ISO/IEC9899:1990)を見る限り、
「数字」と「英字」のコードについては順序の保証がありません。

数字がシーケンシャルな事は保証されてますので、
数字に対して「0以上かつ9以下か」という形の評価はできると思いますが、
逆に言うと、それくらいしか数字と英字に対する直接範囲の評価は保証されません。

# そういう環境依存を吸収するのが標準ライブラリの is〜 などの仕事です。


不等号で他の数値と同列に判断したいのであれば、
HIGH_VALUE をマクロなりで定数適宜しておいて、
環境毎に数値より大きな文字コードを設定させるとか.....。
# で、現環境では Z を使う。


この投稿にコメントする

削除パスワード

No.20697

Re:HIGH-VALUEは存在しますか?
投稿者---ringo(2005/04/20 15:26:23)



>前提が数値以外全て無効値であれば、
>isdigit なり isalpha なりの比較(もしくは直接 == 'Z'とか)
>でもいいのではないでしょうか。

不等号で他の数値と同列比較したかったのでHIGH-VALUEのような
ものがあれば余計なロジックを書かなくてすむなーと思った次第です。


>数字がシーケンシャルな事は保証されてますので、
>数字に対して「0以上かつ9以下か」という形の評価はできると思いますが、
>逆に言うと、それくらいしか数字と英字に対する直接範囲の評価は保証されません。

さらに質問して申し訳ないのですが
1<2 というのは保証されるけれど
"1"<"2" というのは保証されないのでしょうか?


>不等号で他の数値と同列に判断したいのであれば、
>HIGH_VALUE をマクロなりで定数適宜しておいて、
>環境毎に数値より大きな文字コードを設定させるとか.....。

せっかく教えていただいたのですが、環境毎に設定を変えるということを
あまりしたくないので、今回はロジックで逃げることにします。




この投稿にコメントする

削除パスワード

No.20699

Re:HIGH-VALUEは存在しますか?
投稿者---YuO(2005/04/20 15:55:57)


>さらに質問して申し訳ないのですが
>1<2 というのは保証されるけれど
>"1"<"2" というのは保証されないのでしょうか?

当然保証されません。
'1'<'2'であれば保証されますが。



この投稿にコメントする

削除パスワード

No.20702

Re:HIGH-VALUEは存在しますか?
投稿者---REE(2005/04/20 16:47:14)


>不等号で他の数値と同列比較したかったのでHIGH-VALUEのような
>ものがあれば余計なロジックを書かなくてすむなーと思った次第です。

char型を使っているのであれば、CHAR_MAXはどうですか?
(int型を使っているのであれば、INT_MAX)
まあ、環境によってはCHAR_MAX == '9'の可能性もないとは言えませんが、その場合は、もともとHIGH-VALUEにあたるものが存在しません。


この投稿にコメントする

削除パスワード

No.20708

Re:HIGH-VALUEは存在しますか?
投稿者---ringo(2005/04/20 19:44:58)


>char型を使っているのであれば、CHAR_MAXはどうですか?
>(int型を使っているのであれば、INT_MAX)

ということは、現在

memset( sBuff, 'Z', sizeof( sBuff ) - 1);

としてるところを

memset( sBuff, CHAR_MAX, sizeof( sBuff ) - 1);

にするということでしょうか?




この投稿にコメントする

削除パスワード

No.20709

Re:HIGH-VALUEは存在しますか?
投稿者---RiSK(2005/04/20 22:10:15)


どうも,COBOL で旧二種を取った RiSK です。

>>char型を使っているのであれば、CHAR_MAXはどうですか?
>>(int型を使っているのであれば、INT_MAX)
>
>ということは、現在
>
> memset( sBuff, 'Z', sizeof( sBuff ) - 1);
>
>としてるところを
>
> memset( sBuff, CHAR_MAX, sizeof( sBuff ) - 1);
>
>にするということでしょうか?

sBuff はどのように定義されていますか?
(文字列のための)char の配列でしょうか?
単に sBuff[0] = '\0'; ではダメなのでしょうか?


この投稿にコメントする

削除パスワード

No.20715

Re:HIGH-VALUEは存在しますか?
投稿者---ringo(2005/04/21 09:30:23)


>sBuff はどのように定義されていますか?

typedef struct KEY_AREA
{
    char            sKey1[3];
    char            sKey2[2];
    char            sNull;
} KEY_AREA;

KEY_AREA    stKeyFile1;  //ファイル1用キーエリア

KEY_AREA    stKeyFile2;  //ファイル2用キーエリア


このように定義してファイルを読み込んだ後
ここにキーの値をそれぞれセットしています。
そしてここの値を比較しています。


>単に sBuff[0] = '\0'; ではダメなのでしょうか?

COBOL的な話になって申し訳ないのですが・・・。

マッチング処理をする時、二つのファイルを読み込み、
キーを比較し小さい方から順に処理していきます。

ファイル1のキー "12345"  ファイル2のキー "67890"の場合は
ファイル1から処理をします。

COBOLですとファイルEOFの場合、HIGH-VALUEをキーエリアにセットしておけば
比較の時に特にロジックを追加せずともEOFになってない方のキーを処理してくれます。

Cで書くならば

    if (memcmp( stKeyFile1, stKeyFile2, sizeof(KEY_AREA)) < 0 )
    {
        //ファイル1の処理をする

    }
    else
    {
        //ファイル2の処理をする

    }


CにはHIGH-VALUEが存在しないということなので、EOFの時に
キーエリアを'Z'で埋めてHIGH-VALUEと同じようなことをしたかったのですが
環境によって "67890"<"ZZZZZ" が保証されないと
EOFになっているファイルの処理へいってしまい
おかしなことになるなと思ったので質問しました。

EOFで stKeyFile1[0] = '\0'をセットすると
memcmpで比較した時、EOFになっていない方の処理になってくれるでしょうか?




この投稿にコメントする

削除パスワード

No.20728

Re:HIGH-VALUEは存在しますか?
投稿者---RiSK(2005/04/21 23:53:13)


>COBOL的な話になって申し訳ないのですが・・・。

元 COBOLer ですから,そこら辺は何となく分かります。
# マージとかソートとか COBOL が得意な処理ですし。

>環境によって "67890"<"ZZZZZ" が保証されないと
>EOFになっているファイルの処理へいってしまい
>おかしなことになるなと思ったので質問しました。

比較関数をちゃちゃっと書いちゃった方が早いですね。
数字と大文字小文字のアルファベットしか現れませんか?
数字とアルファベットはどちらが大きいですか?
大文字と小文字はどちらが大きいですか?

>EOFで stKeyFile1[0] = '\0'をセットすると
>memcmpで比較した時、EOFになっていない方の処理になってくれるでしょうか?

(なぜ memcmp? というのはおいといて,)なりません。
配列の最初の要素の値が 0 になりますから。一番小さいですね。


この投稿にコメントする

削除パスワード

No.20729

Re:HIGH-VALUEは存在しますか?
投稿者---RiSK(2005/04/21 23:59:32)


アホなこと聞いてますね。ごめんなさい。

>数字と大文字小文字のアルファベットしか現れませんか?
>数字とアルファベットはどちらが大きいですか?
>大文字と小文字はどちらが大きいですか?

これ,撤回。


数字しか現れないのであれば (unsigned) int であつかった方がいいのでは?
桁が決まっているのであれば,その限られた桁で表せる数より大きい数を
セットすればいい。
場合によっては -1 を使うって手もありますね。


この投稿にコメントする

削除パスワード

No.20730

Re:HIGH-VALUEは存在しますか?
投稿者---ringo(2005/04/22 09:23:32)



>数字しか現れないのであれば (unsigned) int であつかった方がいいのでは?
>桁が決まっているのであれば,その限られた桁で表せる数より大きい数を
>セットすればいい。
>場合によっては -1 を使うって手もありますね。

ありがとうございます。
今は数字のみなのですが、キーによっては数字変換できないくらい桁があるうえ
今後キーに文字列が入らないとも限らないので何とか文字列のまま比較したかったのです。

前に教えていただいたCHAR_MAXで埋めるという方法をやってみましたが
うまくいくみたいなのでこれでやってみて、稼動環境での結合テストで問題がでたら
フラグを持つなりして逃げたいと思います。


ちなみに・・・
>(なぜ memcmp? というのはおいといて,)

この関数を使うのは間違ってますか?
比較関数はこれかなと思ったので、もっといい方法があるのでしたら
是非教えてください。



この投稿にコメントする

削除パスワード

No.20753

Re:HIGH-VALUEは存在しますか?
投稿者---RiSK(2005/04/22 18:44:22)


>今は数字のみなのですが、キーによっては数字変換できないくらい桁があるうえ
>今後キーに文字列が入らないとも限らないので何とか文字列のまま比較したかったのです。
>
>前に教えていただいたCHAR_MAXで埋めるという方法をやってみましたが
>うまくいくみたいなのでこれでやってみて、稼動環境での結合テストで問題がでたら
>フラグを持つなりして逃げたいと思います。

キーによって桁が違うことがある? じゃあ,memcmp はダメでしょう。
# もちろん,strcmp でもダメ。
memcmp("1234", "567") は > 0 を返すと思っていますか?
数値の比較であれば 1234 > 567 であることは自明ですが,
文字列の比較の場合,先の例では,
初めに '1' と '5' を比較しますから,< 0 を返しますよ。
この動作は希望通りですか?
希望通りではない場合,比較関数を書く必要があります。

それに修正する可能性があるなら,なおさら比較関数を書くべき。
# 書くのに30分かからないと思いますよ。


>ちなみに・・・
>>(なぜ memcmp? というのはおいといて,)
>
>この関数を使うのは間違ってますか?
>比較関数はこれかなと思ったので、もっといい方法があるのでしたら
>是非教えてください。

strcmp の方がふさわしいと思ったからです。
とはいえ,いずれも希望通りではないのであれば,どっちもダメですね。


# なんか設計がいけてないような気がしてきた。
# COBOL と C は違うと言うことを ringo さん周辺は理解しているのだろうか?


この投稿にコメントする

削除パスワード

No.20785

Re:HIGH-VALUEは存在しますか?
投稿者---ringo(2005/04/25 11:05:53)



お返事ありがとうございます。

>キーによって桁が違うことがある? じゃあ,memcmp はダメでしょう。

桁が違うこともありますが、必ず前ゼロで埋まっているので
大丈夫だと思いました。

>この動作は希望通りですか?
>希望通りではない場合,比較関数を書く必要があります。

今のところは希望通りの動作をしてくれています。
でも比較関数を書いたほうが安全ですね。
横着しないで関数作ります。


># なんか設計がいけてないような気がしてきた。
># COBOL と C は違うと言うことを ringo さん周辺は理解しているのだろうか?

設計者がCOBOLしか知らず、Cのことを勉強してくれようとしないので・・・。
んー、愚痴でした。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧