2

それが可能かどうかはよくわかりませんが、ジャグ配列に複数のタイプを含めることができます

最初の2Dレイヤーがbytesタイプのデータ構造レイヤーが必要です。次の2Dレイヤーは整数型またはfloatタイプになり、最後に2Dレイヤーは再びbyteになり、レイヤーの総数は変わる可能性があります。

はいの場合、それは可能ですか?C#でどのように宣言し、C ++でどのように宣言しますか?

4

5 に答える 5

3

C#についてはわかりませんが、C ++ではこれを行うことはできません(少なくとも、同時に有用で、意味があり、明確に定義されている方法ではできません)。

最初の回避策として、配列の構造体を提案します:1

struct Stuff {
    byte *bytes;
    int  *ints;
    byte *bytesAgain;
};

これは、レイヤーの数を変えたいというあなたの願望には対応していません。それがどのように機能するかは明らかではありません。各レイヤーに何が含まれているのかをどうやって知ることができますか?

[おそらく、あなたが解決しようとしている問題を説明するためにあなたの質問を編集するならば、私はより焦点を絞った答えを与えることができます。]


1.これはCではなくC++であるため、std::vector生のCスタイルの配列やポインターではなくのようなコンテナーの使用を検討してください。

于 2012-07-16T20:15:18.683 に答える
2

C#でのアプローチは、次のいずれかになります。

// Base class for each layer
abstract class Layer
{
    public abstract int Rank { get; }
    public abstract int GetLength(int dimension);
}

// Individual layers would inherit from the base class and handle
// the actual input/output
class ByteLayer : Layer
{
    private byte[,] bytes;

    public override int Rank { get { return 2; } }

    public override int GetLength(int dimension)
    {
        return this.bytes.GetLength(dimension);
    }

    public ByteLayer(byte[,] bytes)
    {
        this.bytes = bytes;
    }

    // You would then expose this.bytes as you choose
}
// Also make IntLayer and FloatLayer

次に、これらの各レイヤータイプを保持するための抽象化を作成できます。

class Layers : IEnumerable<Layer>
{
    private ByteLayer top, bottom;
    private List<Layer> layers = new List<Layer>();

    public ByteLayer Top { get { return top; } }
    public IEnumerable<Layer> Middle { get { return this.layers.AsEnumerable(); } }
    public ByteLayer Bottom { get { return bottom; } }

    public Layers(byte[,] top, byte[,] bottom)
    {
        this.top = top;
        this.bottom = bottom;
    }

    public void Add(int[,] layer)
    {
        this.layers.Add(new IntLayer(layer));
    }

    public void Add(float[,] layer)
    {
        this.layers.Add(new FloatLayer(layer));
    }

    public IEnumerator<Layer> GetEnumerator()
    {
        yield return bottom;
        foreach (var layer in this.layers) yield return layer;
        yield return top;
    }
}
于 2012-07-16T20:29:44.113 に答える
1

確かにその可能性。いくつかのオブジェクトといくつかの抽象化を使用するだけです。

ジャグ配列をオブジェクトタイプにしましたか。オブジェクトは、getType()とgetValue()を持つことができます。GetType()はいくつかの列挙型を返し、getValue()は実際のオブジェクトを返します。

これは直感的ではなく、簡単に保守できないと思います。データを保存するためのより良い方法はありますか?各「レイヤー」を個別の配列/オブジェクトとして使用するのはどうですか?

于 2012-07-16T20:19:10.117 に答える
1

データ構造をレイヤーに分割しましたが、コードでも分割してみませんか?最初と最後のレイヤーに2つの2Dバイト配列を使用し、その間のレイヤーのセットに3D配列を使用しますか?

中間層のデータ型については、どの型がどの要素に格納されているかを覚えておくと、共用体を使用できます。そうでない場合は、構造体またはクラスを使用できます。

また、すべてをクラスでラップすることもできます。

これは疑わしい特定の質問ですが。型の寄せ集めを含む単一のジャグ配列を格納する必要があることはすでに決定しています。なんで?

于 2012-07-16T20:22:53.470 に答える
1

Layerオブジェクトのベクトルが機能します。Layerオブジェクトには、2D配列へのポインターと、2D配列のタイプを示す「ヒント」値があります。新しいレイヤーを追加するときは、ベクターにレイヤーをプッシュします。レイヤーは、構築時にどのタイプであるかが通知されます。

于 2012-07-16T20:26:42.267 に答える