Pregunta

Solo estoy aprendiendo redes neuronales y me gustaría que el constructor de la neurona reciba un puntero a una sección en una matriz que sería el cromosoma. Algo como esto:

public int* ChromosomeSection;

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

Entonces crearía mis neuronas con algo como esto:

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

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

¿Es posible hacer esto en C#? Sé que C# admite un código inseguro. Pero no sé cómo decirle al compilador que la línea public Neuron(int* chromosomeSection) no es seguro.

Además, ¿podré hacer todas las operaciones que haría en C ++ o C? ¿Hay alguna gotcha que deba tener en cuenta antes de comenzar a hacerlo de esta manera? Nunca antes trabajé con código inseguro en C#.

¿Fue útil?

Solución

Eric Lippert Tiene una buena serie de dos partes: Referencias y punteros, parte uno y Implementación de "punteros administrados" (referencias y punteros, segunda parte).

Aquí hay un práctico tipo que avanzé cuando traducía un código complejo de manipulación de puntero de C a C#. Le permite hacer un "puntero" seguro al interior de una matriz. Obtiene todas las operaciones que puede hacer en un puntero no administrado: puede desreferirlo como un desplazamiento en una matriz, hacer suma y resta, comparar dos punteros para la igualdad o desigualdad, y representar un puntero nulo. Pero a diferencia del código inseguro correspondiente, este código no arruina el recolector de basura y afirmará si hace algo tonto, como tratar de comparar dos punteros que son interiores con diferentes matrices. (*) ¡Disfrutar!

Espero eso ayude.

Otros consejos

Parece que podrías usar ArraySegment<int> por lo que estás tratando de hacer.

Arraysegment es un envoltorio alrededor de una matriz que delimita una variedad de elementos en esa matriz. Múltiples instancias de matriz pueden referirse a la misma matriz original y pueden superponerse.

La propiedad de la matriz devuelve toda la matriz original, no una copia de la matriz; Por lo tanto, los cambios realizados en la matriz devuelto por la propiedad de la matriz se realizan a la matriz original.

Sí, esto es perfectamente posible en C#, aunque un puntero solo no es información suficiente para usarla de esta manera, también necesitaría un parámetro de longitud INT32, por lo que sabe cuántas veces es seguro incrementar ese puntero sin un invadto - Esto debería ser familiar si eres de un fondo C ++.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top