2009-10-27 7 views
11

Après-midi tous,C#: Utilisation d'un générique pour créer un tableau de pointeurs

un petit coup de pouce s'il vous plaît. Afin de contourner la limite d'objet 2Gb dans .NET, j'ai créé une classe qui alloue de la mémoire sur le tas et cela me permet de créer des tableaux jusqu'à la limite de ma RAM libre. Cependant, pour faciliter le développement (comme c'était une preuve de concept), il a été codé dur pour les longs. Maintenant que cela fonctionne, j'ai essayé de modifier le code pour utiliser des génériques afin que je puisse utiliser le même code pour plusieurs types. Dans l'allocation de la mémoire et l'indexation correcte du tableau, j'ai besoin d'un tableau de pointeurs du même type que le tableau tiendra, c'est-à-dire qu'un tableau long a besoin de long*[] myLargeArray. Le problème est quand j'utilise génériques cette déclaration devient T*[] myLargeArray, qui produit toujours l'erreur « Impossible de prendre l'adresse, obtenir la taille, ou déclarer un pointeur vers un type managé (» T «) »

Merci d'avance. Post-scriptum Avant tout le monde demande, oui, j'ai vraiment besoin de tels grands tableaux.

exemple de code pour un tableau 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]; 
      ... 
     } 
    } 

Répondre

0

De MSDN

Même lorsqu'il est utilisé avec le mot-clé dangereux, en prenant l'adresse d'un objet géré , obtenir la taille d'un objet géré, ou la déclaration d'un pointeur à un type managé n'est pas autorisée. Pour plus d'informations, voir Unsafe Code and Pointers (C# Programming Guide).

Aussi je ne sais pas si vous êtes, mais assurez-vous que vous utilisez fixed keyword dans votre code.

11

Selon le C# programming guide:

Tous les types suivants peuvent être un type de pointeur :

  • sbyte, byte, short, ushort, int, uint, long, ulong, char , flottant, double, décimal ou booléen
  • N'importe quel type enum.
  • N'importe quel type de pointeur.
  • Tout type de structure défini par l'utilisateur qui contient des zones de types non gérés uniquement.

Lorsque vous placez la contrainte struct sur votre type générique, le compilateur n'a pas suffisamment d'informations pour conclure que toutes les exigences ci-dessus seront atteints (plus précisément le dernier point). Puisque nous n'avons pas de modèles en C#, vous pouvez envisager de créer des surcharges de votre adaptateur tableau/pointeur pour les types numériques qui ont du sens, ou une classe de fabrique qui crée un LargeArray en fonction de la taille d'un certain type .

+0

Je pense que le modèle d'usine est certainement la voie à suivre ici. –

Questions connexes