web-dev-qa-db-ja.com

Cでの宣言の後に配列を初期化することは可能ですか?

実際に初期化する前に、このような変数を宣言する方法はありますか?

    CGFloat components[8] = {
        0.0, 0.0, 0.0, 0.0,
        0.0, 0.0, 0.0, 0.15
    };

私はそれがこのようなものを宣言したいと思います(これが機能しないことを除いて):

    CGFloat components[8];
    components[8] = {
        0.0, 0.0, 0.0, 0.0,
        0.0, 0.0, 0.0, 0.15
    };
28
RyJ

配列に割り当てることはできないため、基本的には提案したことを実行できませんが、C99ではこれを実行できます。

CGFloat *components;
components = (CGFloat [8]) {
    0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.15
};

( ){ }演算子は複合リテラル演算子と呼ばれます。 C99の機能です。

この例では、componentsは配列ではなくポインタとして宣言されていることに注意してください。

31
ouah

配列を構造体でラップすると、割り当て可能になります。

typedef struct
{
    CGFloat c[8];
} Components;


// declare and initialise in one go:
Components comps = {
    0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.15
};


// declare and then assign:
Components comps;
comps = (Components){
    0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.15
};


// To access elements:
comps.c[3] = 0.04;

このアプローチを使用する場合、メソッドからComponents構造体を返すこともできます。つまり、構造体を初期化して割り当てる構造体を作成できます。次に例を示します。

Components comps = SomeFunction(inputData);

DoSomethingWithComponents(comps);

comps = GetSomeOtherComps(moreInput);

// etc.
8
dreamlax

配列と構造体の表記は初期化でのみ有効であるため、無効です。

0
asaelr