2012-01-16 10 views
18

Gerçekten başlatmadan önce böyle bir değişken bildirmenin bir yolu var mı?C'deki bildiriden sonra bir dizi başlatabilir miyim?

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

Ben (bu çalışmazsa hariç) Böyle bir şey ilan istiyorum:

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

Hayır, yok. –

+1

@PaulTomblin: OP'nin önerdiği gibi değil, ancak dizilere birkaç farklı şekilde atamak mümkündür. – dreamlax

cevap

22

Sen sen teklifim yapamaz ama C99 yapabilirsiniz nedenle temelde diziler atayamayacağı bunu yapmak:

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

(){ } operatör bileşik değişmezi operatörü olarak adlandırılır. Bu bir C99 özelliğidir.

Bu örnekte, components dizisi olarak değil, bir işaretçi olarak bildirildiğini unutmayın.

+0

Harika, teşekkürler! İhtiyacım olan buydu! – RyJ

+0

Bu, hatayı tamamen önler ancak Diziyi doldurmaz. Bu düşünceyi iki CGFloat dizisinin renk değerlerini tutmak için varsayılan değerlerini ayarlamak için Quartz'de kullanmaya çalışıyorum ve işe yaramıyor. İşaretçi statik CGFloat * rengini başlatıyorum, sonra bu yaklaşımı deneyin ve renk = (CGFloat [4]) {1.0, 0.0, 0.0, 1.0}; ve sonra çizmez CGContextSetFill (bağlam, renk) arayın. Sadece statik renk yaparsam [4]; daha sonra renk [0] = 1.0; renk [3] = 1,0 ve doldurma çağrısını tekrarlayın, beklendiği gibi çalışır. Neyi yanlış yapıyorum? Teşekkürler. – Miek

4

Dizinizi bir yapıda düzenlerseniz, atanabilir duruma gelir. Bu yaklaşımı kullanırsanız

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; 

, ayrıca örneğin, initialize ve yapı atamak işlevler oluşturmak anlamına gelir yöntemlerinden Components yapılar dönebilirsiniz:

Components comps = SomeFunction(inputData); 

DoSomethingWithComponents(comps); 

comps = GetSomeOtherComps(moreInput); 

// etc. 
0

Bu diziler için gösterim ve yapılar yalnızca başlatmalarda geçerlidir, yani hayır.

İlgili konular