2010-02-22 50 views
7

Giá trị float có thể được sử dụng làm chỉ mục của mảng không? Điều gì sẽ xảy ra nếu một biểu thức được sử dụng làm chỉ mục dẫn đến giá trị float?Giá trị nổi dưới dạng chỉ mục trong một mảng trong C++

+2

Âm thanh như bài tập về nhà? –

+0

Một ý tưởng rất tồi vì lỗi làm tròn. Tuy nhiên, đôi khi điều này là hữu ích, nhưng sau đó giá trị phải được chuyển đổi thành số nguyên đầu tiên và giới hạn kiểm tra (hoặc giới hạn) được thực hiện trước khi truy cập. Hoạt động này có thể hữu ích, ví dụ: cho các giá trị xấp xỉ cho một hàm dấu phẩy động bằng cách sử dụng bảng tra cứu. – Tronic

Trả lời

10

Giá trị float sẽ được đúc để int (nó có thể đưa ra cảnh báo hoặc lỗi tùy thuộc vào mức độ cảnh báo trình biên dịch của)

s1 = q[12.2]; // same as q[12] 
s2 = q[12.999999]; // same as q[12] 
s3 = q[12.1/6.2]; // same as q[1] 
9

Yes. Nhưng nó là vô nghĩa. Giá trị float sẽ được cắt ngắn thành một số nguyên.

(Bạn có thể sử dụng std::map<float, T>, tuy nhiên, nhưng hầu hết thời gian bạn sẽ bỏ lỡ các giá trị dự kiến ​​vì sự thiếu chính xác.)

+1

+1 cho 'std :: map' –

+1

Đối với sự thiếu chính xác, tôi nghĩ rằng cần có một số cách để cung cấp chức năng so sánh của riêng bạn, nơi bạn có thể bao gồm một 'epsilon' ... một sự khoan dung của các loại. –

+0

@Agnel Kurian std :: bản đồ tất nhiên cho phép bạn chính xác điều này –

1

Nó sẽ được đúc để int.

2

Mảng C++ là một chuỗi các vị trí bộ nhớ liền nhau. a[x] có nghĩa là "vị trí bộ nhớ xth sau khi được trỏ đến bởi a".

Điều gì có nghĩa là truy cập đối tượng 12.4 trong một chuỗi?

+0

Lưu ý đối với người đi bộ: có, tôi biết chênh lệch mảng không phải là sự bổ sung đơn giản của số nguyên cho con trỏ: câu này giả định rằng "vị trí bộ nhớ" là kích thước của thành viên mảng, vì vậy đối với int a [], [5] có nghĩa là từ thứ năm, không phải là byte thứ năm. – Crashworks

0

Đây là lỗi. Trong [expr.sub]:

Biểu thức sau biểu thức được theo sau bởi biểu thức trong dấu ngoặc vuông là biểu thức sau. Một trong các biểu thức sẽ có kiểu “con trỏ đến T” và cái còn lại sẽ có kiểu liệt kê hoặc kiểu không tách rời.

Tôi không biết điều khoản trong tiêu chuẩn chỉ định chuyển đổi đó sẽ xảy ra ở đây (thừa nhận, tôi sẽ không ngạc nhiên nếu điều khoản đó tồn tại), mặc dù thử nghiệm với ideone.com đã tạo ra lỗi biên dịch.

Tuy nhiên, nếu bạn đang chỉ định một lớp thay vì con trỏ — ví dụ: std::vector hoặc std::array — sau đó quá tải của operator[] sẽ có ngữ nghĩa thông thường của cuộc gọi hàm và đối số dấu chấm động sẽ được chuyển đổi thành size_type tương ứng.

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