2013-10-19 27 views
6

Giả sử địa chỉ cho A[10][10] là 40000, số tăng gấp đôi mất 16 byte và địa chỉ byte được sử dụng, địa chỉ cho A[40, 50] là gì?Công thức tính toán mảng 2D

Tôi chỉ cố gắng để tính toán một điểm đơn giản trong một 2D và chỉ muốn kiểm tra xem tôi cắm vào các giá trị đúng trong phương trình

BA + [n * (i - LBR) + (j - LBC)] * w 

40000 +[10*(40-0)+(50-0)]*16 

40000+[10*(40)+(50)]*16 

40000+[900]*16 = 54400 

Tôi đã áp dụng công thức một cách chính xác ở đây tăng gấp đôi? Tôi đã không chắc chắn nếu tôi cắm vào các giá trị phải không?

+1

Bạn đang yêu cầu địa chỉ của 'A [40] [50]' trong một mảng chỉ được khai báo là 'A [10] [10]'? Nếu vậy, địa chỉ là * undefined *. Mảng đó chỉ là địa chỉ từ 'A [0..9] [0..9]'. Ngoài ra, bạn không lưu ý liệu địa chỉ cơ sở đã cho có nằm trong base-16 hay base-10 hay không, nhưng với yêu cầu phần tử không có địa chỉ, nó thực sự không thành vấn đề. – WhozCraig

+0

Bạn đã khai báo mảng của mình như thế nào? Như kích thước mảng của bạn là gì [M, N]? –

+0

là A [100] [100] tôi tin. – user1789951

Trả lời

2

Câu trả lời phụ thuộc vào việc bạn đang sử dụng thứ tự hàng chính hay thứ tự cột lớn. Trong hàng lớn đặt hàng dữ liệu được lưu trữ hàng khôn ngoan. Trong cột chính đặt hàng dữ liệu được lưu trữ cột khôn ngoan. Hãy xem xét mảng 2D sau để được lưu trữ trong bộ nhớ,

11 22 33 

    44 55 66 

    77 88 99 

Trong hàng chính đặt hàng các phần tử được lưu giữ liền kề như 11,22,33,44,55,66,77,88,99. Trong thứ tự cột lớn, các phần tử được lưu trữ liên tục 11,44,77,22,55,88,33,66,99.

+0

nó không chỉ định – user1789951

0

Ý nghĩa của phương trình sau:

BA + [n * (i - LBR) + (j - LBC)] * w 

Nếu bạn có một mảng A [n] [n] và bạn biết địa chỉ của mục A [LBR] [LBC] như BA, sau đó địa chỉ của A [i] [j] có thể được tính như sau. Giả sử n = 6,

00 01 02 03 04 05 
10 11 12 13 14 15 
20 21 22 23 24 25 
30 31 32 33 34 35 
40 41 42 43 44 45 
50 51 52 53 54 55 

Ở đây giả sử chúng ta biết địa chỉ A [2,1] = 1000. Chúng ta cần tính địa chỉ A [4,2]. Bây giờ để đạt được [4,2] từ [2,1], chúng ta phải đi bao nhiêu mục? Ofcourse như @Deepu chỉ định, chúng ta có thể làm điều đó theo hai cách, hoặc là đi hàng khôn ngoan hoặc cột khôn ngoan. Từ phương trình nó xuất hiện rằng du lịch hàng khôn ngoan đã được chọn.

22 to 25 (4) 
30 to 35 (6) 
40 to 42.(3) 

= 13 entries. 

Do đó địa chỉ của A [4,2] = 1000 + 13 * (numOfbytes cho mỗi mục)

Để xác minh với phương trình,

i - LBR = 4 - 2 = 2. 
j - LBC = 2 - 1 = 1. 

Do đó, n*(i - LBR) + (j - LBC) = 6*2 + 1 = 13.

4

Trong C++ mảng 2d chỉ là mảng mảng, do đó, trong A bộ nhớ được sử dụng cho

A[ 0][ 0] A[ 0][ 1] A[ 0][ 2] ... A[ 0][99] 
A[ 1][ 0] A[ 1][ 1] A[ 1][ 2] ... A[ 1][99] 
... 
A[99][ 0] A[99][ 1] A[99][ 2] ... A[99][99] 

trong đó mỗi hàng chỉ theo sau hàng trước đó trong bộ nhớ.

Các địa chỉ trong của một phần tử tại (row, col)

(unsigned char *)(&A[0][0]) + (row*row_size + col) * element_size 

Trong trường hợp của bạn, bạn biết rằng các yếu tố bạn đang tìm kiếm là 30 hàng thấp và 40 yếu tố ở bên phải của nguyên tố nhất định, do đó địa chỉ này sẽ được

40000 + ((40 - 10)*100 + (50 - 10)) * 16 

tổng cộng là 88640.

Bạn có thể nhận kết quả tương tự bằng cách trừ địa chỉ tương đối của phần tử (10, 10) từ địa chỉ đã cho (để tìm đầu của mảng) và sau đó thêm địa chỉ tương đối (40, 50).

+0

trong C vì vậy chúng tôi chỉ có đại diện hàng? Không có đại diện cột? – user3995169

+0

Trong C ma trận chỉ là một mảng các mảng, do đó tăng dần chỉ mục ** cuối cùng sẽ đến phần tử liên tiếp tiếp theo trong bộ nhớ. Cách tiếp cận bố cục C được gọi là "thứ tự hàng lớn", xem http://en.wikipedia.org/wiki/Row-major_order – 6502

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