2009-10-27 60 views
11

Chiều tất cả,C#: Sử dụng chung để tạo mảng con trỏ

một chút trợ giúp nếu bạn muốn. Để phá vỡ giới hạn đối tượng 2Gb trong .NET Tôi đã tạo một lớp phân bổ bộ nhớ trên heap và điều này cho phép tôi tạo các mảng tới giới hạn RAM miễn phí của tôi. Tuy nhiên, để dễ phát triển (vì nó là một bằng chứng về khái niệm) nó đã được mã hóa cứng trong thời gian dài. Bây giờ nó hoạt động tôi đã cố gắng để thay đổi mã để sử dụng Generics vì vậy tôi có thể sử dụng cùng một mã cho nhiều loại.

Trong việc cấp phát bộ nhớ và chỉ mục chính xác mảng, tôi cần một mảng con trỏ cùng loại mà mảng sẽ giữ, nghĩa là mảng dài cần long*[] myLargeArray. Vấn đề là khi tôi sử dụng Generics tuyên bố này trở thành T*[] myLargeArray, mà luôn luôn tạo ra các lỗi 'Không thể lấy địa chỉ của, có kích thước, hoặc khai báo một con trỏ tới một kiểu quản lý (' T ')'

Cảm ơn trước.

PS Trước khi có ai hỏi, vâng tôi thực sự cần những mảng lớn như vậy.

Mã ví dụ cho một mảng 2D:


    LargeArray <int> myArray = new LargeArray<int>(x, y); 

    public unsafe class LargeArray where T : struct 
    { 
     ... 
     private T*[] tArr; 
     ... 
     public LargeArray(long sizeI, long sizeJ) 
     { 
      ... 
      myLargeArray = new T*[sizeI]; 
      ... 
     } 
    } 

Trả lời

0

Từ MSDN

Ngay cả khi sử dụng với các từ khóa không an toàn, lấy địa chỉ của một đối tượng quản lý, nhận được kích thước của một đối tượng được quản lý hoặc khai báo con trỏ đối với loại được quản lý không được phép. Để biết thêm thông tin, xem Unsafe Code and Pointers (C# Programming Guide).

Ngoài ra tôi không biết nếu bạn đang có, nhưng chắc chắn rằng bạn đang sử dụng fixed keyword trong mã của bạn.

11

Theo C# programming guide:

Bất kỳ các loại sau đây có thể là một loại con trỏ:

  • SByte, byte, short, ushort, int, uint, dài, ulong, char , phao, kép, thập phân hoặc bool
  • Bất kỳ loại enum nào.
  • Bất kỳ loại con trỏ nào.
  • Bất kỳ loại cấu trúc do người dùng xác định nào chứa các trường không được quản lý chỉ .

Khi bạn đặt struct hạn chế về kiểu chung chung của bạn, trình biên dịch không có đủ thông tin để suy ra rằng tất cả các yêu cầu nêu trên sẽ được đáp ứng (cụ thể là điểm cuối cùng).

Vì chúng tôi không có mẫu trong C#, bạn có thể muốn xem xét việc tạo quá tải của bộ điều hợp mảng/con trỏ cho loại số có ý nghĩa hoặc lớp nhà máy tạo ra một kích thước của một loại nhất định .

+0

Tôi nghĩ rằng mô hình nhà máy chắc chắn là con đường để đi đến đây. –

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