プロが教える店舗&オフィスのセキュリティ対策術

こんばんわ。
何度も申し訳ありません。

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回プログラムを実行する
  }
}

A 回答 (5件)

★まとめ


・既に『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
    • good
    • 0
この回答へのお礼

前回に続きまして返信ありがとうございました。
memset以外にZeroMemory関数を知ることができました。
ありがとうございました。

お礼日時:2007/02/06 19:25

厳密なことをいうと、構造体のメンバにポインタや浮動小数点数が含まれていると、memset等でゼロクリアすることができません。

ただし、VC++.NET 2003に限定するなら、たまたまうまくいきます。
確実にゼロクリアするには、 

static const struct tag zero = { 0 };
rdata[i] = zero;

のように、ゼロ初期化されたオブジェクトを代入するのが簡単でしょう。

ちなみに、memset関数を使う際にインクルードすべきヘッダは、<memory.h>ではなく、<string.h>です。
    • good
    • 1
この回答へのお礼

返信ありがとうございます。
2通りの初期化方法を知ることが出来ました。
ありがとうございました。

お礼日時:2007/02/07 02:55

先の御二方の回答どおり、WinAPI で既に用意されている


Zeromemory() 関数を使えば構造体の全メンバは0初期化できます。
使用方法は
第一引数:構造体のアドレスを渡す
第二引数:第一引数で渡した構造体のサイズ(バイト単位なので sizeof() を使用)を渡す
回答例は先の御二方が記述しておられるのでこちらは意味の理解の
ための記述です。
    • good
    • 0
この回答へのお礼

返信ありがとうございます。
せっかくですので、教えていただいたZeromemory関数を用いて記述してみようと思います。
ありがとうございました。

お礼日時:2007/02/06 18:28

経験論で言うのであれば、構造体の初期化(ゼロクリアなら特に)には、


Win32APIを使用する環境ならばZeroMemory関数が一般的かと思います。

C言語標準ライブラリであれば、memset関数(ないしmemsetで0を渡す事を定義した自作ラップ関数等)を使うのが一番素直なやり方では無いでしょうか?
例)memset( &rdata[i], 0x00, sizeof(tag) );
    • good
    • 0
この回答へのお礼

返信ありがとうございます。
memset関数は知っていましたが、実際に構造体の初期化を行う際、どのような記述があるのか分かりませんでした。また、Win32APIにZeroMemory関数が存在することを知ることができました。
ありがとうございました。

お礼日時:2007/02/06 18:27

ZeroMemory( rdata, sizeof rdata );


――とか。

参考URL:http://msdn.microsoft.com/library/ja/default.asp …
    • good
    • 0
この回答へのお礼

返信ありがとうございます。
このような関数が存在していることを知り、大変勉強になりました。
ありがとうございました。

お礼日時:2007/02/06 18:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A