2009-05-22 6 views
3

のアドレスを渡す:私はこのようなパブリック変数のアドレスを渡すしようとすると、パブリック変数

ML.Register("Radius", &lBeacons[i].Radius, 0.0f, 200.0f, 10.0f); 

私はこのエラーを取得する:

error CS0212: You can only take the address of an unfixed expression inside of a fixed statement initializer 

登録機能は、次のようになります。

public unsafe void Register(string desc, float* val, float minimum, float maximum, float stepsize) 

ビーコンはリストです。 Public Radiusを持つクラスを保持します。

+2

私はJon Skeetを召喚します!ポインタ全体の参照 - クラスと構造体のcsharpのものが彼の好きなテーマです。 –

+2

あなたのコメントを「私はRadius(と他の人)のアドレスを将来のためにMLに保存したい」 - いいえ!それをしないでください! .NETオブジェクトは動き回ります。固定ブロック(短命でなければならない)の外側にポインタを置くことはできません。 Radiusオブジェクト(参照)をMLに渡し、Radiusオブジェクトのプロパティを更新します。 –

+0

(私はBeaconオブジェクトを意味しました) –

答えて

2

なぜポインタを使用するのですか?変数の参照を渡すのに、単に "ref"キーワードを使うことができます。

例:

object blah = new object(); 

CallMethod(ref blah); 


public void CallMethod(ref object param) 
{ 

} 
+0

はい、私はRadiusのアドレスを将来のもののためにMLに保存したいと言っているのを忘れていました...それはどうして私がポインタ(と私のC++の考え方)を使用するのですか – JustFogMaxi

+0

これはわずかです変数への参照を渡すのと同じではありません。 –

+0

あなたはそれを言っていますか?値の型の代わりに参照型を使用しています。 – CSharpAtl

7

はそれだけで参照することで値を渡すために意味をなさないと思いませんか?

ML.Register("Radius", ref lBeacons[i].Radius, 0.0f, 200.0f, 10.0f); 

をしかし、それはあなたがRadiusない作業を行います場合:パブリック変数(フィールド)を使用して、もちろん

public void Register(string desc, ref float val, float minimum, 
     float maximum, float stepsize) {...} 

は、それはそうのように動作します...悪い考えすぎですプロパティ - これをしないでください。ビーコン(または同様のもの)自体、または他のオブジェクトベースの(または多分イベントベースの)メカニズムを渡すことを検討してください。


のようなもの:と

ML.Register("Radius", lBeacons[i], 0.0f, 200.0f, 10.0f); 

private Beacon beacon; 
public void Register(string desc, Beacon beacon, float minimum, 
     float maximum, float stepsize) { 
    this.beacon = beacon; 
} 
void Foo() { 
    beacon.Radius++; // etc 
} 

ここでは、ポインタのunsafe問題はありませんビーコンオブジェクトへの参照を持っています。 Beaconを直接公開したくない場合は、インターフェイスの使用を検討してください。

+0

あなたの担当者のスコアを持つ人と競争することはできません... :) – CSharpAtl

+0

私は嫌がらせをしません....あなたは非常に良い、簡潔な答えを与える......非常に完了します。 – CSharpAtl

+0

もちろん可能です;-p –

0

固定ブロックを試すことができます。

fixed(float *rad = &(lBeacons[i].Radius))) { 
    ML.Register("Radius", rad, 0f, 200f, 10f); 
} 

私はあなたがこれをどのような場合でもしたいとは思わない。 MLが固定ブロックの外側でradを使用すると、失敗する可能性があります。あなたのAPIを再考する方が良いと思います。

+0

私はそれがうまくいくのではないかと疑います。あなたは、コピーされた値型のアドレスを取得していると思います。 – leppie

4

のように、所定の位置にそれを固定する固定キーワードを使用して、変数へのポインタを取得するには、次の

fixed(float *radius=&lBeacons[i].Radius) 
{ 
    ML.Register("Radius", radius, 0.0f, 200.0f, 10.0f); 
} 

これは安全ではないと宣言する必要がありますに配置された方法を。

関連する問題