2012-01-16 11 views
18

Có cách nào để khai báo một biến như thế này trước khi thực sự khởi tạo nó?Có thể khởi tạo một mảng sau khi khai báo trong C?

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

Tôi muốn nó tuyên bố một cái gì đó như thế này (trừ này không làm việc):

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

Không, không có. –

+1

@PaulTomblin: Không phải như OP đã gợi ý, nhưng có thể gán cho mảng theo một vài cách khác nhau. – dreamlax

Trả lời

22

Bạn không thể gán cho mảng nên về cơ bản bạn không thể làm những gì bạn đề nghị nhưng trong C99 bạn có thể làm điều này:

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

các nhà điều hành (){ } được gọi là hợp chất đen điều hành. Nó là một tính năng C99.

Lưu ý rằng trong ví dụ này, components được khai báo là một con trỏ chứ không phải là một mảng.

+0

Tuyệt vời, cảm ơn! Đây là những gì tôi cần! – RyJ

+0

Điều này tránh lỗi nhưng không điền vào mảng. Tôi đang cố gắng sử dụng ý tưởng này trong Quartz để thiết lập giá trị mặc định của hai mảng CGFloat để giữ các giá trị màu và nó không hoạt động .; Tôi khởi tạo con trỏ tĩnh CGFloat * màu, sau đó tôi thử phương pháp này và làm màu = (CGFloat [4]) {1.0, 0.0, 0.0, 1.0}; và sau đó gọi CGContextSetFill (ngữ cảnh, màu) nó không vẽ. Nếu tôi chỉ làm màu tĩnh [4]; sau đó tô màu [0] = 1.0; color [3] = 1.0 và lặp lại cuộc gọi điền, nó hoạt động như mong đợi. Tôi đang làm gì sai? Cảm ơn. – Miek

4

Nếu bạn quấn mảng của mình theo cấu trúc, nó sẽ được gán.

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; 

Nếu bạn sử dụng phương pháp này, bạn cũng có thể trở Components cấu trúc từ các phương pháp, có nghĩa là bạn có thể tạo các chức năng để khởi và gán cho các cấu trúc, ví dụ:

Components comps = SomeFunction(inputData); 

DoSomethingWithComponents(comps); 

comps = GetSomeOtherComps(moreInput); 

// etc. 
0

Đó ký hiệu cho mảng và cấu trúc chỉ hợp lệ trong khởi tạo, vì vậy không.