NOEMBLEM/エンブレムが設定されていません。

メールの詳細(トピック表示)

Cの構造体と共用体の使い分けについて?

投稿者:"しげぼん"さん  2002/04/14 04:39  MLNo.141   [メール表示]

しげぼんです。

かなり、ご無沙汰してました。
その間、仕事やらPCの調子がおかしくなったり、ゴタゴタ
してたもので。

さて、質問なんですけど。

CまたはC++で構造体と、共用体というものがありますが
これは、どう使い分ければいいのでしょうか?

今、考えているのは、以下のようなデータ構造なんですけど。

  品    名  数量 単価  仕入金額  支払金額  差引残高 
 
\100,000
 商品 A     10 \500 \5,000 \105,000
  支払手形                    ¥100,000 \5,000
商品 B      20 \700 \14,000 \19,000

・ 
以前は、力技でグローバル変数とフラグの山になってもなんとか
動くという、やり方で作っていましたが、バージョンアップが大変なことや
ソースリストの長さから、もう少しまじめに勉強しなおそうと思って
メールしました。

CやC++で(私の環境はVC++ではありませんので)エクセルの
ようなリアルタイム計算処理をさせると、整数の数量*単価のような
演算はまだ楽ですが、実数(小数点あり)の計算になると、とたんに
実用レベルになるものはかなり、めんどうな処理になりました。
レコード単位で処理したほうが、事務処理はいいと思うのですが
なかなか、いいサンプルが見つからないので、結局、構造体や
共用体を勉強することにしました。

しかし、どちらも似ているので、今回のような仕様で作る場合
構造体と、共用体ではどちらを採用したほうがベストでしょうか?

初歩的な質問で、申し訳ありませんが、よろしくお願いいたします。

なお、実用レベルにしたいので、数量、単価、仕入金額、支払金額、差引残高は
doubleになると思います。 (品名のみchar)

以上です。

よろしくお願い致します。
  .           


