typedef struct _info_t{
int xxx;
int yyy;
int zzz;
} info_t;
typedef struct _gData{
int aaa;
int bbb;
info_t infoData[100];
} gData_t;
gData_t gMainData;
質問1
C言語で上記のようなグローバルのデータを作成しようとしています。
gMainDataの中身を初期化するにはどうするのがベストでしょうか?
(特にinfoData[100]の初期化)
質問2
gMainData.infoData[XXX]には info_t型のtmpDataを代入しようとしていますが
gMainData.infoData[XXX] = tmpData;
データがはいっているかどうかはどう判定するべきでしょうか?
質問3
以下のようにポインタを使うのは間違いでしょうか?
typedef struct _gData{
int aaa;
int bbb;
info_t *infoData[100];
} gData_t;
初期化
memset(gMainData.infoData,NULL, 100);
データの代入
*gMainData.infoData[XXX] = tmpData;
データの有無判定
if( gMainData.infoData[XXX] == NULL){
}
No.5
- 回答日時:
#3です。
>「データの有無判定」は・・・これはどっちの判定だろう・・・
「データの有無判定」は・・・これはどっちの判定のつもりだろう・・・
です・・・
初期化は私だと次のように書くかな。
static const info_t initialize_data = { .xxx = 1, .yyy = 2, .zzz = 3, };
for (int i = 0; i < sizeof(gMainData.infoData) / sizeof(gMainData.infoData[0]); i++)
gMainData.infoData[i] = initialize_data;
No.4ベストアンサー
- 回答日時:
1.初期化
ループでもmemsetでもよいと思います。どれがベストかはケース・バイ・ケースでしょう。
ただしmemsetの第2引数はint型、第3引数はバイト数なので、次のようにするべきです。
memset(gMainData.infoData, 0, 100 * sizeof(info_t));
また、C言語の規格により static 変数を明示的に初期化しなければ全て 0 になるので
static gData_t iniData;
gData_t data;
と定義しておいて
data = iniData;
のように初期化する方法も(一応)あります。
2.データの代入
info_t *infoData[100] は構造体の配列ではなく、ポインタの配列です。
infoData をポインタにするなら、構造体を下のようにすれば
typedef struct _gData {
int aaa;
int bbb;
info_t *infoData[100];
info_t _infoData[100];
} gData_t;
次のように代入することができます。
data._infoData[XXX] = tmpData;
data.infoData[XXX] = &(data._infoData[XXX]);
3.データの有無判定
前述の2のようにすれば
if( gMainData.infoData[XXX] == NULL){
}
でデータを代入済みかどうか判定できます。
もちろんデータを代入していないポインタがNULLであることが前提ですが。
・余談ですが、構造体のタグ名とtypedefする型名は同じでも大丈夫です。例えば
typedef struct info_t{
...
} info_t;
のように。
No.3
- 回答日時:
>質問3
>以下のようにポインタを使うのは間違いでしょうか?
ポインタを使うことはいいのですが「初期化」はmemset()の使い方を間違ってますし、「データの代入」はメモリが確保されていません。
「データの有無判定」は・・・これはどっちの判定だろう・・・
No.2
- 回答日時:
「データが入っているかどうかを判定する」ためには, 「データが『入っているとき』と『入っていないとき』とで何かが違う」という状況を作らなければなりません.
データそのもので区別できるならその区別を使えばいいし, そうでなければ「データが入っているかどうかを判定する」ためのデータが必要.
No.1
- 回答日時:
まずは、「普通に」初期化しましょう。
多くの場合、そんなに悪い結果にはなりませんから。
gMainData.aaa = 初期値;
gMainData.bbb = 初期値;
for(i = 0; i < 100; i++)
{
gMainData.infoData[i].xxx = 初期値;
gMainData.infoData[i].yyy = 初期値;
gMainData.infoData[i].zzz = 初期値;
}
あと、
info_t intial_data = {xxx の初期値, yyy の初期値, zzz の初期値};
で、
for(i = 0; i < 100; i++)
{
gMainData.infoData[i] = initial_data;
}
でもいいですが。
ポインタを使ったコードは、そもそも、「データの実体となる領域を確保できてない」時点でアウトです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
C言語の関数と配列に関する質問
-
fopne で失敗する原因
-
メモリのアドレスからの値の取...
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
エラーの意味
-
参照型で受け取った引数をポイ...
-
【VC++2005(CLR)】マルチスレッ...
-
TCHAR文字列内の検索について
-
セグメントエラー
-
ポインタのアドレス範囲
-
【なぜポインタを使うのか】
-
C言語のプログラムをJavaに...
-
ポインタ変数の利用方法
-
コンストラクタでnewを失敗した...
-
クイックソートの比較交換回数...
-
ポインタのミスでOS壊れるの...
-
デバイスハンドルとは?
-
#define NULL ((void *)0) の弊害
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
C言語の関数と配列に関する質問
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
ExcelVBAでのkernel32(64bit)
-
main(int argc,char **argv[])...
-
アプリを32bitから64bit移行
-
ハンドルはポインタか
-
連結リスト 要素の入れ替え
-
C言語でのconstを返す関数
-
Cで作成したDLL関数をVBから呼...
-
NULLとブランクの違い
-
エラーの意味
-
ハンドル、アドレス、ポインタ...
-
DLL<->VB間での受け渡し(文字...
-
【C言語】戻り値が構造体の関数
おすすめ情報