C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

構造体ポインタのキャスト


(過去ログ 3 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■3342 / inTopicNo.1)  構造体ポインタのキャスト
  
□投稿者/ ぽこぶび 二等兵(1回)-(2006/04/28(Fri) 18:51:21)

分類:[C#] 


分類:[C#] 

VS2003のC#で下記のコードをコンパイルしようとすると
fixed ステートメントの初期化子内の fixed でないステートメントのアドレスのみを取得できます。
というエラーになってコンパイルを完了することができません。
どのようにコードを変更したらよいのでしょうか?

// ------------------------------------
public struct TESTSTRUCT
{
public byte str1;
public byte str2;
}

private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
unsafe
{
byte [] byBuf = new byte[10];
byte byteBuf;

TESTSTRUCT *pTestStruct = (TESTSTRUCT *)byteBuf;
TESTSTRUCT *pTestStruct2 = (TESTSTRUCT *)&byBuf[0]; // ここでエラー

}
}
// ------------------------------------

以上どうかよろしくお願いいたします。



0
引用返信 編集キー/
■3343 / inTopicNo.2)  Re[1]: 構造体ポインタのキャスト
□投稿者/ Hongliang 二等兵(16回)-(2006/04/28(Fri) 19:18:01)
Hongliang さんの Web サイト

分類:[C#] 

これですね。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cscomp/html/vcerrCompilerErrorSC0212.asp
配列はマネージドオブジェクトであって、C/C++ みたいな単なるメモリの固まりではありません。GC は必要であれば随時各要素を最適な位置に再配置することができます(もちろん通常の実行には問題ありません)。
しかしポインタで操作するにはこれでは都合が悪いので、明示的にアドレスを固定する必要があります。それが fixed ステートメントです。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/csref/html/vclrfFixed.asp
これを使えば、配列をポインタで扱うことができるようになります。

ちなみに、単に unsafe 内部で使うだけなら、初めからポインタとして確保する stackalloc キーワードが存在します。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/csref/html/vclrfStackalloc.asp

0
引用返信 編集キー/
■3344 / inTopicNo.3)  Re[2]: 構造体ポインタのキャスト
□投稿者/ ぽこぶび 二等兵(2回)-(2006/04/28(Fri) 21:13:37)

分類:[C#] 

早速のお返事ありがとうございます。
ためしに下記のようなコードを書いてみたのですが
fixed( TESTSTRUCT *pTestStruct3 = (TESTSTRUCT *)&byBuf[0] )
{
}
固定ステートメントの代入式の右辺はキャスト式ではない可能性があります。

fixed( TESTSTRUCT *pTestStruct3 = &byBuf[0] )
{
}
型 'byte*' を型 'TESTSTRUCT*' に暗黙的に変換できません。

となってしまい、どうしたらよいのかどうもわかりません。
申し訳ありませんが、コンパイルの通るソースをおしえてもらえませんでしょうか?

stackallocの方ですが、どうやってbyte型へのポインタを
TESTSTRUCT型のポインタにキャストすればよいのでしょうか?


0
引用返信 編集キー/
■3345 / inTopicNo.4)  Re[3]: 構造体ポインタのキャスト
□投稿者/ Hongliang 二等兵(17回)-(2006/04/28(Fri) 21:33:24)
Hongliang さんの Web サイト

分類:[C#] 

MSDN の fixed の項目には、

fixed ( type* ptr = expr ) statement

という形式に対して、

type アンマネージ型または void。
ptr ポインタ名。
expr 暗黙で type* に変換できる式。

となってますよね。
byte* から TESTSTRUCT* には暗黙には変換できません。
ですからここの type には byte* を使う必要があります。
他の型のポインタにするには、ステートメントの中でキャストしてください。

0
引用返信 編集キー/
■3346 / inTopicNo.5)  Re[4]: 構造体ポインタのキャスト
□投稿者/ Hongliang 二等兵(18回)-(2006/04/28(Fri) 21:35:28)
Hongliang さんの Web サイト

分類:[C#] 

stackalloc で確保したポインタも同じです。
目的のポインタ型に明示的にキャストすればいいです。

0
引用返信 編集キー/
■3350 / inTopicNo.6)  Re[4]: 構造体ポインタのキャスト
□投稿者/ ぽこぶび 二等兵(3回)-(2006/04/28(Fri) 22:14:18)

分類:[C#] 

再び質問で申し訳ありません。
リンクをはって頂いたMSDNのFIXEDのヘルプを参照したのですが
下記のようなコードしか思いつかずどうしたらよいのかわかりません。

fixed( TESTSTRUCT *pTestStruct3 = (TESTSTRUCT *)&byBuf[0] )
{
}
エラー:固定ステートメントの代入式の右辺はキャスト式ではない可能性があります。

どこがいけないのか?なのでどう修正したらよいのでしょうか?


0
引用返信 編集キー/
■3352 / inTopicNo.7)  Re[5]: 構造体ポインタのキャスト
□投稿者/ Hongliang 二等兵(19回)-(2006/04/28(Fri) 22:40:25)
Hongliang さんの Web サイト

分類:[C#] 

落ち着いて私の先のレスを読んでください。

> fixed ( type* ptr = expr ) statement

> expr 暗黙で type* に変換できる式。

> byte* から TESTSTRUCT* には暗黙には変換できません。
> ですからここの type には byte* を使う必要があります。

> 他の型のポインタにするには、ステートメントの中でキャストしてください。
//「ステートメントの中」は 上の statement の部分です。


fixed( TESTSTRUCT *pTestStruct3 = (TESTSTRUCT *)&byBuf[0] )
というコードは、形式に従っていませんよね?

0
引用返信 編集キー/
■3353 / inTopicNo.8)  Re[5]: 構造体ポインタのキャスト
□投稿者/ ぽこぶび 二等兵(4回)-(2006/04/28(Fri) 22:43:07)

分類:[C#] 

自己レスです。

Fixedの件ですが、意味がやっとわかり問題点が解決しました。

どうも、勘違いな理解をしてしまったようで
お手数をおかけして申し訳ありませんでした。

初歩的なミスでご迷惑をおかけしました。


解決済み
引用返信 編集キー/
■3355 / inTopicNo.9)  Re[6]: 構造体ポインタのキャスト
□投稿者/ も 二等兵(11回)-(2006/04/29(Sat) 14:02:07)

分類:[C#] 

No3353に返信(ぽこぶびさんの記事)
> 自己レスです。
>
> Fixedの件ですが、意味がやっとわかり問題点が解決しました。
>
> どうも、勘違いな理解をしてしまったようで
> お手数をおかけして申し訳ありませんでした。
>
> 初歩的なミスでご迷惑をおかけしました。
マルチポスト先にも一報入れておいた方がいいのでは?

0
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -