• ベストアンサー

グローバル変数について

ヘッダに宣言した構造体にあるモジュールでテデータを格納し、 各々のモジュールでそのデータを参照したいのですが、 以下の方法で可能でしょうか? ##CMN.h### typedef struct { char AAA[5]; char BBB[5]; }stCmn; typedef stCmn Cmn_inf; ###A.c### memcpy(Cmn_inf.AAA,"TEST",4); ###B.c### char A[5]; memcpy(A,CMN_inf.AAA,4); ※ A.c B.cに #include "CMN.h"を記述

  • sting
  • お礼率12% (35/274)

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.6

> A.cにstCmn Cmn_infを宣言しなければなりませんか? > ヘッダでexternしていればincludeしているモジュール > で同等に扱えないのでしょうか? 別に A.c にしなければいけない、ということではないんですが、必ずどこかに ひとつ必要になります。 extern ~ は、あくまでも「こういう変数が有るはずなので、使って良いよ」と いう宣言でしかないんです。その「変数が有るはず」の「有る」ことをどこかに 記述しなければいけません。 試してみれば分かりますが、その「有る」を省略して、プログラムをリンクすると エラーが出ます。メッセージの内容はコンパイラ・リンカによって違いますが 「参照が解決できませんでした」というような。 A.c も B.c も外部変数を利用する、という立場で同じレベルにしておきたければ 外部変数の定義用のソースを一本作るのがすっきりするかもしれません。 ★A.c #include "ヘッダファイル" ★外部変数定義用.c #include "ヘッダファイル" stCmn Cmn_inf;

sting
質問者

お礼

ありがとうございます。 頑張ってやってみます。

その他の回答 (5)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.5

理屈は、No.4 の回答の通りです。が、参照するところでいちいち外部変数の参照の 宣言をするのでは、何のためのインクルードファイルか分かりません。 なので、普通は、こう書きます。 ★ヘッダファイル extern stCmn Cmn_inf; ★A.c(別に、A.c じゃ無くてもいいんだけど、どれかのソースひとつだけ) #include "ヘッダファイル" stCmn Cmn_inf; memcpy(Cmn_inf.AAA, "TEST", 4); ★B.c #include "ヘッダファイル" memcpy(A, Cmn_inf.AAA, 4); # とはいうものの、外部変数を使うことはお勧めしません

sting
質問者

お礼

A.cにstCmn Cmn_infを宣言しなければなりませんか? ヘッダでexternしていればincludeしているモジュール で同等に扱えないのでしょうか?

  • natural
  • ベストアンサー率37% (419/1115)
回答No.4

失礼、ranxさんの回答を見て見落としに気付きました。 Cmn_infは確かに変数にはなっていませんね。 Cmn_infを変数として使いたいのであれば、typedefではなく、例えば stCmn Cmn_inf; としてA.cのグローバル領域で定義し、B.cで extern stCmn Cmn_inf; として参照すべきです。 尚、当たり前ですが、それぞれのファイルの中身はインクルードファイルの記述や関数の形式での記述が必要です。

  • natural
  • ベストアンサー率37% (419/1115)
回答No.3

