2016-01-24 4 views
5

私はC++で何かをする方法があるかどうかを調べようとしていますが、これはC++でかなり簡単です。具体的には、データの配列がある場合、そのデータへのポインタを作成して、より便利にサブセクションにアクセスできます。配列のサブセットにアクセスする方法は?

unsigned char buffer[1000]; 

をし、私は多くのことを操作する必要があることをその配列内の位置110から102までの文字列があることを決定し、私はこれを行うことができます:私が持っている場合たとえば

unsigned char *strPtr = &buffer[102]; 
char firstChar = strPtr[0]; 

これにより、後の操作で各アレイインデックスに "102"を追加する必要がなくなります。

このようなことをするときに危険な状況が発生する可能性があることは認識していますが、C#で既存の配列のサブセットに新しい参照を作成できる道徳的なものがあるかどうか疑問です。実際には動作しないか、私はこれを掲示することはないだろうが、私はそれが私は全体の達成するために何をしたいのアイデアを取得すると思います例

byte [8] newArray = &buffer[102]; 

:よう

何か。

+0

元の配列を直接コピーしたり修正したりしたいですか? – BalinKingOfMoria

+0

私は実際にそれに書き戻しているわけではなく、ただそれから読むだけです。私はデータをコピーしないようにしたいと思います。実際、データをコピーするのがトリッピングポイントではないかどうかは私には問いません。 –

+0

あなたの懸念がデータから読み取るだけであれば、なぜ 'int offset = 102;バッファ[offset + i] ... '?これは、あなたがタスクを達成するために安全でないコードを必要としないことを意味します。 'ArraySegment 'は、これを行うためのよりクリーンなアプローチです。何らかの理由でオフセット計算を避けようとしているのであれば、安全でないコードを使用する必要があります。 –

答えて

4

配列のセグメントにアクセスするためのラッパーとして使用できるArraySegment<T>クラスがあります。配列、オフセット、セグメントの長さを指定するだけで、実際の配列のように使用することができます。あなたは、境界をチェックし、配列を使用することの他の細部を得るでしょう。

var buffer = new byte[1000]; 
var newArray = new ArraySegment<byte>(buffer, 102, 8) as IList<byte> // we have an "array" of byte[8] 
var firstChar = newArray[0]; 

proposalは、配列のスライスを導入することがあります。 ArraySegmentと同様に、スライスを使用すると、コピーを作成せずに配列にビューを作成することができ、実際の配列の代わりに使用できます。うまくいけば、それは(近い)将来のC#版になるだろう。

+0

オフセットを使用して元のエラーの意図した要素を取得または変更して、OPが避けようとしていることをArraySegment は行っていませんか?私はあなたのインデックス+内部の '_offset'を追加し、結果の要素を返すことによって構造がうまくいくと考えました。 –

+0

@JasonWしかし、OPに記載されている手法はまさにそれであり、配列に「オフセット」を追加するためのショートカットです。 – Kroltan

+0

彼は要素にアクセスするたびにオフセットを追加するのを避けようとしているようです。私は_offsetが構造体に格納されていることを知っていますが、私は要素がアクセスされるたびに_offsetが使用されているかどうかはわかりませんでした(これは私が彼が何らかの理由で防止しようとしていると思う) –

関連する問題