入れ子の構造体のアドレスを渡したい – プログラミング – Home

入れ子の構造体のアドレスを渡したい
 
通知
すべてクリア

[解決済] 入れ子の構造体のアドレスを渡したい


yokoyoko
 yokoyoko
(@yokoyoko)
ゲスト
結合: 22年前
投稿: 14
Topic starter  

・C言語のみ
・Windows95 VisualC++4.0

構造体Bは5個あって、その全てに値が設定しておき、
ある条件によって、そのいずれか一つの値を使用したいとします。

StructureA[ii] = StructureB[now][ii];

とやって、使用したい構造体Bのアドレスを渡しているのですが、
あとで構造体Aの内容を見ると、値が正しく入っていないようなのです。
この方法で正しく渡せていますでしょうか?
もし、間違っていれば御教授願えますでしょうか。
よろしくおねがいします。

-------------------------------------------
------

// タイプ1の構造体
struct Struct_Type1
{
// タイプ年齢1の構造体
struct Struct_Nenrei1
{
int nNumber;
int nAge;
int nSex;
} StructureN[50];
};

// 構造体配列へのポインタ
struct Struct_Type1 * StructureA[50];
struct Struct_Type1 * StructureB[5][50];

// 領域の確保と初期化
for ( ii = 0 ; ii < 5 && status == 0 ; ii++ )
{
for ( jj = 0 ; jj < 50 && status == 0 ; jj++ )
{
StructureB[ii][jj] = ( struct Struct_Type1 *) malloc ( sizeof( struct
Struct_Type1 ) );

if ( StructureB[ii][jj] != NULL )
{
memset( StructureB[ii][jj],0x00,sizeof( struct Struct_Type1 ) );
}
else
{
status = -1;
}
}
}

// **********************************************
// StructureB[ii][jj] の各メンバーに値をセットします
//
**********************************************

int now;

now = N // N = 0~5 のいずれかが入るとする

for( ii = 0 ; ii < 5; ii++ )
{
// 今回の N番目のStructureBのアドレスを渡したい
StructureA[ii] = StructureB[now][ii];
}

// 今後は、StructureA を参照する

-------------------------------------------
------


引用未解決
トピックタグ
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

頭が悪いのか、貴方のコードの意味も、意図も分りません。説明してください

> for ( jj = 0 ; jj < 50 && status == 0 ; jj++ )
> {
> StructureB[ii][jj] = ( struct Struct_Type1 *) malloc ( sizeof( struct
>Struct_Type1 ) );
>
> if ( StructureB[ii][jj] != NULL )
> {
> memset( StructureB[ii][jj],0x00,sizeof( struct Struct_Type1 ) );
> }
> else
> {
> status = -1;
> }
> }
良く分らないのは malloc で確保した領域へのポインターを memset() でわざわざ壊している
点(malloc に成功すれば NULL 以外の番地が返ってくるから、NULL でない場合は成功)
と、何故ポインターのはずの StructureB[ii][jj] に構造体分の大きさで0で埋めるのか
という点です


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> 構造体Bは5個あって、その全てに値が設定しておき、
> ある条件によって、そのいずれか一つの値を使用したいとします。
...
> あとで構造体Aの内容を見ると、値が正しく入っていないようなのです。

この辺の記述が曖昧です。
下記の箇所を直してもうまくいかないなら、詳しく説明してください。

for( ii = 0 ; ii < 50; ii++ ) // 5 -> 50
{
// 今回の N番目のStructureBのアドレスを渡したい
StructureA[ii] = StructureB[now][ii];
}


返信引用
yokoyoko
 yokoyoko
(@yokoyoko)
ゲスト
結合: 22年前
投稿: 14
Topic starter  

>良く分らないのは malloc で確保した領域へのポインターを
>memset() でわざわざ壊している点(malloc に成功すれば
>NULL 以外の番地が返ってくるから、NULL でない場合は成功)
>と、何故ポインターのはずの StructureB[ii][jj] に
>構造体分の大きさで0で埋めるのかという点です

島さんへ

RESありがとうございます。

この部分は私がコードを書いたわけではないので理由は分かりません。

ですが、既存の他のコードも同様に0x00で構造体のサイズ分初期化しています。

私がお伺いした部分の方はいかがでしょうか?


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> 良く分らないのは malloc で確保した領域へのポインターを memset() でわざわざ壊してい

> 点(malloc に成功すれば NULL 以外の番地が返ってくるから、NULL でない場合は成功)
> と、何故ポインターのはずの StructureB[ii][jj] に構造体分の大きさで0で埋めるのか
> という点です

これは多分あってるのでしょう。
初期化されているのはポインタが指している領域です。


返信引用
yokoyoko
 yokoyoko
(@yokoyoko)
ゲスト
結合: 22年前
投稿: 14
Topic starter  

>この辺の記述が曖昧です。
>下記の箇所を直してもうまくいかないなら、詳しく説明してください。
>for( ii = 0 ; ii < 50; ii++ ) // 5 -> 50

たいちうさんへ

RESありがとうです。

私のコピペミスです。

ここ(ii)は 50でした。

これだと、StructureA[ii]のメンバーを参照すると

アクセス違反になります。

それで悩んでいます。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

参照するほうのiiも50だったりはしませんよね?
私が曖昧だと指摘した部分の説明をお願います。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> now = N // N = 0~5 のいずれかが入るとする

見落としてましたが、N = 5 もまずいでしょう。
配列の宣言と使える範囲の関係は理解してますよね?


返信引用
yokoyoko
 yokoyoko
(@yokoyoko)
ゲスト
結合: 22年前
投稿: 14
Topic starter  

たいちうさんへ

>参照するほうのiiも50だったりはしませんよね?

ええと、アクセス違反の原因が分かりました。

構造体のアドレスがきちんと渡っていないと思い込んでいたのですが、

StructureA を参照に行く箇所で、

StructureA[N][ii] という事をやっている事が原因でした。

チェックミスですね。すいません。

RESありがとうございました。

>私が曖昧だと指摘した部分の説明をお願います。

ファイルから、大量のデータを読み込んで

構造体に格納していたのですが、量があまりにも多いので

構造体のメンバーで切り分けに使える値がありました。( 0~5 )

それで、ファイルからの展開は全データ分を6本×50個(仮の数字ですが)を

StructureBに行い、切り分けに使える値(0~5)を見て、

その時に必要な StructureBのアドレスを StructureAの

ポインタに渡してあげようと思っていたのです。

これで解っていただけましたでしょうか?

あと、初めに島さんに指摘されたような構造体のアドレスを保持する

ポインタの配列を0で初期化するのはおかしい事なのでしょうかね?

このへんは私にはどの方法が正しいのかよく解りませんでした。

RESくださった方々、本当にありがとうございました。


返信引用
yokoyoko
 yokoyoko
(@yokoyoko)
ゲスト
結合: 22年前
投稿: 14
Topic starter  

> now = N // N = 0~5 のいずれかが入るとする
>見落としてましたが、N = 5 もまずいでしょう。
>配列の宣言と使える範囲の関係は理解してますよね?

はい、これも私のケアレスミスです。

宣言は6で行っておりました。

つまらないミスですいませんでした。


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

島です

>memset( StructureB[ii][jj],0x00,sizeof( struct Struct_Type1 ) );
の部分に関しての疑問は私の間違いでした yokoyoko さん、皆さん、すみませんでした
たいちろうさんの仰る通りで問題ないコードです


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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