c#のパラメーターとして配列セクションにポインターを渡す
-
24-10-2019 - |
質問
私は神経ネットワークを学んでいるだけで、ニューロンのコンストラクターに染色体となる配列のセクションへのポインターを受け取らせたいと思います。このようなもの:
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#で安全でないコードを使用したことはありません。
解決
エリック・リパート 素敵な2部構成のシリーズがあります: 参照とポインター、パート1 と 「マネージドポインター」の実装(参照とポインター、パート2).
複雑なポインター操作コードをCからC#に翻訳していたときに、これがホイップされた便利なタイプです。アレイの内部に安全な「管理されたポインター」を作ることができます。管理されていないポインターで行うことができるすべての操作を取得します。オフセットとしてアレイへのオフセットとして再参照し、追加と減算を行い、平等または不平等の2つのポインターを比較し、ヌルポインターを表します。しかし、対応する安全でないコードとは異なり、このコードはガベージコレクターを台無しにすることはなく、愚かなことをする場合、さまざまな配列と内部の2つのポインターを比較しようとするような愚かなことをする場合、主張します。 (*) 楽しみ!
それが役に立てば幸い。
他のヒント
使用できるように聞こえます ArraySegment<int>
あなたがやろうとしていることのために。
ArraySegmentは、その配列内のさまざまな要素を区切る配列の周りのラッパーです。複数のArraysegmentインスタンスは、同じ元の配列を参照してオーバーラップできます。
配列プロパティは、配列のコピーではなく、元の配列全体を返します。したがって、配列プロパティによって返される配列に加えられた変更は、元の配列に行われます。
はい、これはC#で完全に可能ですが、単独でのポインターはこの方法でそれを使用するのに十分な情報ではありませんが、int32長さパラメーターも必要です。これは、C ++のバックグラウンドから来た場合は馴染みがあります。