2009-10-27 18 views
11

Pomeriggio tutto,C#: utilizzo di un generico per creare un vettore di puntatori

un piccolo aiuto se si desidera. Per aggirare il limite di oggetti 2Gb in .NET ho creato una classe che alloca memoria sull'heap e questo mi permette di creare array fino al limite della mia RAM libera. Tuttavia, per facilità di sviluppo (come era una dimostrazione di concetto) era difficile da codificare per i lunghi. Ora che funziona ho cercato di alterare il codice per utilizzare i generici in modo da poter utilizzare lo stesso codice per più tipi.

Nell'allocazione della memoria e dell'indice corretto dell'array ho bisogno di un array di puntatori dello stesso tipo che la matrice manterrà, vale a dire un array lungo ha bisogno di long*[] myLargeArray. Il problema è che quando uso farmaci generici questa dichiarazione diventa T*[] myLargeArray, che produce sempre l'errore 'Non può prendere l'indirizzo, ottenere la dimensione di, o dichiarare un puntatore a un tipo gestito (' T ')'

Grazie in anticipo.

PS Prima che qualcuno chieda, sì, ho davvero bisogno di array così grandi.

codice di esempio per una matrice 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]; 
      ... 
     } 
    } 

risposta

0

Da MSDN

Anche quando utilizzato con il parola chiave non sicuro, prendendo l'indirizzo di un oggetto gestito, ottenendo la dimensione di un oggetto gestito, o la dichiarazione di un puntatore a un tipo gestito non è consentita. Per ulteriori informazioni, vedere Unsafe Code and Pointers (C# Programming Guide).

Anche io non so se tu sia, ma assicurarsi che si sta utilizzando fixed keyword nel codice.

11

Secondo il C# programming guide:

qualsiasi dei seguenti tipi può essere un tipo puntatore:

  • sbyte, byte, short, ushort, int, uint, lungo, ulong, char , float, double, decimal, o bool
  • Qualsiasi tipo di enum.
  • Qualsiasi tipo di puntatore.
  • Qualsiasi tipo di struct definito dall'utente che contiene campi di tipi non gestiti .

Quando si posiziona il vincolo struct sul tipo generico, il compilatore non dispone di informazioni sufficienti per dedurre che tutti i requisiti di cui sopra saranno soddisfatte (in particolare l'ultimo punto).

Dato che non sono presenti modelli in C#, è possibile prendere in considerazione la possibilità di creare sovraccarichi dell'adattatore di array/puntatore per i tipi numerici che hanno senso oppure una classe factory che crea un LargeArray dato una dimensione di un determinato tipo .

+0

Penso che il modello di fabbrica sia decisamente il modo di andare qui. –

Problemi correlati