Question

Je suis en train d'apprendre les réseaux de neurones et je voudrais avoir le constructeur du neurone reçoit un pointeur vers une section dans un tableau qui serait le chromosome. Quelque chose comme ceci:

public int* ChromosomeSection;

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

Alors je voudrais créer mes neurones avec quelque chose comme ceci:

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

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

Est-il possible de le faire en C #? Je sais que C # prend en charge un code dangereux. Mais je ne sais pas comment dire au compilateur que la public Neuron(int* chromosomeSection) ligne est dangereux.

En outre, je serai capable de faire toutes les opérations que je ferais en C ++ ou C? Y at-il Gotcha je devrais connaître avant de commencer à le faire de cette façon? N'a jamais travaillé avec le code dangereux en C # avant.

Était-ce utile?

La solution

Eric Lippert a une belle série en deux parties: Références et Pointeurs, Première partie et mise en œuvre "pointeurs gérés" (Références Pointeurs et, la deuxième partie) .

Voici un type pratique je fouetté quand je traduisais un code pointeur manipulation complexe de C à C #. Il vous permet de faire un coffre-fort « pointeur managé » à l'intérieur d'un tableau. Vous obtenez toutes les opérations que vous pouvez faire sur un pointeur non géré: vous pouvez déréférencer comme un décalage dans un tableau, faites l'addition et la soustraction, comparer deux pointeurs pour l'égalité ou l'inégalité, et représentent un pointeur NULL. Mais à la différence du code dangereux correspondant, ce code ne pas gâcher le garbage collector et affirmera si vous faites quelque chose de stupide, comme essayer de comparer deux pointeurs qui sont à l'intérieur des tableaux différents. (*) Amusez-vous!

it helps.

Autres conseils

Sons comme vous pouvez utiliser ArraySegment<int> pour ce que vous essayez de faire.

ArraySegment est un wrapper autour de un tableau qui délimite une gamme de les éléments de cette matrice. Plusieurs les instances ArraySegment peuvent se référer à le même tableau original et peut chevauchement.

La propriété Array renvoie l'ensemble tableau original, pas une copie du réseau; Par conséquent, les modifications apportées à la tableau retourné par la propriété Array sont amenés à la matrice d'origine.

Oui, cela est parfaitement possible en C #, bien qu'un pointeur seul est pas suffisamment d'informations pour l'utiliser de cette façon, vous auriez également besoin d'un paramètre de longueur Int32, de sorte que vous savez combien de fois il est sûr d'incrémenter ce pointeur sans un dépassement -. cela devrait être familier si vous êtes d'un C ++ fond

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top