2012-01-16 4 views
18

Есть ли способ объявить переменную, как это, прежде чем ее инициализировать?Возможно инициализировать массив после объявления в 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 
    }; 
+2

Нет, нет. –

+1

@PaulTomblin: Не так, как предлагал ОП, но можно назначить массивы несколькими способами. – dreamlax

ответ

22

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

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

оператор (){ } называется соединение буквального оператора. Это функция C99.

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

+0

Удивительный, спасибо! Это то, что мне нужно! – RyJ

+0

Это позволяет избежать ошибки, но она не заполняет массив. Я пытаюсь использовать эту идею в Quartz для установки значений по умолчанию двух массивов CGFloat для хранения значений цвета и не работает; Я инициализирую указатель static CGFloat * color, затем я пробую этот подход и делаю color = (CGFloat [4]) {1.0, 0.0, 0.0, 1.0}; а затем вызовите CGContextSetFill (контекст, цвет), который он не рисует. Если я просто делаю статический цвет [4]; затем цвет [0] = 1,0; цвет [3] = 1,0 и повторить вызов заполнения, он работает как ожидалось. Что я делаю не так? Благодарю. – Miek

4

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

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. 
0

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

Смежные вопросы