割り当てたメモリに値を設定したい – プログラミング – Home

割り当てたメモリに値を設定したい
 
通知
すべてクリア

[解決済] 割り当てたメモリに値を設定したい

固定ページ 1 / 2

山田★靖
 山田★靖
(@山田★靖)
ゲスト
結合: 22年前
投稿: 24
Topic starter  

はじめまして。山田と申します。

newを使ってBYTE型で確保した領域に値を
設定したいのですが、設定の仕方がわかりません。
確保したい領域のサイズは下記のような構造体として
実際に構造体のように値をセットする為の方法を教えて
いただけないでしょうか?

-----------------------------------
・確保したい領域のサイズ
-----------------------------------
// 情報ヘッダ
typedef struct _INFOHEADER
{
DWORD DataSize;
WORD DataNum;
}INFOHEADER;
-----------------------------------
// 領域を確保する
BYTE *pInofHed; = new BYTE[sizeof(INFOHEADER)]

~   領域に値をセットする   ~
-----------------------------------


引用未解決
トピックタグ
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

INFOHEADER *pInofHed = new INFOHEADER;
が素直だと思うのですが……。

最後に不定長配列があるなどの理由でBYTE配列が必要なら,
BYTE * pInofHedBuf = new BYTE [sizeof(INFOHEADER)];
INFOHEADER * pInofHed = reinterpret_cast<INFOHEADER *>(pInofHedBuf);
のようにすればよいです。

こうすれば,pInofHedはINFOHEADERへのポインタですから,
pInofHed->DataSize = 10;
のようにしてアクセスできます。


返信引用
小悪魔恭子
 小悪魔恭子
(@小悪魔恭子)
ゲスト
結合: 22年前
投稿: 25
 

INFOHEADER* p = (INFOHEADER*)new INFOHEADER;
p->DataSize = //ほにゃらら
p->DataNum = //ほにゃらら

じゃだめですか?


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

「バイナリファイルに書くから勝手にパディングされたら困る。
 なおかつ、#pragma pack とか使いたくない。」

というような事情でもあるんでしょうか?


返信引用
山田★靖
 山田★靖
(@山田★靖)
ゲスト
結合: 22年前
投稿: 24
Topic starter  

遅くなりまして申し訳ございません。
ご解答ありがとうございます。

なぜ、BYTE型で確保した領域で使いたいかと言うと
確保したい領域は毎回違うからです。
「32バイトの構造体をX個確保する」ような処理をしています。
-----------------------------------------------------------------
// 情報領域確保
BYTE *pPocketInfo = new BYTE[sizeof(INFOHEADER) +
(sizeof(POCKETINFO)*num)]
-----------------------------------------------------------------
上記のような処理を実際にしています。

自分の所ではメモリにデータを設定し、そのアドレスとサイズを
あるクラスに返却するというクラスを作っています。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

こんな感じでは。

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;
}


返信引用
山田★靖
 山田★靖
(@山田★靖)
ゲスト
結合: 22年前
投稿: 24
Topic starter  

ご解答ありがとうございます。
ちょっとコードで理解できない箇所が・・・

POCKETINFO* pPocketInfo = (POCKETINFO*)(pInfo + 1);
              ^^^^^^^^^^^^^^^^^^^^^^^^^
チェックした部分のコードを解説してもらえないでしょうか?
勉強不足で申し訳ございません。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

ある型のポインタに1を足すと、その型のサイズ分だけ先の位置を指すポインタが
できます。

============= <- pInfo
INFOHEADER
============= <- (pInfo+1) == pPocketInfo == &pPocketInfo[0]
POCKETINFO
============= <- &pPocketInfo[1]
POCKETINFO
=============
:

こんな感じになります。


返信引用
山田★靖
 山田★靖
(@山田★靖)
ゲスト
結合: 22年前
投稿: 24
Topic starter  

わかり易い解説ありがとうございました。

実際コードに書いてコンパイルしたところ
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;
}


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

ごめんなさいキャストが抜けてました。

BYTE* pBytes = new BYTE[ ... ];
INFOHEADER* pInfo = reinterpret_cast<INFOHEADER*>( pBytes );

deleteするときはpInfoでなくキャスト前のpBytesの方を渡さないといけない
みたいです。

delete[] pBytes;


返信引用
山田★靖
 山田★靖
(@山田★靖)
ゲスト
結合: 22年前
投稿: 24
Topic starter  

構造体が「ヘッダ部+データ部*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 );
----------------------------------------------------------


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> // データ部2の設定
> POCKETINFO2* pInfo2 = reinterpret_cast<POCKETINFO2*>( pInfo1+2 );

なぜに'2'を足す? POCKETINFO01 はいくつある?


返信引用
山田★靖
 山田★靖
(@山田★靖)
ゲスト
結合: 22年前
投稿: 24
Topic starter  

>>なぜに'2'を足す? POCKETINFO01 はいくつある?

あ、すみません・・・ミスです。
'+1'です。


返信引用
REE
 REE
(@REE)
ゲスト
結合: 24年前
投稿: 240
 

num=3の時どちら?

(a)
==================
INFOHEADER
==================
POCKETINFO1
==================
POCKETINFO2
==================
POCKETINFO1
==================
POCKETINFO2
==================
POCKETINFO1
==================
POCKETINFO2
==================

(b)

==================
INFOHEADER
==================
POCKETINFO1
==================
POCKETINFO1
==================
POCKETINFO1
==================
POCKETINFO2
==================
POCKETINFO2
==================
POCKETINFO2
==================

もし(a)だと、pInfo1[n]などとは使えなくなります。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

>>なぜに'2'を足す? POCKETINFO01 はいくつある?
> あ、すみません・・・ミスです。
> '+1'です。

はァ? じゃ POCKETINFO(1)[n] はウソ?


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

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