Передача адреса публичной переменной - PullRequest
3 голосов
/ 22 мая 2009

Когда я пытаюсь передать адрес публичной переменной следующим образом:

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 ]

8 голосов
/ 22 мая 2009

Не имеет ли смысла просто передавать значение по ссылке?

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 напрямую, рассмотрите возможность использования интерфейса.

4 голосов
/ 22 мая 2009

Чтобы получить указатель на переменную, используйте фиксированное ключевое слово, чтобы закрепить ее на месте, например:

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

Метод, в который он помещается, должен быть объявлен небезопасным.

2 голосов
/ 22 мая 2009

Зачем использовать указатели? Вы можете просто использовать ключевое слово ref, чтобы передать ссылку на переменную.

пример:

object blah = new object();

CallMethod(ref blah);


public void CallMethod(ref object param)
{

}
0 голосов
/ 22 мая 2009

Вы можете попробовать использовать фиксированный блок.

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

Я не думаю, что вы хотите сделать это в любом случае. Если ML использует рад вне фиксированного блока, он может потерпеть неудачу. Я думаю, вам лучше переосмыслить свой API.

...