web-dev-qa-db-ja.com

配列のサブセットをCで別の配列/配列スライスにコピーする

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

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

=を生成します

 1     1     1     1

Cでこれを実現するにはどうすればよいですか?

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

サブセット配列=&bigArray [someIndex]

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

どうもありがとう

12
fgar

Cにはそのような組み込みメカニズムがないことを指摘してくださった皆さんに感謝します。

@Afonso塚本が提案したものを使ってみましたが、多次元配列のソリューションが必要だと気づきました。だから私は自分の関数を書いてしまいました。他の誰かが同様の答えを探している場合に備えて、ここに配置します。

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を初めて使用するので、間違っている場合や、このコードを改善できる場合は修正してください...もう一度感謝します:)

5
fgar

Std 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];

お役に立てれば。

9

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

2
maple