2009-10-27 14 views
11

Afternoon wszystkimC#: Używanie generic stworzyć tablicę ruchy wskaźnika

trochę pomóc, jeśli chcesz. Aby ominąć limit obiektów 2Gb w .NET, stworzyłem klasę, która przydziela pamięć na stercie i to pozwala mi tworzyć tablice do limitu mojej wolnej pamięci RAM. Jednak dla ułatwienia rozwoju (ponieważ był to dowód koncepcji), kodowanie było trudne dla długich. Teraz, gdy to działa, próbowałem zmienić kod, aby użyć generycznych, więc mogę użyć tego samego kodu dla wielu typów.

Przy przydzielaniu pamięci i poprawnej indeksacji tablicy potrzebuję tablicy wskaźników tego samego typu, które będzie przechowywane w tablicy, tj. Długa tablica potrzebuje long*[] myLargeArray. Problemem jest to, kiedy używam rodzajowych ta deklaracja staje T*[] myLargeArray, który zawsze wywołuje błąd „nie może mieć adres, uzyskać rozmiaru lub zadeklarować wskaźnik do zarządzanej typu (” T „)”

Z góry dzięki.

PS Zanim ktokolwiek zapyta, tak naprawdę potrzebuję tak dużych tablic.

przykładem Kod 2D tablicy:


    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]; 
      ... 
     } 
    } 

Odpowiedz

0

Od MSDN

Nawet w przypadku korzystania z niebezpiecznych słów kluczowych, biorąc adresu zarządzanego obiektu, uzyskanie wielkości obiekt zarządzany lub deklarowanie wskaźnika dla typu zarządzanego jest niedozwolone. Dla więcej informacji, zobacz Unsafe Code and Pointers (C# Programming Guide).

Również nie wiem, jeśli jesteś, ale upewnij się, że używasz fixed keyword w kodzie.

11

Według C# programming guide:

Każda z poniższych typów może być typu wskazówka:

  • sbyte, byte, short, ushort, int, uint, długie, Ulong, char , float, podwójny, dziesiętny lub bool
  • Dowolny typ wyliczeniowy.
  • Dowolny typ wskaźnika.
  • Dowolny typ struktury zdefiniowany przez użytkownika, który zawiera pola niezarządzanych typów tylko .

Po umieszczeniu struct ograniczenie od typu rodzajowego, kompilator nie ma wystarczających informacji, aby wnioskować, że wszystkie powyższe wymagania zostaną spełnione (w szczególności ostatni punkt).

Ponieważ nie mamy szablonów w języku C#, warto rozważyć utworzenie przeciążenia adaptera tablicy/wskaźnika dla typów liczbowych, które mają sens, lub klasy fabrycznej, która tworzy LargeArray o rozmiarze określonego typu .

+0

Myślę, że wzór fabryczny to zdecydowanie najlepsza droga. –