
C# 2010 version 4.0を使用しています。
下のコードでは、
class1のメンバ変数のkのアドレスを取得してポインタ変数aに参照させたいと思っているのですが、
「fixed ステートメントの初期化子内の fixed でない式のアドレスのみを取得できます。」
というようなエラーがでてしまいます・・・
これはどのように記述したら解決できるのでしょうか?
class class1
{
private int k = 1;
unsafe public void Bind(int* i)
{
i = &(this.k);//この部分がエラー
}
}
class Program
{
unsafe static void Main(string[] args)
{
class1 c = new class1();
int* a = null;
c.Bind(a);
Console.WriteLine(*a); // 1が表示されたい
Console.ReadLine();
}
}
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
> たしかにこれだとできるのですが、
> クラスのメンバ変数を使うと先ほどのようなエラーがでてまいます・・・
アドレスを解決できないですからね。
…だけで終わったらどうします?また聞くんですか?
しかも「でてまいます」って誤字だし。
聞きたいのであれば、ちゃんと聞きましょう。
確かに「聞きたいであろう」ということは分かりますが、
もう少し丁寧に「聞く」ことを心がけましょう!
(少し不快に感じたのであえて言っています。)
取り敢えずこんな感じなら簡単ですがやりたいことが実現できてますか?
コンパイルだけなら通るハズです。
(というかNo.3の内容をよく考えれば分かりそうですが…)
class class1
{
private int k = 1;
unsafe public void Bind(int* i)
{
int localK = k;
i = &localK;
}
}
class Program
{
unsafe static void Main(string[] args)
{
class1 c = new class1();
int* a = null;
c.Bind(a);
Console.WriteLine(*a);
Console.ReadLine();
}
}
(せっかくポインタの概念を外したC#で)何を実現されたいのか分かりませんが、
通常のC#と違いポインタを使用する場合はアドレスの概念が発生します。
それを念頭に置かないと、同様の理由によるエラーが発生します。
それと、この感じだとNullReferenceExceptionについても聞かれそうなので
先に回答しておきます。(上記コードを実行すると発生します)
理由は参照渡しではなく値渡しになっているからです。
(なぜ値渡しか…等はアドレスの概念と合わせて勉強して下さい)
なので、実際に期待されるコードにするのであれば
以下のようなコードでないといけません。
class class1
{
private int k = 1;
unsafe public int* Bind()
{
int localK = k;
return &localK;
}
}
class Program
{
unsafe static void Main(string[] args)
{
class1 c = new class1();
int* a = null;
a = c.Bind();
Console.WriteLine(*a);
Console.ReadLine();
}
}
このコードであれば、取り敢えず「1」と表示されます。
取り敢えずこのサイト辺りから初めて
http://ufcpp.net/study/csharp/sp_unsafe.html
よく分からないのであれば書籍の購入も検討しましょう。
ご回答ありがとうございます。
気分を害されたのなら、申し訳ございません。
自分の求めてる結果と違うようなので、もう少し質問させて頂きたいのですが、
今の自分のレベルではポインタについてしっかり理解するまで時間がかかりそうですので、
とりあえずこれで質問を締め切りたいと思います。
No.3
- 回答日時:
すいません、最初のは忘れて下さい。
こうです。
class class1
{
unsafe public void Bind(int* i)
{
int k = 1;
i = &k;
}
}
class Program
{
unsafe static void Main(string[] args)
{
class1 c = new class1();
int* a = null;
c.Bind(a);
Console.WriteLine(*a);
Console.ReadLine();
}
}
これで取り敢えず実行はできるハズです。
結果は…
ご回答ありがとうございます。
たしかにこれだとできるのですが、
クラスのメンバ変数を使うと先ほどのようなエラーがでてまいます・・・
No.2
- 回答日時:
はわゎ…
「fixed ステートメントの初期化子内の fixed でない式のアドレスのみを取得できます。」
だけ読んで回答しちゃいました。
大変申し訳ありません。
> i = &(this.k);//この部分がエラー
kがフィールド変数(メンバ変数?)だからですね。
unsafe public void Bind(int* i)内に
int k = 1;
と書いてあげればOKなハズです。
フィールド変数(メンバ変数?)だと「いや、ドコだし」って怒ってるワケです。
ご回答ありがとうございます。
こうですか?
int k = 1;
fixed (i = &k) { }
これでも「IDがありません」というエラーです・・・
=のところにエラーが出てるようなのですが
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
C++でboolにintの値を代入する...
-
DWORDの実際の型は何でしょうか
-
C言語のコンパイルエラー
-
C++のfor文について
-
main.c:7:43: warning: implici...
-
エラー「invalid conversion fr...
-
変数の型を定義しなかった場合...
-
enumについて
-
構造体の宣言でエラーが出ます。
-
C言語 宣言した変数になにも代...
-
void func( void )について
-
inline
-
【#define】 defineで定義した...
-
構造体を生成時にわざわざ初期...
-
#defineについて
-
DLLのLPSTR 項目の戻り値の取得...
-
警告をださずにポインタにnull...
-
typedef enumの使い方を教えて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
main.c:7:43: warning: implici...
-
intとINTの違いは?
-
C++のfor文について
-
2重定義って??
-
void func( void )について
-
変数の型を定義しなかった場合...
-
C言語のコンパイルエラー
-
C++でboolにintの値を代入する...
-
ハンドルされていない例外が発...
-
構造体の要素すべてに対する四...
-
構造体の宣言でエラーが出ます。
-
プログラムの中で別のmainを呼...
-
[C++]メンバ関数の仮引数について
-
0除算を判定したい
-
プログラム、どのように書いて...
-
typedef enumの使い方を教えて...
-
enumについて
おすすめ情報