memset – プログラミング – Home

通知
すべてクリア

[解決済] memset


さくちゃ
 さくちゃ
(@さくちゃ)
ゲスト
結合: 18年前
投稿: 9
Topic starter  

以前助けていただきました。よろしければまたお力をお貸しください。

----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
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

コンストラクタ


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

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
 MK
(@MK)
ゲスト
結合: 25年前
投稿: 66
 

各構造体にコンストラクタを入れて初期化する

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;


返信引用
さくちゃ
 さくちゃ
(@さくちゃ)
ゲスト
結合: 18年前
投稿: 9
Topic starter  

返信ありがとうございます。
>tetrapodさん
>Banさん
>MKさん

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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

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

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


返信引用
さくちゃ
 さくちゃ
(@さくちゃ)
ゲスト
結合: 18年前
投稿: 9
Topic starter  

あっと。。。チェックを忘れていました。
ありがとうございます。


返信引用
さくちゃ
 さくちゃ
(@さくちゃ)
ゲスト
結合: 18年前
投稿: 9
Topic starter  

>PATIOさん
なるほど。。それも踏まえて改めて考え直してみます。
また疑問等があればお力をお貸しください。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました