2010-06-15 44 views
5

Tôi có một hàm đơn giản Bar sử dụng một tập hợp các giá trị từ một tập dữ liệu được truyền theo dạng một mảng của cấu trúc dữ liệu. Dữ liệu có thể đến từ hai nguồn: một mảng được khởi tạo không đổi của các giá trị mặc định hoặc bộ nhớ cache được cập nhật động.Làm thế nào tôi có thể vượt qua một mảng const hoặc một mảng biến cho một hàm trong C?

Chức năng gọi xác định dữ liệu nào được sử dụng và phải được chuyển đến Bar. Bar không cần chỉnh sửa bất kỳ dữ liệu nào và trên thực tế không bao giờ nên làm như vậy. Làm cách nào để khai báo tham số dữ liệu của Bar để tôi có thể cung cấp dữ liệu từ một trong hai bộ?

union Foo 
{ 
long _long; 
int _int; 
} 

static const Foo DEFAULTS[8] = {1,10,100,1000,10000,100000,1000000,10000000}; 
static Foo Cache[8] = {0}; 

void Bar(Foo* dataSet, int len);//example function prototype 

Lưu ý, đây là C, KHÔNG C++ nếu điều đó tạo sự khác biệt;

Chỉnh sửa
Ồ, một điều nữa. Khi tôi sử dụng mẫu thử nghiệm mẫu, tôi nhận được cảnh báo loại không phù hợp về loại vòng loại, (vì tôi đang chuyển một tham chiếu có thể thay đổi đến một mảng const?). Tôi phải thay đổi điều gì?

+0

+1, chỉ vì tôi rất vui vì vẫn còn một số người không gắn thẻ câu hỏi của họ 'C/C++' và tạo sự khác biệt giữa hai câu hỏi: D – ereOn

Trả lời

8

Bạn muốn:

void Bar(const Foo *dataSet, int len); 

Tham số khai const Foo *x có nghĩa là:

x là một con trỏ đến một Foo mà tôi hứa hẹn không thay đổi.

Bạn sẽ có thể chuyển con trỏ không const vào Bar với nguyên mẫu này.

+0

Tôi nghĩ rằng tuyên bố một con trỏ "không thể thay đổi", không phải là con trỏ đến "Foo không thể thay đổi". – CodeFusionMobile

+5

Không - 'const Foo * x' có nghĩa là:' * x' là 'const Foo'. Để khai báo tham số dưới dạng một con trỏ không thể thay đổi (ít hữu ích hơn), bạn phải viết 'Foo * const x' :) – psmears

+0

Cảm ơn bạn đã làm rõ. Như bạn có thể thấy, tôi viết 'Foo *' không phải '* x', bởi vì tôi nghĩ x là một' Foo * ', không phải' * x' như một con trỏ tới một 'Foo'. Nó làm cho việc theo dõi các biến dễ dàng hơn nhưng làm cho những thứ như con trỏ tới 'const' khá khó hiểu. – CodeFusionMobile

0

Như bạn đã làm - chức năng phải mất một con trỏ đến dữ liệu (const nếu nó không cần phải thay đổi nó)

Sau đó một trong hai vượt qua con trỏ nếu bạn phân bổ dữ liệu với malloc, hoặc các yếu tố đầu tiên nếu đây là một mảng tĩnh.

+0

Tôi nhận được cảnh báo loại không khớp khi tôi thực hiện điều đó bởi vì tôi đang chuyển một tham chiếu có thể thay đổi đến một mảng const. Làm thế nào để tôi có được arround đó? – CodeFusionMobile

+0

@CSharperWithJava: bạn nhận được lỗi đó vì bạn hiện đang thiếu 'const' trong khai báo' Bar' ... – psmears

+0

Khi những người khác trả lời - bạn cần phải tạo con trỏ arg const nếu bạn đang truyền một giá trị không đổi (trừ khi bạn có một trình biên dịch đặc biệt tha thứ!) –

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