Frage

Ich lerne nur neuronale Netzwerke und möchte, dass der Konstruktor des Neurons einen Zeiger auf einen Abschnitt in einem Array erhält, der das Chromosom wäre. Etwas wie das:

public int* ChromosomeSection;

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

Dann würde ich meine Neuronen mit so etwas schaffen:

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

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

Ist es möglich, dies in C#zu tun? Ich weiß, dass C# einen unsicheren Code unterstützt. Aber ich weiß nicht, wie ich dem Compiler sagen soll, dass die Linie public Neuron(int* chromosomeSection) ist unsicher.

Kann ich auch jede Operation durchführen, die ich in C ++ oder C machen würde? Gibt es Gotcha, von denen ich mich bewusst sein sollte, bevor ich damit anfange, es so zu machen? Arbeitete noch nie mit unsicherem Code in C#.

War es hilfreich?

Lösung

Eric Lippert Hat schöne zweiteilige Serie: Referenzen und Zeiger, Teil 1 und Implementierung "Managed Pointers" (Referenzen und Zeiger, Teil zwei).

Hier ist ein praktischer Typ, den ich ausgepeitscht habe, als ich einen komplexen Zeiger-Manipulationscode von C nach C#übersetzte. Sie können einen sicheren "verwalteten Zeiger" auf das Innere eines Arrays machen. Sie erhalten alle Vorgänge, die Sie auf einem nicht verwalteten Zeiger ausführen können: Sie können ihn als Offset in ein Array, Addition und Subtraktion durchführen, zwei Zeiger für Gleichheit oder Ungleichheit vergleichen und einen Nullzeiger darstellen. Aber im Gegensatz zum entsprechenden unsicheren Code durchfällt dieser Code den Müllsammler nicht und behauptet, wenn Sie etwas Dummes tun, z. B. versuchen Sie, zwei Zeiger zu vergleichen, die mit verschiedenen Arrays innen sind. (*) Genießen!

Ich hoffe es hilft.

Andere Tipps

Klingt so, als könntest du benutzen ArraySegment<int> Für das, was Sie versuchen zu tun.

ArraySegment ist ein Wrapper um ein Array, das eine Reihe von Elementen in diesem Array begrenzt. Mehrere Arraysegment -Instanzen können sich auf dasselbe Original -Array beziehen und sich überlappen.

Die Array -Eigenschaft gibt das gesamte Originalarray zurück, keine Kopie des Arrays; Daher werden Änderungen an dem von der Array -Eigenschaft zurückgegebenen Array an das ursprüngliche Array vorgenommen.

Ja, das ist in C#durchaus möglich, obwohl ein Zeiger allein nicht ausreichend Informationen ist, um ihn auf diese Weise zu verwenden, benötigen Sie auch einen INT32 -Längenparameter, sodass Sie wissen, wie oft es sicher ist, diesen Zeiger ohne Überlauf zu erhöhen - - Dies sollte bekannt sein, wenn Sie aus einem C ++ - Hintergrund stammen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top