Передать указатель на секцию массива в качестве параметра в C # - PullRequest
1 голос
/ 27 апреля 2011

Я только изучаю нейронные сети, и я хотел бы, чтобы конструктор нейрона получил указатель на раздел в массиве, который был бы хромосомой.Примерно так:

public int* ChromosomeSection;

public Neuron(int* chromosomeSection)
{
    ChromosomeSection = chromosomeSection;
}

Итак, я бы создал свои нейроны примерно так:

int[] Chromosome = new int[neuronsCount * neuronDataSize];

for (int n = 0; n < Chromosome.Length; n += neuronDataSize)
{
    AddNeuron(new Neuron(Chromosome + n));
}

Возможно ли это сделать в C #?Я знаю, что C # поддерживает небезопасный код.Но я не знаю, как сказать компилятору, что строка public Neuron(int* chromosomeSection) небезопасна.

Кроме того, смогу ли я выполнять все операции, которые я делал бы в C ++ или C?Есть ли что-то, о чем я должен знать, прежде чем начать делать это таким образом?Никогда раньше не работал с небезопасным кодом в C #.

Ответы [ 3 ]

1 голос
/ 27 апреля 2011

Эрик Липперт имеет прекрасную серию из двух частей: Ссылки и указатели, часть первая и Реализация "управляемых указателей" (Ссылки и указатели, часть вторая) .

Вот полезный тип, который я выбрал, когда переводил какой-то сложный код манипуляции с указателем из C в C #.Это позволяет вам создать безопасный «управляемый указатель» внутри массива.Вы получаете все операции, которые вы можете выполнить с неуправляемым указателем: вы можете разыменовать его как смещение в массив, выполнить сложение и вычитание, сравнить два указателя на равенство или неравенство и представить нулевой указатель.Но в отличие от соответствующего небезопасного кода, этот код не портит сборщик мусора и будет утверждать, если вы делаете что-то глупое, например, пытаетесь сравнить два указателя, которые являются внутренними, для разных массивов.(*) Наслаждайтесь!

Надеюсь, это поможет.

1 голос
/ 27 апреля 2011

Похоже, вы могли бы использовать ArraySegment<int> для того, что вы пытаетесь сделать.

ArraySegment - это оболочка вокруг массив, который ограничивает диапазон элементы в этом массиве. множественный Экземпляры ArraySegment могут ссылаться на тот же оригинальный массив и может пересекаться.

Свойство Array возвращает все оригинальный массив, а не копия массив; следовательно, изменения, внесенные в массив, возвращаемый свойством Array сделаны в исходный массив.

0 голосов
/ 27 апреля 2011

Да, это вполне возможно в C #, хотя одного указателя недостаточно для его использования таким образом, вам также понадобится параметр длины Int32, чтобы вы знали, сколько раз безопасно увеличивать этот указатель без переполнение - это должно быть знакомо, если вы из C ++ фона.

...