はじめまして。山田と申します。
newを使ってBYTE型で確保した領域に値を
設定したいのですが、設定の仕方がわかりません。
確保したい領域のサイズは下記のような構造体として
実際に構造体のように値をセットする為の方法を教えて
いただけないでしょうか?
-----------------------------------
・確保したい領域のサイズ
-----------------------------------
// 情報ヘッダ
typedef struct _INFOHEADER
{
DWORD DataSize;
WORD DataNum;
}INFOHEADER;
-----------------------------------
// 領域を確保する
BYTE *pInofHed; = new BYTE[sizeof(INFOHEADER)]
~ 領域に値をセットする ~
-----------------------------------
INFOHEADER *pInofHed = new INFOHEADER;
が素直だと思うのですが……。
最後に不定長配列があるなどの理由でBYTE配列が必要なら,
BYTE * pInofHedBuf = new BYTE [sizeof(INFOHEADER)];
INFOHEADER * pInofHed = reinterpret_cast<INFOHEADER *>(pInofHedBuf);
のようにすればよいです。
こうすれば,pInofHedはINFOHEADERへのポインタですから,
pInofHed->DataSize = 10;
のようにしてアクセスできます。
INFOHEADER* p = (INFOHEADER*)new INFOHEADER;
p->DataSize = //ほにゃらら
p->DataNum = //ほにゃらら
じゃだめですか?
「バイナリファイルに書くから勝手にパディングされたら困る。
なおかつ、#pragma pack とか使いたくない。」
というような事情でもあるんでしょうか?
遅くなりまして申し訳ございません。
ご解答ありがとうございます。
なぜ、BYTE型で確保した領域で使いたいかと言うと
確保したい領域は毎回違うからです。
「32バイトの構造体をX個確保する」ような処理をしています。
-----------------------------------------------------------------
// 情報領域確保
BYTE *pPocketInfo = new BYTE[sizeof(INFOHEADER) +
(sizeof(POCKETINFO)*num)]
-----------------------------------------------------------------
上記のような処理を実際にしています。
自分の所ではメモリにデータを設定し、そのアドレスとサイズを
あるクラスに返却するというクラスを作っています。
こんな感じでは。
INFOHEADER* pInfo = new BYTE[sizeof(INFOHEADER) + sizeof(POCKETINFO)*num];
POCKETINFO* pPocketInfo = (POCKETINFO*)(pInfo + 1);
int i;
for (i = 0; i<num; ++i) {
pPocketInfo[i] = XXX;
}
ご解答ありがとうございます。
ちょっとコードで理解できない箇所が・・・
POCKETINFO* pPocketInfo = (POCKETINFO*)(pInfo + 1);
^^^^^^^^^^^^^^^^^^^^^^^^^
チェックした部分のコードを解説してもらえないでしょうか?
勉強不足で申し訳ございません。
ある型のポインタに1を足すと、その型のサイズ分だけ先の位置を指すポインタが
できます。
============= <- pInfo
INFOHEADER
============= <- (pInfo+1) == pPocketInfo == &pPocketInfo[0]
POCKETINFO
============= <- &pPocketInfo[1]
POCKETINFO
=============
:
こんな感じになります。
わかり易い解説ありがとうございました。
実際コードに書いてコンパイルしたところ
INFOHEADER* pInfo = new BYTE[sizeof(INFOHEADER) + sizeof(POCKETINFO)*num];
の箇所で、「unsigned char *' から 'struct _INFOHEADER * に変換できない」
旨のエラーメッセージが出力されます。
YuOさんがおしゃってた方法を下記コードでも
問題なく出来るのでしょうか?
BYTE* pInfo = new BYTE[sizeof(INFOHEADER) + sizeof(POCKETINFO)*num];
POCKETINFO* pPocketInfo = reinterpret_cast<POCKETINFO *>( pInfo );
int i;
for (i = 0; i<num; ++i) {
pPocketInfo[i] = XXX;
}
ごめんなさいキャストが抜けてました。
BYTE* pBytes = new BYTE[ ... ];
INFOHEADER* pInfo = reinterpret_cast<INFOHEADER*>( pBytes );
deleteするときはpInfoでなくキャスト前のpBytesの方を渡さないといけない
みたいです。
delete[] pBytes;
構造体が「ヘッダ部+データ部*num個」の場合の値の設定は理解できました。
皆様、どうもありがとうございました!
実際の処理は3つの構造体「ヘッダ部+データ部1*n個+データ部2*num個」
の情報をメモリに格納します。皆様からご教授を元にコーディングしてみました
が自信ありません・・・
データ部1にデータを設定する時、pBytes のポインタからヘッダ部のサイズ分
だけ先の位置を指させる為には、下記のようなコードでいいのでしょうか?
----------------------------------------------------------
・「ヘッダ部+データ部1*num個+データ部2*num個」の構造
==================
INFOHEADER
==================
POCKETINFO(1)
==================
POCKETINFO(2)
==================
POCKETINFO(1)[n]
==================
POCKETINFO(2)[n]
==================
----------------------------------------------------------
・コード
BYTE* pBytes = new BYTE[sizeof(INFOHEADER) + sizeof(POCKETINFO1)*num
+ sizeof(POCKETINFO2)*num];
// ヘッダ部データの設定
INFOHEADER* pInfoHead = reinterpret_cast<INFOHEADER *>( pBytes );
// データ部1の設定
POCKETINFO1* pInfo1 = reinterpret_cast<POCKETINFO1*>( pInfoHead+1 );
// データ部2の設定
POCKETINFO2* pInfo2 = reinterpret_cast<POCKETINFO2*>( pInfo1+2 );
----------------------------------------------------------
> // データ部2の設定
> POCKETINFO2* pInfo2 = reinterpret_cast<POCKETINFO2*>( pInfo1+2 );
なぜに'2'を足す? POCKETINFO01 はいくつある?
>>なぜに'2'を足す? POCKETINFO01 はいくつある?
あ、すみません・・・ミスです。
'+1'です。
num=3の時どちら?
(a)
==================
INFOHEADER
==================
POCKETINFO1
==================
POCKETINFO2
==================
POCKETINFO1
==================
POCKETINFO2
==================
POCKETINFO1
==================
POCKETINFO2
==================
(b)
==================
INFOHEADER
==================
POCKETINFO1
==================
POCKETINFO1
==================
POCKETINFO1
==================
POCKETINFO2
==================
POCKETINFO2
==================
POCKETINFO2
==================
もし(a)だと、pInfo1[n]などとは使えなくなります。
>>なぜに'2'を足す? POCKETINFO01 はいくつある?
> あ、すみません・・・ミスです。
> '+1'です。
はァ? じゃ POCKETINFO(1)[n] はウソ?