Avatar billede odegaard Nybegynder
08. februar 2005 - 21:34 Der er 6 kommentarer

Wrapping af C++ structure

Jeg sidder og er ved at wrappe en C++ DLL, og løb pludselig ind i en mur da stødte på den her:

typedef struct layer_obj {
  char *classitem;
  int numclasses;
  int index;
  struct map_obj *map;
} layerObj;

Mit problem er at jeg ikke har noget erklæret objektet 'map_obj' endnu. For at oprette min map_obj structure skal jeg nemlig have erklæret layerObj først.

map_obj ser således ud:

typedef struct map_obj{
  char *name;
  layerObj *layers; //<-- referer til layerObj
  char *datapattern, *templatepattern; 
  hashTableObj configoptions;
} mapObj;


I forhold til de øvrige structs jeg har erklæret, kan jeg her godt se at f.eks. layerObj-navnet ikke kun er angivet til sidst som de structs jeg kender, men at den også erklæres i starten som layer_Obj. Det samme gælder for mapObj. Og så er det her at min begrænsede C++ viden kommer til kort, og jeg ikke aner hvordan det skal wrappes i C#. Er der nogen der kan give mig nogle pointers til hvordan ovenstående skal forstås?
Avatar billede driis Nybegynder
08. februar 2005 - 21:48 #1
Så vidt jeg husker betyder skrivemåden at mapObj og layerObj er alias for hhv. map_obj og layer_obj.

Så umiddelbart kan jeg ikke se noget problem i at erklære ovennævnte strukturer i C#.
Avatar billede odegaard Nybegynder
08. februar 2005 - 22:18 #2
Det gør vel ikke referencen mindre cirkulær ?
Avatar billede driis Nybegynder
08. februar 2005 - 22:51 #3
Jeg forstår ikke dit problem. Følgende kompilerer fint:
    unsafe struct layerObj
    {
        [MarshalAs(UnmanagedType.LPStr)]string classitem;
        int numclasses;
        int index;
        unsafe
        mapObj * map;   
    }

    unsafe struct mapObj
    {
        [MarshalAs(UnmanagedType.LPStr)]string classitem;
        layerObj * layers;
    }
Avatar billede arne_v Ekspert
09. februar 2005 - 22:26 #4
I C++ skal du bruge en forward erklæring af den sidste type før den første typer for
at få det til at compile, men det burde ikke være nødvendigt i C#.

Jeg er lidt usikker på hvad der sker med 2 struct som peger på hinanden
som sende over i unmanaged kode.

Men prøv det !
Avatar billede odegaard Nybegynder
10. februar 2005 - 07:49 #5
driis: Jeg får nu at vide at der er tale om en cirkular reference, og det vil ikke compile. Omdøber jeg min struct til en class går det godt, men så får jeg ikke de rigtige værdier igennem fra C++ dll'en.
Avatar billede driis Nybegynder
10. februar 2005 - 11:30 #6
Prøv at poste den C# kode der ikke vil compile.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester