14

Cには、組み込みの配列スライスメカニズムはありますか?

たとえば、Matlab のように、A(1:4)

=を生成します

 1     1     1     1

Cでこれをどのように達成できますか?

私は探してみましたが、私が見つけることができる最も近いものはこれです: http://cboard.cprogramming.com/c-programming/95772-how-do-array-subsets.html

subsetArray = &bigArray[someIndex]

しかし、これはスライスされた配列を正確に返すのではなく、スライスされた配列の最初の要素へのポインターを返します...

どうもありがとう

4

3 に答える 3

10

標準Cでそれを行うことはできません。あなたはそれを自分でしなければなりません。文字列がある場合は、それを処理する string.h ライブラリを使用できますが、整数の場合、私が知っているライブラリはありません。それに加えて、あなたが持っているものを手に入れた後、あなたがサブセットを開始したいポイントは、実際には簡単に実装できます.

「メイン」配列のサイズを知っていて、それが整数配列であると仮定すると、次のことができます。

subset = malloc((arraySize-i)*sizeof(int)); //Where i is the place you want to start your subset. 

for(j=i;j<arraySize;j++)
   subset[j] = originalArray[j];

お役に立てれば。

于 2013-01-31T04:20:32.367 に答える
6

Cにはそのような組み込みメカニズムがないことを指摘してくれてありがとう。

@Afonso Tsukamoto が提案したものを使用してみましたが、多次元配列のソリューションが必要であることに気付きました。それで、私は自分の関数を書くことになりました。他の誰かが同様の答えを探している場合に備えて、ここに入れます。

void GetSlicedMultiArray4Col(int A[][4], int mrow, int mcol, int B[1][4], int sliced_mrow)
{
    int row, col;
    sliced_mrow = sliced_mrow - 1; //cause in C, index starts from 0
    for(row=0; row < mrow; row++)
    {
        for (col=0; col < mcol; col++)
        {
            if (row==sliced_mrow) B[0][col]=A[row][col];
        }
    }
}

したがって、A は入力 (元の配列) で、B は出力 (スライスされた配列) です。この関数を次のように呼び出します。

GetSlicedMultiArray4Col(A, A_rows, A_cols, B, target_row);

例えば:

int A[][4] = {{1,2,3,4},{1,1,1,1},{3,3,3,3}};
int A_rows = 3; 
int A_cols = 4; 
int B[1][4]; //my subset
int target_row = 1;

GetSlicedMultiArray4Col(A, A_rows, A_cols, B, target_row);

これにより、Matlab では A(target_row,1:4) の結果と等しい結果 (多次元配列 B[1][4]) が生成されます。

私はCを初めて使用するので、間違っている場合、またはこのコードを改善できる場合は修正してください...ありがとうございます:)

于 2013-01-31T18:54:15.407 に答える
2

Cでは、私が知る限り、配列名はconstポインターと見なされます。したがって、サブセットのサイズはわかりません。また、新しい住所にアラリーを割り当てることもできます。したがって、代わりにポインタを使用するだけです。ただし、サブセットのサイズは自分で管理する必要があります。

于 2013-01-31T04:22:19.213 に答える