このエントリーをはてなブックマークに追加


  • MLNo.142   "しげぼん"さん  (0) 2002/04/14 04:53  [メール表示する]
    しげぼんです。

    どうも、失礼致しました。 自己レスでまた
    再度メールします。

    データ構造の「前月繰越」と\100,000がちぐはぐに
    なっていたのに気づきませんでしたので再度メール
    致します。 みなさんどうもすいませんでした。


    > しげぼんです。
    >
    > かなり、ご無沙汰してました。
    > その間、仕事やらPCの調子がおかしくなったり、ゴタゴタ
    > してたもので。
    >
    > さて、質問なんですけど。
    >
    > CまたはC++で構造体と、共用体というものがありますが
    > これは、どう使い分ければいいのでしょうか?
    >
    > 今、考えているのは、以下のようなデータ構造なんですけど。
    >
    >   品    名  数量 単価  仕入金額  支払金額  差引残高 
    >  
    > 前月繰越
    \100,000
    >  商品 A     10 \500 \5,000
    \105,000
    >   支払手形                    ¥100,000 \5,000
    > 商品 B      20 \700 \14,000
    \19,000
    > ・
    > ・ 
    > 以前は、力技でグローバル変数とフラグの山になってもなんとか
    > 動くという、やり方で作っていましたが、バージョンアップが大変なことや
    > ソースリストの長さから、もう少しまじめに勉強しなおそうと思って
    > メールしました。
    >
    > CやC++で(私の環境はVC++ではありませんので)エクセルの
    > ようなリアルタイム計算処理をさせると、整数の数量*単価のような
    > 演算はまだ楽ですが、実数(小数点あり)の計算になると、とたんに
    > 実用レベルになるものはかなり、めんどうな処理になりました。
    > レコード単位で処理したほうが、事務処理はいいと思うのですが
    > なかなか、いいサンプルが見つからないので、結局、構造体や
    > 共用体を勉強することにしました。
    >
    > しかし、どちらも似ているので、今回のような仕様で作る場合
    > 構造体と、共用体ではどちらを採用したほうがベストでしょうか?
    >
    > 初歩的な質問で、申し訳ありませんが、よろしくお願いいたします。
    >
    > なお、実用レベルにしたいので、数量、単価、仕入金額、支払金額、差引残高は
    > doubleになると思います。 (品名のみchar)
    >
    > 以上です。
    >
    > よろしくお願い致します。



  • MLNo.143   TDaさん  (0) 2002/04/14 11:00  [メール表示する]
    しげぼんさんへ

    > データ構造の「前月繰越」と\100,000がちぐはぐに


    > > 今、考えているのは、以下のようなデータ構造なんですけど。
    > >
    > >   品    名  数量 単価  仕入金額  支払金額  差引残高
    > > 前月繰越
    > \100,000
    > >  商品 A     10 \500 \5,000
    > \105,000
    > >   支払手形                    ¥100,000 \5,000
    > > 商品 B      20 \700 \14,000
    > \19,000

    こんにちはしげぼんさん。さて申し訳ありませんが上記のデータ構造がよ
    く理解できません。商品A,商品Bなどは品名、数量、単価、仕入れ金額などと
    列の対応がよくわかります。私のメーラでは、繰り越し、支払手形と行に単
    独で現れる金額がどうなっているのかわかりません。?プロポーショナルフ
    ォントのせいでしょうか。

    想像するに次のような感じかと思うのですが
    (フィールドの区切りに===を使いました)
    品名  === 支払金額 === 差引残高  
    前月繰越 ===  ― === \100,000
    支払手形 === ¥100,000 === \5,000

    要するにレコードによって空フィールドがあると言うことですね。
    この場合は共用体を使用するのは無理じゃないかと思います。
    共用体は構造体と併用して使われることが多いのですが構造体がメモリ上
    にメンバを並べて確保するのに対して共用体は重ねて確保します。

    たとえば構造体Petを考えるとします。そのメンバには名前、生年月日、体重
    などいろいろ考えられます。そしてペットが犬のばあい散歩コース、猫の場
    合お気に入りの場所、熱帯魚の場合水を取り替えた日付をメンバに加えよ
    うと思いました。猫として扱うときは散歩コース、水を取り替えた日付とい
    うメンバは絶対に使わない、犬、熱帯魚の時も同様という場合、
    散歩コース、お気に入りの場所、水の取り替え日を共用体とするとその分メ
    モリの節約になります。

    上記のデータの場合どのメンバを共用体とすればよいのかぱっと思いつき
    ません。

    /***************************************/
    /* TDa mailto:tda@… */
    /***************************************/

  • MLNo.144   "SHIMAKURA Isao"さん  (0) 2002/04/14 14:30  [メール表示する]
     島倉です。

     構造体と共用体は使い分けるものではありません。
     構造体は変数(メンバ)をグループ化するもの、共用体は記
    憶領域を変数(メンバ)同士で共有させるよう指示するもので、
    それぞれ必要に応じて利用します。

    /*
    仕入のデータ構造
    */
    struct siire {
    char hinmei[256]; /* 品名 ※長さは適当 */
    double suryo; /* 数量 */
    double tanka; /* 単価 */
    double kingaku; /* 金額 */
    };

    /*
    支払のデータ構造
    */
    struct siharai {
    double kingaku; /* 金額 */
    };

    /*
    データレコード
    */
    struct record {
    int syubetsu; /* 仕入か支払かの種別 */
    union {
    struct siire siire; /* 仕入のデータ構造 */
    struct siharai siharai; /* 支払のデータ構造 */
    } item;
    };

    SHIMAKURA Isao (ISLe)
    isle.shimakura@…

    ----- Original Message -----
    From: "しげぼん" <shigebon@…>
    To: <beginers@…>
    Sent: Sunday, April 14, 2002 4:53 AM
    Subject: [beginers:0142] Re: Cの構造体と共用体の使い分けについて?



  • MLNo.145   "SHIMAKURA Isao"さん  (0) 2002/04/14 15:04  [メール表示する]
     島倉です。

    > なお、実用レベルにしたいので、数量、単価、仕入金額、支払金額、差引残高は
    > doubleになると思います。 (品名のみchar)

     外部記憶メディアにアクセスする際には信用のあるデータ
    ベースシステムを利用することをお勧めします。
     構造体をそのまま読み書きするのは実務レベルでは絶対禁
    止事項だとわたしは考えます。

     理由は構造体メンバのアラインメントについて調べてくだ
    さい。


    SHIMAKURA Isao (ISLe)
    isle.shimakura@…


    ----- Original Message -----
    From: "しげぼん" <shigebon@…>
    To: <beginers@…>
    Sent: Sunday, April 14, 2002 4:53 AM
    Subject: [beginers:0142] Re: Cの構造体と共用体の使い分けについて?



  • MLNo.146   "しげぼん"さん  (0) 2002/04/14 23:01  [メール表示する]
    しげぼんです。

    素早い御返答に感謝致します。

    > > なお、実用レベルにしたいので、数量、単価、仕入金額、支払金額、差引残高は
    > > doubleになると思います。 (品名のみchar)
    >
    >  外部記憶メディアにアクセスする際には信用のあるデータ
    > ベースシステムを利用することをお勧めします。
    >  構造体をそのまま読み書きするのは実務レベルでは絶対禁
    > 止事項だとわたしは考えます。
    >
    >  理由は構造体メンバのアラインメントについて調べてくだ
    > さい。

    という、島倉さんのご返事でしたので、Turbo C++のプログラマーズガイド
    をあちこち、探してみたら、「構造体メンバのパディングとアライメント」と
    いう項目があったので読んでみました。

    「構造体は、偶数アドレスにパディングされ、文字あるいは文字配列型
    を持たないすべてのメンバは、偶数のオフセットに境界づけられます。」

    「ただしこれは、アライメントオプション(-a)を使用した場合であって
    デフォルトでは構造体にはパディングされません。」
    と言う内容でした。 

    質問1:
    なんだかよくわかりませんがこの偶数アドレスに
    パディングとか、偶数のオフセットに境界づけられますというあたり
    が「正確なデータを保持できなくなるからなのかな??」と勝手に
    推測してみましたが、いかがなもんでしょうか?

    質問2:
    それと信頼できるデータベースシステムとはよく知りませんが
    昔にPOS端末(ポイントカード用)にB-trieve(ビートリーブ?)
    というものを聞いたことがありますがそういうものでしょうか?
    開発マシンがMS-DOSだと、もう難しいでしょうね、データベース
    利用したくても。

    また質問になりますが、よろしくお願い致します。


    ここから、ちょっと話が、ずれて申し訳ありませんが余談として聞いてください。

    実務レベルとは、いってもうちは自営業ですが、パッケージ
    ソフトを導入するかExcelかAccessをコントロールしようか
    ずっと悩んでいるので、(細かい仕事が多い有限会社)です。

    零細企業ですから、マシンも、コピー機も自腹で買ったり
    してます。 だから、帳簿のほとんどがオヤジ(社長)が手書きでつけて
    私は、手書きで補助簿(仕入帳、売掛帳)だけやっているようなもんで
    あとは備品調達、電話応対、雑用、コピー、お茶くみと
    在庫管理(単にExcelでワープロベタ打ちです)などやってます。

    実際のところソフトを導入したほうが補助簿の集計も
    楽になるとは思うのですが、実際、仕分けがあまりよくわからない
    ので(何度か3級簿記は受けましたが)導入してからが、大変そう
    なので、以前にもC++で、売上伝票金額チェック(電卓もどき)を
    作ったのです。 本当はExcelだと10分もあれば関数をちょこちょこ入れて
    ほとんど同じものができますが、電卓並に手軽に起動できないので
    わざわざ自分で、気に入った機能をつけて作った訳です。

    ただいうまでもなく、グローバル変数とフラグのオンパレードで
    無理やり動いているので、今度はもう少しシンプルでマシな
    バージョンアップしやすいものをFDとHD対応でプリントアウトも
    付けようとかなり無謀な挑戦を考えているのです。

    つまり、「売上伝票と仕入伝票の入力画面を作って毎日入力して
    月末には、仕入先と得意先の一覧表の集計」ができれば、今のところ
    十分なんですね。 パッケージソフトだと社長のやっている範囲まで
    ダブってくるので文句を言われるのは確実です。
    零細企業だから仕方ないのですが、まあそのへんは会社のポリシー
    によりますから。

    あくまで、理想ですけどね、現実的には、プログラム作ってる
    ヒマあったら仕事やれってなとこですから、なかなか悩みは
    解決しません。

    それでは。余談が長くてすいません。 (^^;;









  • MLNo.147   TDaさん  (0) 2002/04/15 01:11  [メール表示する]
    しげぼんさんへ

    > 質問1:
    島倉さんの本来の意図はわかりませんがデータベースとたとえばテキスト
    ファイルの読み書きではデータのやりとりの信頼性は天と地ほどの差があ
    ります。というかDBと比べると普通のファイルの読み書きには信頼性と言
    う言葉は意味をなさないのでは無いかと言う気もします。

    > 質問2:
    > それと信頼できるデータベースシステムとは
    今だと広く使われているのはMS Access, Oracle, InterBase, PostgreSQL
    といったところではないですか。Dosベースでとなるとよくわかりませんが。

    > 実務レベルとは、いってもうちは自営業ですが、パッケージ
    > ソフトを導入するかExcelかAccessをコントロールしようか
    > ずっと悩んでいるので、(細かい仕事が多い有限会社)です。
    このMLでこんなことを言ってはなんですがおっしゃる内容からすれば
    扱うデータ量が限られていて信頼性も高くなくてよいのならExcel + VBA
    あたりがいいような気がします。

    データ数が多かったりテーブルを複数持つようですとリレーショナルデー
    タベースを利用する必要があるでしょう。組み合わせとしてはいろいろあ
    りますがIDEとしてはDelphi ProfessionalはInterBaseというデータベー
    スも入っていますのでよいのではないかと思います。またDelphiは
    ObjectPascalなのですがこれのC++版がC++Builderですのでこちらを選択
    してもいいかもしれません。(MLの趣旨からすればこちらを進めるべきか?)
    実売価格は5万円台といったところです。

    それ以外には世間的にはVB + Accessも広く使われていますので資料、書籍、
    情報なども豊富です。ちなみに私は業務でVB + Access + Excelで帳票とい
    うようなソフトをくんでいます。これだとOffice Premiumが6万円くらいVB
    Professionalが6万ほどします。私は比べたことはないですが同じような仕
    様でDelphi + InterBase とVB + Accessでアプリをくんだところ前者の方
    がだいぶ早かったそうです。

    VBとかDelphiの話が出てきてしまってMLの趣旨からはずれてしまって申し
    訳ありませんでした。


    /***************************************/
    /* TDa mailto:tda@… */
    /***************************************/

  • MLNo.148   "SHIMAKURA Isao"さん  (0) 2002/04/15 15:32  [メール表示する]
     島倉です。

    > 質問1:

     C言語では構造体が記憶領域に割り当てられるときにそれ
    を扱うコンピュータにとって都合の良いようにメンバとメン
    バの間に使用されない領域を含めても良いようになっていま
    す。しかし、どれだけの領域をどのように含めるかは環境に
    よって違いますし、同じ環境でもコンパイルオプション等で
    異なります。
     構造体をそのまま外部メディアに書き込んで、構造体にそ
    のまま読み込んだとしても内容は保証されません。

    > 質問2:

     データベースと言ってもピンキリですから、しげぼんさん
    が要求する範囲で信頼に値すると思うものを採用すればよい
    と思います。データベースのランタイムは無償配布されてい
    るものもあります。既存のランタイムを利用するのが信頼性
    も高いし、将来性もあるし、お手軽です。
     自作プログラムでなんとかしたいときでも最低限データ形
    式は実績のあるものを選択するべきだとは思います。レコー
    ド数が多くならなければCSVでも良いんじゃないでしょうか。


    SHIMAKURA Isao (ISLe)
    isle.shimakura@…


    ----- Original Message -----
    From: "しげぼん" <shigebon@…>
    To: <beginers@…>
    Sent: Sunday, April 14, 2002 11:01 PM
    Subject: [beginers:0146] Re: Cの構造体と共用体の使い分けについて?




メールへの返信はMLのメンバーしかできません。

更新順メールリスト