
こんばんわ。
何度も申し訳ありません。
VC++.NET 2003を用いてコンソールプログラミングを行っています。前回この掲示板を利用して複数回実行するプログラムを作成し、そこに構造体を用いたプログラムを作成しました。以下に概要を示します。
グローバルで構造体を宣言しているため、複数回実行を行うプログラムでは前回の値が格納されたままであると思い、毎回実行時に構造体の初期化を行いたいと思っています。
そこで、以下に示します構造体の初期化はどのように記述すればよいのでしょうか?0で初期化したいと思っています。
よろしくお願い致します。
#define MAX 2000
//グローバル
struct tag{
int Npkt;
int gettime;
int rPkt;
int lossPkt;
}rdata[MAX];
main(){
//for文で複数回実行処理
for(i=0;i<=5;i++){
//ここで構造体の初期化を記述する
//例として、5回プログラムを実行する
}
}
No.4ベストアンサー
- 回答日時:
★まとめ
・既に『memset』関数や、『ZeroMemory』関数の回答があるので構造体の全体、1部の
初期化の記述例を紹介します。
・それと『#include <memory.h>』を記述しないとメモリ関係の関数が利用できません。
『ZeroMemory』関数の場合は『#include <windows.h>』があればそのまま利用できます。
●構造体全体を初期化
ZeroMemory( rdata, sizeof(rdata) ); または、
memset( rdata, 0, sizeof(rdata) ); です。
●構造体一部を初期化
ZeroMemory( &rdata[i], sizeof(struct tag) ); または、
memset( &rdata[i], 0, sizeof(struct tag) ); です。
※rdata[i]の1データだけ初期化します。
余談:
・『ZeroMemory』関数は Win32 API と分類されていますが、実体は『memset』関数に
『#define』されているだけです。でも、戻り値を『VOID』型にキャストされているので
『memset』関数のリターン値を取得できません。→第一引数のアドレスが『memset』関数
ではリターンします。
・以上。おわり。
参考URL:http://taka.no32.tk/tips/Win32/ZeroMemory.html
前回に続きまして返信ありがとうございました。
memset以外にZeroMemory関数を知ることができました。
ありがとうございました。
No.5
- 回答日時:
厳密なことをいうと、構造体のメンバにポインタや浮動小数点数が含まれていると、memset等でゼロクリアすることができません。
ただし、VC++.NET 2003に限定するなら、たまたまうまくいきます。確実にゼロクリアするには、
static const struct tag zero = { 0 };
rdata[i] = zero;
のように、ゼロ初期化されたオブジェクトを代入するのが簡単でしょう。
ちなみに、memset関数を使う際にインクルードすべきヘッダは、<memory.h>ではなく、<string.h>です。
No.3
- 回答日時:
先の御二方の回答どおり、WinAPI で既に用意されている
Zeromemory() 関数を使えば構造体の全メンバは0初期化できます。
使用方法は
第一引数:構造体のアドレスを渡す
第二引数:第一引数で渡した構造体のサイズ(バイト単位なので sizeof() を使用)を渡す
回答例は先の御二方が記述しておられるのでこちらは意味の理解の
ための記述です。
返信ありがとうございます。
せっかくですので、教えていただいたZeromemory関数を用いて記述してみようと思います。
ありがとうございました。
No.2
- 回答日時:
経験論で言うのであれば、構造体の初期化(ゼロクリアなら特に)には、
Win32APIを使用する環境ならばZeroMemory関数が一般的かと思います。
C言語標準ライブラリであれば、memset関数(ないしmemsetで0を渡す事を定義した自作ラップ関数等)を使うのが一番素直なやり方では無いでしょうか?
例)memset( &rdata[i], 0x00, sizeof(tag) );
返信ありがとうございます。
memset関数は知っていましたが、実際に構造体の初期化を行う際、どのような記述があるのか分かりませんでした。また、Win32APIにZeroMemory関数が存在することを知ることができました。
ありがとうございました。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# C言語 3 2022/10/04 15:07
- その他(プログラミング・Web制作) pythonのWebスクレイピングでfind_allだとurlがNoneに 4 2022/04/17 18:21
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
typedefをプログラム中で解除す...
-
1バイトデータの読み出しについて
-
構造体のデータを丸ごとコピー...
-
「#undef」と「#define」の使い...
-
変数の初期化について
-
Integer変数をカラにしたいので...
-
C言語のキャストについて
-
long型のデータをバイト型の配...
-
VB6.0の変数、関数の定義位置か...
-
値が代入されてない時
-
変数宣言および代入について
-
命名規則 VB 構造体
-
値が変わるのはどうしてでしょ...
-
ユーザー定義型変数の一括初期化
-
FileTimeToSystemTime がコンパ...
-
VBAの変数のデータ型を変更する...
-
構造体のポインタにNULLが入らない
-
日付チェック関数について
-
関数から配列を返すには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
C言語 構造体の中に共用体を定...
-
構造体のデータを丸ごとコピー...
-
VBAの変数のデータ型を変更する...
-
日付チェック関数について
-
整数から16進数への変換 現在c...
-
typedefをプログラム中で解除す...
-
値が代入されてない時
-
C++ 構造体の一括初期化 {0}
-
VBAで符号無し整数
-
long型のデータをバイト型の配...
-
変数の初期化について
-
1バイトデータの読み出しについて
-
charとucharの違い
-
VBAにてcolorindexを変数に格納...
-
異なる構造体のデータのコピー
-
構造体を型の異なる構造体に代入
-
構造体にする理由・利点・使用例
おすすめ情報