Domanda

sto solo imparando le reti neurali e vorrei avere il costruttore della neurone ricevono un puntatore ad una sezione in un array che sarebbe il cromosoma. Qualcosa di simile a questo:

public int* ChromosomeSection;

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

Allora vorrei creare i miei neuroni con qualcosa di simile:

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

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

E 'possibile fare questo in C #? So C # supporta un certo codice non sicuro. Ma io non so come dire al compilatore che la linea public Neuron(int* chromosomeSection) è a rischio.

Inoltre, sarò in grado di fare ogni operazione che avrei fatto in C ++ o C? C'è qualche Gotcha dovrei essere a conoscenza prima di iniziare a farlo in questo modo? Mai lavorato con codice unsafe in C # prima.

È stato utile?

Soluzione

Eric Lippert ha belle serie in due parti: Riferimenti e puntatori, Part One e "puntatori gestiti" di attuazione (Riferimenti e puntatori, parte seconda) .

Ecco un tipo pratico ho incitato quando stavo traducendo un certo codice puntatore-manipolazione complessa da C a C #. Esso consente di effettuare una cassetta di sicurezza "puntatore gestito" per l'interno di un array. È possibile ottenere tutte le operazioni che si possono fare su un puntatore non gestito: si può dereferenziarlo come un offset in un array, fare addizioni e sottrazioni, confrontare due puntatori per l'uguaglianza o disuguaglianza, e rappresentano un puntatore nullo. Ma a differenza del corrispondente codice non sicuro, questo codice non fa rovinare il garbage collector e affermerà se fai qualcosa di insensato, come cercare di confrontare due puntatori che sono interni alle diverse matrici. (*) Buon divertimento!

La speranza aiuta.

Altri suggerimenti

Sembra che si potrebbe usare ArraySegment<int> per quello che si sta cercando di fare.

ArraySegment è un involucro intorno una matrice che delimita un intervallo di elementi di tale matrice. multiplo casi ArraySegment possono fare riferimento a la stessa matrice originale e può sovrapposizione.

La proprietà Array restituisce l'intero array originale, non una copia della Vettore; Pertanto, le modifiche apportate al matrice restituito dalla proprietà Array sono fatti all'array originale.

Sì, questo è perfettamente possibile in C #, anche se un puntatore da solo non sono sufficienti informazioni per utilizzarlo in questo modo, si sarebbe anche bisogno di un parametro di lunghezza Int32, in modo da sapere quante volte è sicuro di incrementare tale puntatore senza un superamento -. questo dovrebbe essere familiare se siete da un background C ++

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top