• ベストアンサー

COBOLで、文字タイプのフィールドを文字コードで指定したい。

Cで書くと以下のようになるものをCOBOLで実装したいと思っています。 --------------------- int i; char c[4]; c[3] = '\0'; for (i=0;i<3;i++) { c[i] = '0'+i; } /* 結果、c = "012"となる。 --------------------- つまり、文字コ-ドを数値タイプのフィールドで計算して、その結果を文字タイプのフィールドに代入したいのです。 COMPUTE句で書いてみると数値タイプを文字タイプに代入できないと怒られてしまい、困ってしまいました。 COBOLで文字タイプのフィールドのデータを文字コードで指定(数値タイプでの演算結果で指定)するにはどうしたらいいのでしょうか?

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

  • ベストアンサー
回答No.2

くまです。 考え方は、プログラマーの設計次第でいろいろあります。一概にこれが回答!とはいえませんが、ご質問の主旨を理解して参考回答させて頂きます。 「考え方」として、COMPUTE を使用すること、これは繰り返しの添え字として利用することと、最後の変数に転送する結果の位置決めとして利用します。 すなわち、 IとCの関係は、1->0、2->1、3->2となるようにしなければなりません。 ここで、別にワーク変数をもたせれば簡単に出来ます。よって、Aという演算結果を別変数に持たせます。そして、書き出せばよいわけです。 注意点として、ご使用の環境がわかりませんのが、今回、部分参照を使用していますので、この命令が使用できる環境か確認ください。 (参考) 01__I__PIC_9(1)_VALUE_ZERO. 01__A__PIC_9(1)_VALUE_ZERO. 01__C__PIC X(3)_VALUE_SPACE. * PERFORM___VARYING___I___FROM___1___BY___1___UNTIL___I_>_3 ______COMPUTE_A_=_I_-_1 ______MOVE___A____TO__C_(I:1) END-PERFORM. * DISPLAY___"結果="__C__UPON__CONS. "_"は空白です。見にくくなりますが、ごめんなさい。 ”012”が結果表示されます。

banamil
質問者

お礼

ありがとうございます。 バイナリ表現で手間取りましたが、何とかうまくいきました。 未だに暗黙の型変換に慣れることができませんが、これからもがんばります!

その他の回答 (1)

  • tintagel
  • ベストアンサー率77% (214/277)
回答No.1

COBOLの文字コードを数値で表現するときはバイナリを使います。 (特に1文字に対応するバイナリの表現はメーカによって異なり、桁数が違うこともあります。お使いになるCOBOLを確認して下さい。) *字下げしてコードを書きましたが回答は詰まって表示されるようです。 01 C. 03 C-OCC OCCURS 3. 05 C-CHR PIC X(01). 05 C-COD-RED REDEFINES C-CHR. 07 C-COD PIC 1(08). または 9(08) BINARY.等 コーディング例(繰り返し部)です。 MOVE "0" TO C-CHR (I). または MOVE '0' TO C-CHR (I). COMPUTE C-COD (I) = C-COD (I) + I.  *MOVE ZERO TO C.を繰り返しの前で行う方が一般的ですが、例は質問のCと対比させましたので、繰り返しの中での設定とZEROでなく"0"で表現しました。 *繰り返しの中のREDEFINESがエラーになるようでしたらエリアを分けて下さい。 01 C. 03 C-OCC OCCURS 3. 05 C-CHR PIC X(01). 01 W-KEKKA. 03 W-K-COD PIC 1(08). MOVE "0" TO W-KEKKA. または MOVE '0' TO W-KEKKA. COMPUTE W-K-COD = W-K-COD + I. MOVE W-KEKKA TO C-CHR (I). *Cの結果を"012"になるようにしています。

関連するQ&A

  • 演算フィールド>文字を数値にしたい

    「740」という文字があるとして、それを数値にするにはどうしたらいいでしょう。 #演算フィールドで ★[結果] ★の部分に何か? #アクセス超素人。

  • COBOLから呼ばれる時

    COBOLプログラムから呼び出され、ファイルのレコードを一行読んでレコードの内容を返すというcサブルーチンを作っているのですが、COBOL←→c間でのインタフェースの扱いかたがよくわからなくて困っています。(ちなみにこのモジュールはcからも呼ばれる事がある) COBOLはコピー句(test001.cbl, test002.cbl)に値を入れて、cサブルーチンにそれを渡しています。 テストはCOBOL85を使用してるので、cサブルーチンの中のデータを見ることができません。なので、返ってくるコピー句の中身を見るのですが、とにかく値が設定されてかえってこないのです。ただ単にロジックのバグと言う可能性もあるけど(^^; 私はインタフェース環境の事がまだ良く解っていないので、今回こちらに質問した次第です。経験者の方がいましたら、どうかおしえてください。 あ、それからCOBOLから渡される値は、c側では全てchar型で受け取らなければいけないような話しを聞いたのですが、本当でしょうか? もう一つ。 コピー句の中で「F-CODE PIC X(2)」のようにハイフンがあるのですが、cではハイフンが使えないからダメなんでしょうか? たくさん質問してしまいましたが、どうかよろしく。 /COBOL側/ -------------------------------------------------- CALL 'TEST1' USING BY VALUE TEST001 TEST002. -------------------------------------------------- /cサブルーチン側/ -------------------------------------------------- int TEST1(test001, test002) char *test001; char *test002; {     ・     ・     ・ return (0); } --------------------------------------------------

  • ■ 文字コードの出力について ■

    符号付char型の変数「moji」に文字を代入し、その文字コードの上位4ビットと下位4ビットをそれぞれAND演算でビットを抽出し、算術右4シフトと算術左4シフトで処理して元の上位4ビットと下位4ビットを入れ替えて文字コードを出力するC言語プログラムです。 例えば、「A」の文字コード「41」を「14」で出力します。 問題は「N」です。 「N」の文字コードは「4E」です。これを「E4」に変えて出力したいのですが、「ffffffe4」となってしまいます。 解決策は、符号無しchar型の変数にすることが分かりました。 なぜ、符号無しchar型の変数にしないと正常に表示できないのでしょうか? コンパイラは「Borland C++ Compiler 5.5」です。 お答えできる方、よろしくお願いいたします。

  • 文字を整数として扱う場合の演算について質問

    javaの参考書に、文字を整数として扱う場合の演算についての解説があり、疑問点があったので質問します。 質問1:何故char型の変数は、キャストしなくてもint型のリテラルを代入することができるのか?      例えば、 以下の演算はキャストしなくてもこのまま代入できます。 char ch='a'; ch=98; でも、以下の演算はキャストしていないのでエラーになります。      char ch='a'; ch=ch+1; これは何故ですか?参考書に記載されていた理由として、「byte,char,short、 これ等の型の変数や値を使って計算すると、それ等は一度intに直して計算されるから」というような趣旨の事が書いてありました。 つまり、char型の変数には、キャストしない限りint型の数値を代入できないということですよね? でも前者のソースコードは、chはchar型であるにもかかわらず、int型のリテラル98を代入できています。 これは何故ですか? 質問2:javaの参考書に、インクリメント・デクリメント演算子と複合代入演算子は、型を保存するという解説がありました。これはどういう意味ですか? 僕の仮説では、例えば、      char ch='a';      ch+=5; であれば、5は、char型のまま代入されるということでしょうか?

    • ベストアンサー
    • Java
  • SQLiteでの全角文字

    SQLiteで作ったテーブルで、データ型をcharで指定したフィールドに全角文字を代入すると、.headerをonにして、.modeでcolumnを指定したときのselect文での表示がずれてしまいます。 具体的には、全角文字を代入したフィールドの次のフィールドがずれて表示されるのです(画像参照)。 単に表示する上での問題なので、実質的な問題にはならないのですが、他人にSQLを教えるために使いたいと思っているので、できればきちんと表示させたいと思っています。 何かいい対処法はありますでしょうか。

  • 文字を数値化する方法で詳しく教えて

     すいませんが、C言語わかる方おしえてください。  もともとchar型で例えば  char buf[13]となっているものを  数値化するために、buf[i]-'0'として数値化する。という  記述があるのですが、これで数値化されたことになるのでしょうか? ちなみにこのbuf[13]にはgets(buf)で0~9の数字を自分でいれるので  buf[0]からbuf[13]で数字列がはいります。  別件で  char ac ,buf[13];で  ac=buf[i++]のように記述すると、演算子の+,÷,-,+が決められtるそうなのですが、この記述方法でいいのか判断して欲しいです

  • 数字を文字列に

    int i = 10; char *ch; とするとiを文字列としてchに代入し結果が ch[0] = 1 ch[1] = 0 となるようにするにはどう組めば良いのでしょうか? よろしくお願いいたします。

  • 1フィールド目を16文字目の後に半角スペースを入れたい

    repquota -a コマンドにてユーザ容量を 割り出しております。しかし、16文字に設定されたユーザ名の 後に2フィールド目であるはずのハイフンがくっついて表示されて いるため、【ユーザ名--】という文字列が1フィールド目に なってしまいます。 その為、1フィールド目の16文字目の直後に半角スペースを 入れるという指定をしたいのです。 以下はわかりやすく16文字まで指定できるユーザ名を 数字だけにしました。2フィールド目に必ず--とハイフンが 2回続きます。ユーザ名の中にハイフンが2回続くことも考えられる ので、悩んでおります。 1234567891123456-- 50 50 123456789--23456-- 20 20 本来であれば容量の50と20という数値は3フィールド目と4フィールド目 であって欲しいのです。 substr($1,1,16)を使ってみましたが、3フィールド目と 4フィールド目の数値を計算して現在のディスク使用率を 出したいので、1フィールド目の16文字目の直後に半角 スペースを入れたいのです。 どうしたらよいでしょうか

  • 文字型配列に数値を文字として代入したいです

    掲題の通りですが、listという配列に数値や文字を入れたいです。 数値は必ず整数1桁、文字はAかBの1文字です。 配列は char list[] = new char[8]; として定義しています。 numにAかBを入れると、代入も表示もうまくいきます。 しかし、数値を入れると以下のような動作となります。 list[i] = num とすると 「不適合な型: 精度が失われる可能性があるintからcharへの変換」 というエラーが表示されます。 list[i] = (char)num; に変更するとエラーは出ませんが、表示がうまくされません。 list[i] = String.valueOf(num); に変更すると 「エラー: 不適合な型: Stringをcharに変換できません:   list[i] = String.valueOf(num);」 というエラーが表示されます。 何か良い方法はないでしょうか。

  • 文字列と整数型について

    はじめまして。 どうしても困っているのでヒントでも良いのでおねがいします。 関数内(func1)で確保した文字列変数のポインタを 別の関数(func2)にポインタ渡しします。 func2内で整数型で計算した結果を引数で示された文字列変数に 代入するというようなことをしたいと思ってます。 ここで、intは4byteとします。 メモリ長だけで見ると、bit[4] = tmp です。 void func1(){ char bit[4]; func2(bit); return; } void func2(char* p){ int tmp = 0x10101100; p = tmp; <---- ??? return; } そこでどのようにすれば、 代入することができるのか分かりません。 以下のような結果になるように代入したいと思っています。 bit[0] = 0x10; bit[1] = 0x10; bit[2] = 0x11; bit[3] = 0x00; 小さな文字列型に整数型をどのように渡せばよいのかが 一番疑問に思っているところです。 整数型に文字列型を代入する場合には 文字列のバイト指定とシフト演算で実現できています。 ヒントでもよいのでお願いします。