2010-06-24 44 views
5

Tôi muốn triển khai hàm có OpenGL để hiển thị một hình trụ trong C++. Chữ ký của chức năng của tôi như sau:Tham chiếu đến Mảng hai chiều

#define POINTS_NUM 15 
#define DEMESION 3 

void drawCylinder(int slices, int segments, GLfloat (&vertices)[ POINTS_NUM ][ DEMESION ]); 

Tôi muốn sử dụng tham chiếu đến mảng hai chiều để giới hạn đầu vào của người dùng nhưng một số hành vi lạ đang xảy ra. Khi tôi thực hiện các chức năng tuyên bố như trên, một mối liên kết lỗi xảy ra:

Error 1 error LNK2005: "float (* vase)[3]" ([email protected]@3PAY02MA) already defined in shapes.obj vase.obj VaseAndAnimation

Đây vase được định nghĩa là:

GLfloat vase[ POINTS_NUM ][ DEMESION ]; 

Lúc đầu, tôi nghĩ rằng có điều gì đó sai trái với kích thước cuối cùng. Vì vậy, tôi bỏ qua nó trong thử nghiệm thứ hai của tôi. tuyên bố thời điểm này trong chức năng của tôi là như thế này:

void drawCylinder(int slices, int segments, GLfloat (&vertices)[ POINTS_NUM ][]); 

Bây giờ một lỗi thời gian biên dịch xảy ra khi gọi như (vase định nghĩa là không thay đổi):

drawCylinder(10, 10, vase); 

Compile error:

Error 1 error C2087: 'vertices' : missing subscript d:\visual studio 2008\projects\project1\computer graphics\vaseandanimation\shapes.h 25 VaseAndAnimation

Error 2 error C2664: 'drawCylinder' : cannot convert parameter 3 from 'GLfloat [14][3]' to 'GLfloat (&)[14][1]' d:\Visual Studio 2008\Projects\Project1\Computer Graphics\VaseAndAnimation\vase.cpp 64 VaseAndAnimation

Error 3 error C2087: 'vertices' : missing subscript d:\visual studio 2008\projects\project1\computer graphics\vaseandanimation\shapes.h 25 VaseAndAnimation

Error 4 error C2087: 'vertices' : missing subscript d:\Visual Studio 2008\Projects\Project1\Computer Graphics\VaseAndAnimation\shapes.cpp 12 VaseAndAnimation

Từ lỗi này, tôi có thể thấy thông số vertices thực sự được coi là tham chiếu đến mảng hai chiều, nhưng tại sao lại là vase được phân tích cú pháp thành float (* vase)[3] trong phiên bản đầu tiên của tôi?

IDE của tôi là Visual Studio 2008. Tôi chưa thử với GCC; là hành vi phụ thuộc vào trình biên dịch?

Hy vọng ai đó có thể cho tôi một tay để loại bỏ cái bẫy.

+0

thể trùng lặp của [Làm thế nào để vượt qua một tham chiếu đến một mảng hai chiều để một chức năng?] (Http://stackoverflow.com/questions/404232/how-do-i-pass-a- reference-to-a-two-array-array-to-a-function) –

Trả lời

2

Tuyên bố đầu tiên của bạn là tốt. Dường như bạn đã xác định vase trong một tệp tiêu đề.

+0

Vâng, bạn nói đúng. Sau khi kiểm tra cẩn thận mã của tôi, tôi thấy chiếc bình được xác định ngay trước khi khai báo hàm. Nhưng tại sao tôi không thể xác định mảng trong tập tin tiêu đề? Tôi không biết bất kỳ giới hạn nào về điều đó. Cảm ơn. –

+0

Tiêu đề của bạn được bao gồm trong một số tệp cpp. Điều này có nghĩa là 'bình 'sẽ được định nghĩa nhiều lần. Bạn có thể khai báo nó trong một tiêu đề và sau đó định nghĩa nó trong một trong các tệp cpp. –

+0

Có, tôi biết trường hợp này. Nhưng, tôi đã xác định một macro để tránh trùng lặp bao gồm. Vẫn còn vấn đề. –

1

Có vẻ như vấn đề chỉ là vase đang được xác định trong tệp tiêu đề. Bạn chỉ nên khai báo các biến số trong tệp tiêu đề.

Điều này gây ra sự cố vì nhiều định nghĩa tạo nhiều biểu tượng giống nhau, điều này gây nhầm lẫn cho trình liên kết (do đó có lỗi trình liên kết). Khi trình liên kết cố gắng so khớp các tham chiếu tới biến đó với định nghĩa thực, nó không biết cái nào để sử dụng.

Vệ sĩ tiêu đề không bảo vệ chống lại điều này. Các macro được sử dụng trong trình bảo vệ đầu trang chỉ được xác định trên mỗi đơn vị dịch. Mỗi khi trình biên dịch của bạn bắt đầu biên dịch một tệp .cpp mới (bỏ qua sự hợp nhất xây dựng, v.v.), đó là một đơn vị dịch mới và về cơ bản trình biên dịch bắt đầu từ đầu, không biết về bất kỳ ký hiệu nào đã được định nghĩa trước đó.

Để sửa lỗi này, chỉ tuyên bố biến của bạn trong các tập tin tiêu đề:

// extern specifies that the definition is elsewhere. 
extern int myGlobalVariable; 

và sau đó xác định rằng biến trong một tập tin nguồn.

int myGlobalVariable; 
Các vấn đề liên quan