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

Register関数は次のようになります。

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

ビーコンはリストです。パブリック半径のクラスを開催しています。

4

4 に答える 4

8

参照によって値を渡すだけでは意味がありませんか?

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

もちろん、パブリック変数(フィールド)を使用することも悪い考えです...それは次のように機能します:

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

ただし、プロパティを作成すると機能しません。そのため、これを行わないでください。Radiusビーコン(または同様のもの)自体、またはその他のオブジェクトベース(またはイベントベース)のメカニズムを渡すことを検討してください。


何かのようなもの:

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
}

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

于 2009-05-22T13:59:38.220 に答える
4

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

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

これが配置されるメソッドは、安全でないものとして宣言する必要があります。

于 2009-05-22T14:03:29.227 に答える
2

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

例:

object blah = new object();

CallMethod(ref blah);


public void CallMethod(ref object param)
{

}
于 2009-05-22T13:58:12.230 に答える
0

固定ブロックを使ってみることができます。

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

とにかくこれをやりたくないと思います。MLが固定ブロックの外側でradを使用する場合、失敗する可能性があります。APIを再考したほうがいいと思います。

于 2009-05-22T14:00:39.963 に答える