memset

[戻る]
さくちゃ 2006/10/18(水) 10:42:40
以前助けていただきました。よろしければまたお力をお貸しください。

----test.h----
typedef struct {
     CString    csValue1;
     CString    csValue2;
} DATA1;

typedef struct {
     int         nValue1;
     int         nValue2;
     char        cValue1[x];
     char        cValue2[y];
} DATA2;

・・・
…

typedef struct {
     DATA1   data1;
     DATA2   data2;
   ・・・
   …
} DATA

〜
〜

と他に構造体をいくつか作ってそれを「DATA」でまとめてます。

----test.cpp----
〜
〜

int main()
{

memset(&DATA, 0x00, sizeof(DATA));
・・・
・・・
}

「DATA」に対して初期化を行います。


となるのですが、CStringにmemsetをすると
とあるのでCStringが使えなくなりました。

色々と調べてみたのですが、理由はなんとなく分かりました。

CStringにmemsetをやると、CStringの領域をすべてmemsetで指定した文字で埋めるのが原
因だと思います。

なのでcharに変えると上手くのは試したのですが。。CStringで持っておくほうが楽なので
出来ればCStringで持ちたいと考えています。


理想的な結果として
「文字はCStringで持ちつつ、他の変数を一度初期化を行う」

何かいい案はありませんでしょうか?

環境:.net2003 VC7.1 コンソール

tetrapod 2006/10/18(水) 10:49:48
コンストラクタ

Ban 2006/10/18(水) 10:53:38
PODでない構造体にmemsetとかしたらダメです。
単にメモリをつぶしてるだけで、初期化じゃないです。

C++では、structも中身はclassと一緒なので「コンストラクタ」が定義できます。
structに名前をつけて、コンストラクタを定義してください。こんな感じ?

struct DATA2{
     int         nValue1;
     int         nValue2;
     char        cValue1[x];
     char        cValue2[y];

     DATA2()
     {
          nValue1=0;
          nValue2=0;
          std::memset(cValue1, 0x00, sizeof cValue1);
          std::memset(cValue2, 0x00, sizeof cValue2);
     }
} ;

CStringがありますし、どうせCで使えないのなら、
わざわざtypedefなどしなくてもC++は普通にstructを省略できます。
DATA2 data2;

MK 2006/10/18(水) 10:53:55
各構造体にコンストラクタを入れて初期化する


typedef struct XXXXX1 {
     XXXXX1(){csValue1="";csValue2=""; }
     CString    csValue1;
     CString    csValue2;
} DATA1;

typedef struct XXXXX1 {
     XXXXX2(){memset(this, 0, sizeof(XXXXX1));}
     int         nValue1;
     int         nValue2;
     char        cValue1[x];
     char        cValue2[y];
} DATA2;

さくちゃ 2006/10/18(水) 11:04:45
返信ありがとうございます。
>tetrapodさん
>Banさん
>MKさん

どうやらすごい勘違いを自分をしてたみたいですね。。
コンストラクタですが。。なるほど。
少し自分でも調べてみます。ありがとうございます。

PATIO 2006/10/18(水) 11:06:51
まず、標準関数の類をそのままクラスを持っているようなものに使うのはだめです。
これはmemsetに限りません。標準関数が引数として要求しているのは、C言語で
表現可能な構造体やデータ型なのでクラスをそのまま渡せないのです。

書かれている例にしてもstructを使っていても内部にクラスが存在した時点で
それはクラスを同じ扱いになります。そのまま渡したいなら構造体は内にクラスを
持たせる事は出来ません。
で、思うんですが、構造体にしないといけない理由が無いならあっさりクラスにした方が
良いと思います。実際の話、CStringを含む構造体にコンストラクタを設けて
初期化を入れたとするとstruct宣言していても実質はクラスと変わりません。
区別をする意味があんまりないと思います。
クラスが入った時点でCのインターフェイスには使えないわけですし。

任意のタイミングで初期化がしたいのであれば、
初期化用のメンバー関数を作ればいいだけの話です。
クラスにしてしまった方が下手に構造体にするよりわかりやすいと思います。

さくちゃ 2006/10/18(水) 11:07:03
[[解決]]
あっと。。。チェックを忘れていました。
ありがとうございます。

さくちゃ 2006/10/18(水) 11:12:17
>PATIOさん
なるほど。。それも踏まえて改めて考え直してみます。
また疑問等があればお力をお貸しください。

古いスレッドには追加発言できません。