Подтвердить что ты не робот

Возможно инициализировать массив после объявления в 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
    };
4b9b3361

Ответ 1

Вы не можете назначить массивы, так что в основном вы не можете делать то, что вы предлагаете, но на C99 вы можете сделать это:

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

Оператор ( ){ } называется сложным литералом. Это функция C99.

Обратите внимание, что в этом примере components объявлен как указатель, а не как массив.

Ответ 2

Если вы завершаете свой массив в структуре, он становится назначаемым.

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 structs из методов, что означает, что вы можете создавать функции для инициализации и назначения структуры, например:

Components comps = SomeFunction(inputData);

DoSomethingWithComponents(comps);

comps = GetSomeOtherComps(moreInput);

// etc.

Ответ 3

Эта нотация для массивов и структур действительна только при инициализации, поэтому нет.