2011-02-10 48 views
6

Tôi có một mã mà trông giống như (nhiều hơn hoặc ít hơn):Không thể chuyển đổi từ đôi [] [] để tăng gấp đôi [*, *]

public void INeedHolidaysNow(double[,]){ 
    //... Code to take a break from coding and fly to Hawaii 
} 

double[][] WageLossPerVacationDay = new double[10][5]; 

INeedHolidays(WageLossPerVacationDay); // >>throws the Exception in the Title 

Tôi tìm thấy giải pháp trên this post trong đó bao gồm trong vòng lặp thay Thant thử một diễn viên man rợ

Vì vậy, câu hỏi của tôi là: TẠI SAO? những gì xảy ra đằng sau hậu trường trong việc cấp phát bộ nhớ để ngăn chặn những gì có vẻ - ít nhất là ở cái nhìn đầu tiên, là một diễn viên khả thi? Ý tôi là về mặt cấu trúc, cả hai biểu hiện có vẻ khá giống nhau. Tôi đang thiếu cái gì ở đây?

EDIT: Tôi phải sử dụng "double [] []" vì thư viện bên ngoài cung cấp.

Trả lời

10

Một là mảng bị lởm chởm, phần còn lại là một khối lớn.

double[][] là mảng có chứa mảng gấp đôi. Hình thức của nó không nhất thiết là hình chữ nhật. Theo thuật ngữ c, số này tương tự như double**

double[,] chỉ là một khối bộ nhớ lớn và luôn là hình chữ nhật. Trong thuật ngữ c nó chỉ là một đôi * nơi bạn sử dụng myArray[x+y*width] để truy cập một phần tử.

+0

CodeInChaos đột quỵ Một lần nữa ;-) Luôn chính xác và liên quan đến câu hỏi bộ nhớ. Thanx –

2

Rất đơn giản, [,] mảng (mảng 2D) và [][] mảng (mảng răng cưa) không giống nhau.

Mảng [,] có thể được biểu thị bằng hình chữ nhật (do đó nó còn được gọi là mảng hình chữ nhật), trong khi mảng [][] là mảng 1D có chứa mảng 1D khác.

Sẽ không có ý nghĩa gì khi có thể truyền cho người khác.

0

Bạn nên xác định mảng đôi bạn như thế này:

double[,] WageLossPerVacationDay = new double[3, 5]; 

Sau đó, nó sẽ làm việc!

hth

+0

Thanx. Đó không phải là quan điểm của tôi vì mã chỉ là một ví dụ mà tôi phải sử dụng một mảng các mảng thực sự –

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