Avatar billede kalle_bo Nybegynder
28. marts 2006 - 15:44 Der er 7 kommentarer og
1 løsning

Marshall af struct med array af struct

Har et problem med marshalling af struct:

public struct ydre
{
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 31)]
  public indre[] indre_List;
}

public struct indre
{
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
  public byte[] indre_byte;
}

Problemet er så at man ikke kan allokere plads inde i indre struct, så kommer den med unsupported exception... Jeg synes det
ser dumt ud at lave 128 bytes... Laves desuden på en PDA, så ved ikke om det er derfor!
Avatar billede nielle Nybegynder
28. marts 2006 - 18:31 #1
Følgende kode giver ikke mig nogen fejl:

        public struct indre
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
            public byte[] indre_byte;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            indre i = new indre();
            i.indre_byte = new byte[128];

            for (int idx=0; idx<i.indre_byte.Length; idx++)
            {
                i.indre_byte[idx] = 42;
            }

            MessageBox.Show(i.indre_byte[13].ToString());
        }

... men da jeg ikke har min dockingstation lige ved hånden, så har jeg nu også kun kørt den fra emulatoren.
Avatar billede kalle_bo Nybegynder
29. marts 2006 - 09:06 #2
Problemet er at den ydre struct har et array af indre struct's, der indeholder et array på 128 bytes... Du har kun lavet en indre struct
Avatar billede nielle Nybegynder
29. marts 2006 - 10:17 #3
Ahh ja, god pointe.

Denne kode fungere imidlertid på min PDA uden problemer:

        public struct ydre
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 31)]
            public indre[] indre_List;
        }

        public struct indre
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
            public byte[] indre_byte;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ydre y = new ydre();
            y.indre_List = new indre[31];

            for (byte idx1 = 0; idx1 < 31; idx1++)
            {
                y.indre_List[idx1].indre_byte = new byte[128];

                for (byte idx2 = 0; idx2 < 128; idx2++)
                {
                    y.indre_List[idx1].indre_byte[idx2] = idx2;
                }
            }

            MessageBox.Show("Done");
        }

Jeg gætter på at det måske er denne linje:

y.indre_List = new indre[31];

- du udelader? Det vil i hvert fald give en null-pointer exception.

At udføre denne vil imidlertid ikke afsætte 31x128 bytes, men blot:

31 x ”størrelsen på adressen for et bytearray.”

Det er derimod de 31 tilfælde af linjen (min idx1-for-loop):

y.indre_List[idx1].indre_byte = new byte[128];

- som hver i sær allokerer 128 bytes. Disse kan du vælge at vente med at allokere til at du rent faktisk har brug for dem.
Avatar billede kalle_bo Nybegynder
05. april 2006 - 13:06 #4
Manglede y.indre_List = new indre[31];
Avatar billede kalle_bo Nybegynder
05. april 2006 - 13:08 #5
Kom bare med et svar...
Avatar billede nielle Nybegynder
05. april 2006 - 22:05 #6
Svar :^)
Avatar billede kalle_bo Nybegynder
06. april 2006 - 09:10 #7
Får du point? Har trykket på accepter et par gange...
Avatar billede nielle Nybegynder
06. april 2006 - 21:48 #8
Du skal markere mit navn ude i boksen til venstre før at du kan tildele point.

Grunden til at det er lavet sådan er at der skal være mulighed - når mere end en har lagt et svar - for at vælge hvem eller hvilke af dem alle som skal være med om at dele point.
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