1

私はちょうどニューラルネットワークを学んでおり、ニューロンのコンストラクターが染色体になる配列内のセクションへのポインターを受け取るようにしたいと考えています。このようなもの:

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# で安全でないコードを扱ったことはありません。

4

3 に答える 3

1

Eric Lippertには、リファレンスとポインター、パート1「マネージドポインター」の実装(リファレンスとポインター、パート2)の2部構成の優れたシリーズがあります。

これは、複雑なポインター操作コードをCからC#に変換するときに作成した便利なタイプです。これにより、配列の内部への安全な「管理されたポインタ」を作成できます。アンマネージポインターで実行できるすべての操作を取得します。配列へのオフセットとして逆参照し、加算と減算を実行し、2つのポインターを比較して等しいか等しくないかを比較し、nullポインターを表すことができます。ただし、対応する安全でないコードとは異なり、このコードはガベージコレクターを混乱させることはなく、異なる配列の内部にある2つのポインターを比較するなど、愚かなことをした場合にアサートします。(*) 楽しみ!

それが役に立てば幸い。

于 2011-04-27T16:32:59.480 に答える
1

ArraySegment<int>あなたがやろうとしていることのために使用できるように聞こえます。

ArraySegment は、配列内の要素の範囲を区切る配列のラッパーです。複数の ArraySegment インスタンスが同じ元の配列を参照でき、重複する可能性があります。

Array プロパティは、配列のコピーではなく、元の配列全体を返します。したがって、Array プロパティによって返される配列に加えられた変更は、元の配列に加えられます。

于 2011-04-27T14:41:29.863 に答える
0

はい、これは C# では完全に可能ですが、このように使用するにはポインターだけでは十分な情報ではありません。Int32 の長さパラメーターも必要になるため、オーバーランなしでそのポインターを安全にインクリメントできる回数がわかります。これは、C++ のバックグラウンドを持っている場合はおなじみのはずです。

于 2011-04-27T15:25:19.087 に答える