忘れ物です。(^_^; ヘッダファイルを自作するときは以下の様な構造にする癖を付けた方が良いですよ。 #ifndef _CMN_H #define _CMN_H typedef struct { char AAA[5]; char BBB[5]; }stCmn; typedef stCmn Cmn_inf; #endif こうすると分割コンパイル時でも、_CMN_Hが定義されていない初回のみヘッダファイルの中身が展開されるので多重定義等を防ぐことが出来ます。(二度目以降は#defineで_CMN_Hが定義済みなので#ifndef~#endifは展開しません) 一度stdio.hの中身等を覗くと勉強になりますよ。(^_^)

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.2

NGだと思います。 typedef stCmn Cmn_inf; はデータの「型」を定義しただけであって、 データ(記憶領域)を定義したものではありません。 コンパイル時にエラーとなると思います。

  • natural
  • ベストアンサー率37% (419/1115)
回答No.1

OKだと思います。 ただし、memcpyの第3引数はそれぞれ5とすべきですね。 4ではヌル文字がコピーされませんから。 (strcpyのが良いかもしれません)

関連するQ&A

  • 入れ子の構造体について

    例えば、入れ子の構造体を1つ使いたい場合、 struct bbb{ int b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; と書くと、「dt.a.b = 10」とやれば、値等を設定できると思いますが、 入れ子の構造体を2つ使いたい場合も、同じように書けるのでしょうか? struct ccc{ int c; }; struct bbb{ struct ccc b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; dt.a.b.c = 10; と書けるのでしょうか?こんがらがってしまって、どう書いていいのか・・。 2つでも出来るのであれば、コードの書き方を教えて頂けませんか?

  • ファイル操作について

    ファイルから情報を読みこみ構造体に設定しようとしています。 方法としては、fopen,fgetsにより行取得しようと考えているのですが、ファイルが以下のようになっており、 キーワードに対応する構造体も決まっています。 力作業で設定しても良いのですが、何かもっと美しい方法があれば助言お願いします。 ファイル内容 (A) AAA="12345" BBB="33333" (B) BBB="1122" CCDD="5674" (C) TTTT="#####" AAAA="kkkkk" 設定する構造体 typedef struct{ char AAAA[20]; char BBBB[20]; }A; typedef struct{ char BBB[20]; char CCDD[20]; }B; typedef struct{ char TTTT[20]; char AAAA[20]; }C; です。

  • free()について

    free()についてです。 よろしくお願いします。 ある構造体Aがあったとして その構造体Aの中に構造体Bのポインタが あったとします。 typedef struct{ char b; short c; } B_t; typedef struct { int a; B_t *bbb; } A_t; この構造体をプログラム中でポインタで扱い mallocで領域確保している場合に(A,B共に) Aをfree()した場合は、Bも開放されるのでしょうか? 以下、質問のサンプルです。 A_t *aaa; aaa = (A_t *)malloc(sizeof(A_t)); aaa->bbb = (B_t *)malloc(sizeof(B_t)); : : free(aaa); /* ←これで、aaaのメンバであるbbbは */ /* 開放されるのでしょうか? */ よろしくお願い致します。

  • 構造体の型について

    ある構造体をxxxと名づける以下のプログラムを作成しました。 ーーーーーーーーーーー #include <stdio.h> #include <string.h> main() { typedef struct { char variable[64]; char type[64]; char value[512]; } xxx; xxx aaa; strcpy(aaa.variable,"bbb"); printf("%s\n",aaa.variable); } ーーーーーーーーーーー これは動き、bbbと表示されます。 しかしながら、構造体のポインタを使用した 以下のプログラムではコンパイルはとおりますが実行時にコアダンプして落ち ます。 ーーーーーーーーーーーーーーーーーーーー #include <stdio.h> #include <string.h> main() { typedef struct { char variable[64]; char type[64]; char value[512]; } xxx; xxx* aaa; strcpy(aaa->variable,"bbb"); printf("%s\n",aaa->variable); } ーーーーーーーーーーーーーーーーーーーーーーー 両プログラムの意図はまったく同じなのに何故いけないのでしょうか。

  • C言語の構造体のサイズについて

    いつもお世話になっていります。 早速ですが、C言語の構造体のサイズについて教えてください。 typedef struct B { short code; char name; float price; } B; typedef struct A { B bbb[10]; double sougaku; } A; A aaa; といった構造体があった場合に、 sizeof(aaa.bbb.code) + sizeof(aaa.bbb.name) + … + sizeof(aaa.sougaku) という風に一つ一つサイズを取得し、合計して構造体のサイズを取得した場合と sizeof(aaa) という風に構造体のサイズを取得した場合のサイズの値が異なるといった現象が起きます。 その原因が分からなくて困っております。 そこで考えられる要因をお教えください。 因みに実際の構造体はサイズで言えば2500バイトくらいあります。 froat/char/double/short 型を使用しております。 よろしくお願いします。

  • 動的な構造体配列の初期化

    以下のように構造体を new で動的に確保したときに 構造体の中身(char bbb[10], int ccc)をゼロで初期化したいのですが ZeroMemory を使用するとCArrayのAdd()を使用したときにエラーになってしまいました。 何かよい方法がありましたら教えて下さい。お願いいたします。 # 簡単にイメージですが・・・ typedef struct { CString a; CString b; }aaa_t ; struct s_aaa{ char bbb[10]; int ccc; CArray<aaa_t,aaa_t> m_aaaArray ; } s_aaa *StructB; StructB = new s_aaa [10];

  • 基本的な領域確保の仕方について

    下記のような構造体が宣言されている場合、 A.c.e ←を配列扱いにし、 A.c.e[0].g.h ←を配列扱いにし、 A.c.e[0].g.h[0].iにデータを設定するには、 どのように領域を確保すれば良いのでしょうか? eee型はポインタ宣言のみされていて配列宣言されて いません。(Max10配列) typedef struct { int len; char *i; } hhh; typedef struct { int number; hhh *h; } ggg; typedef struct { fff f; ggg g; } eee; typedef struct { int number; eee *e; } ccc; typedef union { aaa a; bbb b; ccc c; ddd d; } A;

  • 【C++】typedefの役割について

    C++だけでなく、Cでも同様なのだと思うのですが、下記の(1)、(2)の違い がよくわからず、どなたかにご教授いただければと思っています。 (1) struct{   (略) }BBB; (2) typedef struct{   (略) }BBB; (2)が下記((2)')のようになるんであれば、AAAという名前の構造体を BBBという名前で定義しているという事で理解できるんですが、 (2)のようにしている意図が理解できません。 (typedefの記述は必要なんでしょうか?) すでに動いているシステムなので、問題ないのは明らかなんですが。 (2)' typedef struct AAA{   (略) }BBB;

  • static変数について

    struct XXX { char *aaa; char *bbb; }; static struct XXX YYY[] = { {NULL, "JJJ"}, ... }; thread(){ ... } 上記のstatic変数をスレッド関数thread()の外部変数として設定した場合、 *aaaの値はスレッドごとには確保することできませんでしょうか。 上書きされてしまうのでしょうか。 やはりスレッドセーフではないのでしょうか。 その際、どのように設定してあげればよいのでしょうか。 どなたかご教授お願いします。

  • ポインタ配列について

    struct AAA{ char *aaa; char *bbb; }; main(){ struct AAA *BBB[36]; ... rtn = sub(BBB); ... rtn = subsub(BBB); } void sub(*BBB[36]){ ... for(i=0; i<3; i++){ BBB[i] = (struct AAA*)malloc(sizeof(struct AAA)); } ... } void subsub(*BBB[36]){ ... for(i=0; i<3; i++){ printf("[%s]\n", BBB[i]->aaa); } ... } このような流れのプログラムを組みたいです。 *BBB[36]に値を設定してその値を使うプログラムです。 "struct AAA"の内容を大量に受信するので*BBB[36]としました。 sub()、subsub()の引数の書き方*BBB[36]はあってますか? またsub()、subsub()関数の引数*BBB[36]は他にもっとシンプルなやり方があると思うのですが。 どなたか教えて下さい。 宜しくお願いします。