IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Impossible de convertir le type 'short[]' en 'System.IntPtr'


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 37
    Par défaut Impossible de convertir le type 'short[]' en 'System.IntPtr'
    Bonjour,

    je bloque actuellement sur la conversion d'un bout de code transformé du C++ au C#, j'obtient l'erreur suivante :

    Impossible de convertir le type 'short[]' en 'System.IntPtr' (avec le cas simillaire pour le byte[])
    Si quelqu'un avait une solution et, en abusant un peu, une explication sur la dite solution, je lui en serait reconnaissant.

    Merci à l'avance

    En C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    void CInterpret :: SaveState(SaveFile& file)
    {
    	//Check
    	file.WriteUInt(check_CInterpret);
     
    	file.WriteUShort(m_GamePart);
    	file.WriteUShort(m_CurrentGamePart);
     
    	m_pDisplay->SaveState(file);
     
    	file.WriteBytes((const void*)m_TabVars, sizeof(short)*es_MaxVars);
     
    	file.WriteBytes((const void*)m_OpStack, sizeof(ushort)*256);
     
    	file.WriteUShort((int)m_OpStackPoint-(int)m_OpStack);
     
    	file.WriteBytes((const void*)m_EntityFlags, sizeof(uchar)*es_MaxEntity);
    	file.WriteBytes((const void*)m_EntityFrameFlags, sizeof(uchar)*es_MaxEntity);
     
    	file.WriteBytes((const void*)m_EntityPoint, sizeof(short)*es_MaxEntity);
    	file.WriteBytes((const void*)m_EntityFrame, sizeof(short)*es_MaxEntity);
     
    	file.WriteInt(m_NbTrameToWait);
    	file.WriteInt(m_ProcessEntity);
    	file.WriteBool(m_showBuffer);
     
    	//Check
    	file.WriteUInt(check_CInterpret);
    }

    En C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public void SaveState(ref SaveFile file)
    	{
    		//Check
    		file.WriteUInt((uint)GlobalMembersAw_Interpret.check_CInterpret);
     
    		file.WriteUShort(m_GamePart);
    		file.WriteUShort(m_CurrentGamePart);
     
    		m_pDisplay.SaveState(ref file);
     
    		file.WriteBytes((System.IntPtr)m_TabVars, sizeof(short) * (int)AnonymousEnum.es_MaxVars);
     
    		file.WriteBytes((System.IntPtr)m_OpStack, sizeof(ushort) * 256);
     
    		file.WriteUShort(m_OpStackPoint - m_OpStack);
     
    		file.WriteBytes((System.IntPtr)m_EntityFlags, sizeof(byte) * (int)AnonymousEnum.es_MaxEntity);
    		file.WriteBytes((System.IntPtr)m_EntityFrameFlags, sizeof(byte) * (int)AnonymousEnum.es_MaxEntity);
     
    		file.WriteBytes((System.IntPtr)m_EntityPoint, sizeof(short) * (int)AnonymousEnum.es_MaxEntity);
    		file.WriteBytes((System.IntPtr)m_EntityFrame, sizeof(short) * (int)AnonymousEnum.es_MaxEntity);
     
    		file.WriteInt(m_NbTrameToWait);
    		file.WriteInt(m_ProcessEntity);
    		file.WriteBool(m_showBuffer);
     
    		//Check
    		file.WriteUInt(GlobalMembersAw_Interpret.check_CInterpret);
    	}

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Par défaut
    Hmm c'est le même code ...

    Dans un premier temps, j'enlèverais déjà tous les pointeurs.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 37
    Par défaut
    Au temps pour moi, mauvais C/C , je viens de corriger cela en ajoutant le code en C#

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 37
    Par défaut
    J'ai tenté une bonne partie de la journée sans succès, je maudis celui qui m'a interdit le unsafe

  5. #5
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonsoir, voici la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Epingle (pin) le tableau : cela empêche le GC de déplacer le tableau tant que ce handle existe
    var handle = GCHandle.Alloc(m_opStack);
    try
    {
       IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(m_opStack, 0);
       file.WriteBytes(ptr, sizeof(ushort) * 256);
    }
    finally
    {
       // Redonne le contrôle au GC.
       handle.Free();
    }
    Cela dit, trois remarques :
    * Par "celui qui m'a interdit d'utiliser unsafe", tu parlais bien de contraintes liées au projet ? Car C# autorise tout à fait le maniement de pointeurs.
    * Y a t-il une bonne raison qui fait que SaveFile doive recevoir un IntPtr en argument plutôt qu'un tableau ? Un BinaryWriter basé sur un FileStream n'aurait-il pas été plus indiqué ?
    * SaveFile est bien une structure ? Sinon, s'il s'agit d'une référence, aucune raison de le passer en "ref" puisque je doute que SaveState fournisse une autre référence à la place.

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Elriks Voir le message
    J'ai tenté une bonne partie de la journée sans succès, je maudis celui qui m'a interdit le unsafe
    Plutôt que maudire je ne sais qui, repartir de la description fonctionnelle du besoin à fournir et le coder en C# au lieu de tenter une conversion hasardeuse entre deux langages sémantiquement très éloignés, même si syntaxiquement proches, eut été sans doute préférable.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 37
    Par défaut
    C'était un trait d'humour mais pour reprendre plus sérieusement,

    Il est question d'un jeu et d'une conversion en C#/Mono, Je ne suis pas patron et ne décide pas de la marche a suivre, quand on te dit "converti ce Jeu non documenté pour le rendre compatible sur Unity et n'utilise pas Unsafe" tu te débrouilles avec les moyens du bord, même si cela fait 2 mois que tu étudies le C++, temps d'apprentissage qui me suffit tout juste a faire une conversion en brute et a réparer au fur et a mesure les dégâts quand la compilation sera possible.

Discussions similaires

  1. Réponses: 7
    Dernier message: 14/07/2011, 22h58
  2. [XSLT 1.0] Impossible de convertir le type d'argument/de retour dans la méthode
    Par kevin8100 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/06/2011, 23h24
  3. Impossible de convertir le type
    Par chris81 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 11/03/2008, 09h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo