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 :

tableau de structures dynamiques C# vers C++


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Par défaut tableau de structures dynamiques C# vers C++
    soit la structure suivante 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
            [StructLayout(LayoutKind.Sequential)]
            public class RollInformationCSharp
            {
                [MarshalAs(UnmanagedType.R8)]
                public double rollDiameter;
     
                [MarshalAs(UnmanagedType.R8)]
                public double initialRoughness;
     
                [MarshalAs(UnmanagedType.R8)]
                public double finalRoughness;
     
                [MarshalAs(UnmanagedType.R8)]
                public double accumulateCombination;
     
                [MarshalAs(UnmanagedType.R8)]
                public double critialRollLength;
     
                [MarshalAs(UnmanagedType.R8)]
                public double rolledLength;
     
                [MarshalAs(UnmanagedType.R8)]
                public double percentageLifeRoll;
            };
    j'aimerais créer une structure qui contienne le nombre d'éléments et le tableau descriptifs de ceux-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class MultiRollInformation
    {
                [MarshalAs(UnmanagedType.I4)]
                public int nbRoll;		        //number of roll available
     
                public RollInformationCSharp[] tabRoll; //roll list
    };
    Est-ce comme cela qu'il faut procèder ?
    Est-ce que cela correspond à cela en c++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct 
    {
    	int nbElements;	
    	RollInformation* tabRoll;
    } MULTIROLL;

    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct RollInformation
    {
    	//char* rollType;
    	double rollDiameter;
    	double initialRoughnessRoll;
    	double finalRoughnessRoll;
    	double accumulateCombination;
    	double percentageLifeRoll;
    	double criticalRollLength;
    	double rolledLength;
    };
    Merci d'avance

  2. #2
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Par défaut
    Concernant mon problème, j'ai un peu avancé.

    Pour ma première structure :
    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
           [StructLayout(LayoutKind.Sequential)]
            public class RollInformationCSharp
            {
                [MarshalAs(UnmanagedType.R8)]
                public double rollDiameter;
     
                [MarshalAs(UnmanagedType.R8)]
                public double initialRoughness;
     
                [MarshalAs(UnmanagedType.R8)]
                public double finalRoughness;
     
                [MarshalAs(UnmanagedType.R8)]
                public double accumulateCombination;
     
                [MarshalAs(UnmanagedType.R8)]
                public double critialRollLength;
     
                [MarshalAs(UnmanagedType.R8)]
                public double rolledLength;
     
                [MarshalAs(UnmanagedType.R8)]
                public double percentageLifeRoll;
     
                public IntPtr rollName;
            };
    et j'ai créé une deuxième structure en C# :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
         [StructLayout(LayoutKind.Sequential)]
            public class MultiRollCSharp
            {
                [MarshalAs(UnmanagedType.I4)]
                public int nbRoll;
     
                public RollInformationCSharp[] tabRoll;
            }
    côté C++ :
    j'ai les équivalents :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct RollInformation
    {
    	double rollDiameter;
    	double initialRoughnessRoll;
    	double finalRoughnessRoll;
    	double accumulateCombination;
    	double percentageLifeRoll;
    	double criticalRollLength;
    	double rolledLength;
    	char* rollName;
    };
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct MultiRollInformation
    {
    	int nbRoll;
    	RollInformation* tabRoll;
    };
    Avec l'appel suivant de fonctions côté C# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          [DllImport("DLL_RaFTmodel.dll", CharSet = CharSet.Ansi)]
            public static extern IntPtr DLL_FlesCalculation(MultiRollCSharp multiRollInfo,
                                                  CoilInformationCSharp coilInfo,
                                                  RollInformationCSharp rollInfo,
     ...)
    Concernant la structure RollInformationCSharp, je la récupère parfaitement en C++.

    Pour la deuxième, je récupère bien l'entier mais mes données du tableau ne sont pas bonnes.

    Le remplissage de la structure en C# se fait de la façon suivante :
    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
                MultiRollCSharp multiRollInfo = new MultiRollCSharp();
                for(int i = 0; i < 5; i++)
                {
                    RollInformationCSharp rollInfo1 = GetRollInformation();
                    int taille = 0;
                    if (multiRollInfo.tabRoll != null)
                        taille = multiRollInfo.tabRoll.Length;
     
                    RollInformationCSharp[] tab = new RollInformationCSharp[taille +1];
                    if (taille > 0)
                    {
                        multiRollInfo.tabRoll.CopyTo(tab, 0);
                    }
                    tab[tab.Length-1] = rollInfo1;
                    multiRollInfo.tabRoll = tab;
     
                    multiRollInfo.nbRoll += 1;
                }
    puis appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                  IntPtr tableauCoupleForceTensionCUnmanaged = DLL_FlesCalculation(
                        multiRollInfo,
                        coilInfo,
                                                                                     rollInfo,
    ...);
    En mode debug, le contenu de multiRollInfo est parfait (nombre et les tableaux sont bien remplis).

    Si quelqu'un peut m'aider


    Merci d'avance

Discussions similaires

  1. Initialisation d'un tableau de structures dynamique
    Par mokochan dans le forum Débuter
    Réponses: 4
    Dernier message: 09/09/2013, 18h10
  2. Réponses: 35
    Dernier message: 04/06/2012, 12h38
  3. Réponses: 10
    Dernier message: 02/01/2007, 10h17
  4. Allocation dynamique tableau dans structure
    Par chental dans le forum C
    Réponses: 2
    Dernier message: 03/08/2006, 09h03

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