
以下のように構造体を new で動的に確保したときに
構造体の中身(char bbb[10], int ccc)をゼロで初期化したいのですが
ZeroMemory を使用するとCArrayのAdd()を使用したときにエラーになってしまいました。
何かよい方法がありましたら教えて下さい。お願いいたします。
# 簡単にイメージですが・・・
typedef struct
{
CString a;
CString b;
}aaa_t ;
struct s_aaa{
char bbb[10];
int ccc;
CArray<aaa_t,aaa_t> m_aaaArray ;
}
s_aaa *StructB;
StructB = new s_aaa [10];
No.2ベストアンサー
- 回答日時:
ZeroMemory( StructB, sizeof( s_aaa) * 10);
とかやってるならNGですね。m_aaaArrayも0クリアしてるので管理情報を破壊しています。
基本的にクラスを0クリアしてはいけません。そのクラスのコンストラクタにお任せする物です。
対策案1
newしたあと、構造体のbbb[10]とcを自前で0クリアする。
→面倒だし汚い。
対策案2
struct s_aaaをclass s_aaaに置き換え、コンストラクタでbbb[10]とcを0クリアする。
→これが普通の対応。
対策案3
struct s_aaaのままコンストラクタを作成し、bbb[10]とcを0クリアする。
構造体もコンストラクタはおけます。
→美しくない。classにしない意味もない。
>ZeroMemory( StructB, sizeof( s_aaa) * 10);
まさしく、この処理を行っていたのが原因でした。
>struct s_aaaをclass s_aaaに置き換え、コンストラクタでbbb[10]とcを0クリアする。
この方法で無事に動作しました!!
C++の構造体はclassと書いても大丈夫だったり、構造体の中にコンストラクタを書けたりと非常に勉強になりました。本当にありがとうございました。
No.3
- 回答日時:
↓でどうでしょう。
std::fill(StructB, StructB + 10, s_aaa());
>std::fill(StructB, StructB + 10, s_aaa());
自分では詳しい原理を今ひとつ理解できませんでしたが、こういう方法もあるんですね。参考になりました。本当にありがとうございます。
No.1
- 回答日時:
>ZeroMemory を使用するとCArrayのAdd()を使用したときにエラーになってしまいました。
肝心の部分が書かれていませんが、
要は struct s_aaa の中身を「のっぺりと」ゼロ埋めしたということですか?
CArray<> がどんなのかもわかりませんが、その内容すべてを破壊しているのではないですか?
>要は struct s_aaa の中身を「のっぺりと」ゼロ埋めしたということですか?
はい。その通りです。
> CArray<> がどんなのかもわかりませんが、その内容すべてを破壊しているのではないですか?
まさしくその通りでした。CArrayはクラスになるので、詳しい部分はよく理解できていませんが、中身を全部ゼロ埋めしたためにクラスの領域(言葉が適切ではないかもしれませんが・・・)を破壊していたのが原因のようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- Excel(エクセル) Excel VBA 3 2023/04/22 10:46
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- その他(Microsoft Office) パワークエリの複数ファイルのデータ統合について 3 2022/07/14 17:06
このQ&Aを見た人はこんなQ&Aも見ています
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
CString型 全角半角を意識せずに「1文字」ずつ取り出す
C言語・C++・C#
-
ボタンの配置を変更したい
C言語・C++・C#
-
-
4
VC++にてボタン等のサイズ取得
C言語・C++・C#
-
5
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
6
MFCのCArrayを使った二次元配列
C言語・C++・C#
-
7
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
8
【MFC】CFileでSeekした位置から値出力したい
C言語・C++・C#
-
9
VC++で文字列から任意の文字を削除するにはどうしたらいいですか?
C言語・C++・C#
-
10
CStringとCByteArrayの変換
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
動的な構造体配列の初期化
-
VB.NETで最後フォのフォ...
-
ブレークポイントで止らない
-
バッチファイルでテキストファ...
-
東芝のDynabookなのですがアン...
-
Excel-VBAでXMLの複数ノードの...
-
同じタグ名の項目取得
-
VB6でXMLを作成しているのです...
-
あるノードリストに、特定の名...
-
C# TreeView 効率良いノード追...
-
ルート要素ノードが2個ある場合?
-
C#でTreeViewのCheckBoxのサイ...
-
TreeView の初期表示について
-
XMLとXSLTでリンクを張る方法
-
複数のマックPCによる数値計算...
-
XMLで要素が記述された順番に意...
-
2分探索木の高さを求めるプロ...
-
タグの有無の判定
-
VBSでxmlの値を書き換えたい
-
VBAでXML文書のある特定タグ以...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MSXMLを使ってノードを削除した...
-
ブレークポイントで止らない
-
動的な構造体配列の初期化
-
4バイトを10進数に変換する方法
-
concat関数内でのシングルクォ...
-
VB.NETで最後フォのフォ...
-
GNU VCDImager WHITEBOOK規格外...
-
XSLTでtest.xmlファイルのccc要...
-
[XSLT]累乗と平方根
-
aaa.comをサーバーで、www.aaa....
-
CPUの考え方を教えてください ...
-
タグの有無の判定
-
バッチファイルでテキストファ...
-
SNMP リンクダウンとノードダ...
-
東芝のDynabookなのですがアン...
-
XMLファイルの作り方がわかりま...
-
XMLで要素が記述された順番に意...
-
ルート要素ノードが2個ある場合?
-
複数のマックPCによる数値計算...
-
同じタグ名の項目取得
おすすめ情報