2012-01-07 26 views
6

tôi muốn làm được điều gì đó như thế này trong Objective-CTrả về một mảng 2D C từ một chức năng Objective-C

+(int[10][10])returnArray 
{ 
    int array[10][10]; 
    return array; 
} 

Tuy nhiên, điều này mang lại một "mảng initializer phải là một danh sách initializer" biên dịch lỗi. Đây có phải là ở tất cả có thể?

Trả lời

8

Bạn không thể trả về một mảng (của bất kỳ thứ nguyên nào) trong C hoặc trong Mục tiêu-C. Vì mảng không phải là giá trị, bạn sẽ không thể gán giá trị trả về cho một biến, do đó không có ý nghĩa cho một điều như vậy xảy ra. Bạn có thể làm việc xung quanh nó, tuy nhiên. Bạn sẽ cần phải trả lại một con trỏ, hoặc kéo một thủ thuật như đặt mảng của bạn trong một cấu trúc:

// return a pointer 
+(int (*)[10][10])returnArray 
{ 
    int (*array)[10][10] = malloc(10 * 10 * sizeof(int)); 
    return array; 
} 

// return a structure 
struct array { 
    int array[10][10]; 
}; 

+(struct array)returnArray 
{ 
    struct array array; 
    return array; 
} 
+0

Nhìn vào mã đó, có vẻ như tôi sử dụng 'mảng' trong nhiều không gian tên khác nhau. Tôi sẽ làm sạch nó nếu bạn nghĩ rằng nó gây nhầm lẫn. –

+0

Khi sử dụng phương pháp struct, làm cách nào để truy cập cấu trúc dưới dạng mảng 2d? Ví dụ khi tôi 'int i = array [0] [1]' tôi nhận được "giá trị chỉ số không phải là mảng, con trỏ hoặc vectơ" – RSH1

+0

Bạn cần truy cập thành viên cấu trúc. 'int i = array.array [0] [1]' nên làm điều đó cho bạn. –

1

Một cách khác bạn có thể làm điều đó với C Mục tiêu ++, là để khai báo mảng như sau:

@interface Hills : NSObject 
{ 


@public 
    CGPoint hillVertices[kMaxHillVertices]; 
} 

Điều này có nghĩa là mảng được sở hữu bởi cá thể lớp Hills - nghĩa là nó sẽ biến mất khi lớp đó thực hiện. Sau đó bạn có thể truy cập từ các lớp khác như sau:

_hills->hillVertices 

Tôi thích các kỹ thuật Carl Norum mô tả, nhưng muốn trình bày này là một lựa chọn mà có thể có ích trong một số trường hợp - ví dụ để truyền dữ liệu vào OpenGL từ lớp người xây dựng.

Các vấn đề liên quan