2012-01-16 9 views
18

¿Hay alguna forma de declarar una variable como esta antes de inicializarla realmente?¿Es posible inicializar una matriz después de la declaración en C?

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

me gustaría que declara algo como esto (excepto esto no funciona):

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

No, no lo hay. –

+1

@PaulTomblin: No como lo ha sugerido el OP, pero es posible asignar matrices de varias formas diferentes. – dreamlax

Respuesta

22

No se puede asignar a las matrices, así que básicamente no se puede hacer lo que se propone, pero en C99 Puede hacer esto:

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

el operador (){ } se llama el compuesto literal operador. Es una característica C99.

Tenga en cuenta que en este ejemplo components se declara como un puntero y no como una matriz.

+0

¡Increíble, gracias! ¡Esto era lo que necesitaba! – RyJ

+0

Esto evita el error, pero no llena la matriz. Estoy intentando usar esta idea en Quartz para establecer los valores predeterminados de dos matrices CGFloat para que contengan valores de color y no funciona .; Inicializo el puntero color CGFloat * estático, luego pruebo este enfoque y hago color = (CGFloat [4]) {1.0, 0.0, 0.0, 1.0}; y luego llama a CGContextSetFill (contexto, color) que no dibuja. Si simplemente hago un color estático [4]; luego color [0] = 1.0; color [3] = 1.0 y repita la llamada de relleno, funciona como se esperaba. ¿Qué estoy haciendo mal? Gracias. – Miek

4

Si completa su matriz en una estructura, se puede asignar.

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; 

Si utiliza este método, también puede volver Components estructuras de métodos, lo que significa que puede crear funciones para inicializar y asignar a la estructura, por ejemplo:

Components comps = SomeFunction(inputData); 

DoSomethingWithComponents(comps); 

comps = GetSomeOtherComps(moreInput); 

// etc. 
0

que la notación de matrices y las estructuras son válidas solo en inicializaciones, entonces no.

Cuestiones relacionadas