2010-08-20 36 views
24

Có cách nào để thực hiện việc này dưới dạng ngưng tụ không?Chỉ định nhiều giá trị cho mảng trong C

GLfloat coordinates[8]; 
... 
coordinates[0] = 1.0f; 
coordinates[1] = 0.0f; 
coordinates[2] = 1.0f; 
coordinates[3] = 1.0f; 
coordinates[4] = 0.0f; 
coordinates[5] = 1.0f; 
coordinates[6] = 0.0f; 
coordinates[7] = 0.0f; 
return coordinates; 

Thứ gì đó như coordinates = {1.0f, ...};?

+0

Bạn đang trả về một con trỏ đến một biến địa phương, có? Một số trong những điều mọi người đã nói trong câu trả lời/bình luận dưới đây giả định rằng các biến có liên quan là tự động hóa, hoặc rằng họ không. Có thể giúp nếu bạn chỉ định. –

+0

Khi cấu trúc được khởi tạo, không có cách nào dễ dàng để gán khối lượng thành viên (trừ việc tạo bản sao của một cấu trúc khác với 'memcpy'). Tôi thường thấy mình muốn tôi có tính năng này. – bta

+0

Tôi nghĩ rằng câu trả lời ban đầu của bạn là tốt nhất - nó trực quan, mặc dù một chút tiết, nhưng đó không phải là một mối quan tâm cho các trình biên dịch hiện đại. –

Trả lời

20

Nếu bạn thực sự để gán giá trị (như trái ngược với khởi), bạn có thể làm điều đó như thế này:

GLfloat coordinates[8]; 
static const GLfloat coordinates_defaults[8] = {1.0f, 0.0f, 1.0f ....}; 
... 
memcpy(coordinates, coordinates_defaults, sizeof(coordinates_defaults)); 

return coordinates; 
+0

Đây là ý tưởng hay, có lẽ tôi sẽ làm theo cách này. – UnstableFractal

+0

Thậm chí tốt hơn, làm cho nó "const tĩnh" và trình biên dịch có thể tối ưu hóa các biến quyền ra khỏi mã. –

+0

@Zan: Tốt! –

3

Chính xác, bạn gần như đạt được nó:

GLfloat coordinates[8] = {1.0f, ..., 0.0f}; 
+0

Nếu tôi đã làm và muốn giao lại sau? – UnstableFractal

+3

@smsteel Cú pháp đó chỉ áp dụng cho các khai báo –

+0

Đây là điều xấu .. Có cách nào khác để đơn giản hóa nó không? :) – UnstableFractal

3

Bạn có thể sử dụng:

GLfloat coordinates[8] = {1.0f, ..., 0.0f}; 

nhưng đây là một khởi tạo thời gian biên dịch - bạn không thể sử dụng phương thức đó trong tiêu chuẩn hiện hành để khởi tạo lại (mặc dù tôi nghĩ có nhiều cách để làm điều đó trong tiêu chuẩn sắp tới, có thể không giúp bạn ngay lập tức).

Hai cách khác mà mùa xuân suy nghĩ là để Blat các nội dung nếu họ đang cố định:

GLfloat base_coordinates[8] = {1.0f, ..., 0.0f}; 
GLfloat coordinates[8]; 
: 
memcpy (coordinates, base_coordinates, sizeof (coordinates)); 

hoặc cung cấp một chức năng đó giống như mã khởi động của bạn anyway:

void setCoords (float *p0, float p1, ..., float p8) { 
    p0[0] = p1; p0[1] = p2; p0[2] = p3; p0[3] = p4; 
    p0[4] = p5; p0[5] = p6; p0[6] = p7; p0[7] = p8; 
} 
: 
setCoords (coordinates, 1.0f, ..., 0.0f); 

giữ trong tâm trí những dấu chấm lửng (...) là trình giữ chỗ, không phải những thứ để chèn vào mã.

4

Có một mẹo để bọc mảng vào một cấu trúc (có thể được khởi tạo sau khi khai báo).

tức là.

struct foo { 
    GLfloat arr[10]; 
}; 
... 
struct foo foo; 
foo = (struct foo) { .arr = {1.0, ... } }; 
+0

Ồ, bạn không cần điều đó, chỉ cần khởi tạo đồng bằng sẽ làm. Bỏ qua câu trả lời của tôi. – domen

+0

Bạn có thể nhấp vào "xóa" ở dưới cùng bên trái của bài đăng nếu bạn muốn.= P –

+2

Ồ, vâng ... có thể ai đó thấy hữu ích :-) – domen

6

Cách cũ-học:

GLfloat coordinates[8]; 
... 

GLfloat *p = coordinates; 
*p++ = 1.0f; *p++ = 0.0f; *p++ = 1.0f; *p++ = 1.0f; 
*p++ = 0.0f; *p++ = 1.0f; *p++ = 0.0f; *p++ = 0.0f; 

return coordinates; 
Các vấn đề liên quan