Array of Pointer Iterieren!?



  • Hallo Leute,

    ich möchte Daten(sätze) welche über eine Pointer-Array referenziert sind auslesen. Das ganze funktioniert wunderbar wenn ich das in nem unsafe context mache:

    List<TLG_ARCHIVDATARAW> data = new List<TLG_ARCHIVDATARAW>();
               unsafe
               {
                   TLG_ARCHIVDATARAW** ppData = (TLG_ARCHIVDATARAW**)dataPtr.ToPointer();
                   for (int i = 0; i < reciveCount; i++)
                   {
                       var st = *((TLG_ARCHIVDATARAW*)*ppData);
                       data.Add(st);
                       *ppData += 1;
                   }
               }
    

    aber das möchte ich nur ungern, und versuche das ganze mit em Marshal..

    var pFirst = (IntPtr)Marshal.PtrToStructure(dataPtr, typeof(IntPtr));
              for (int i = 0; i < reciveCount; i++)
              {
                  var st = (TLG_ARCHIVDATARAW)Marshal.PtrToStructure(pFirst, typeof(TLG_ARCHIVDATARAW));
                  data.Add(st);
                  pFirst = new IntPtr(dataPtr.ToInt64() + Marshal.SizeOf(typeof(IntPtr)));
              }
    

    und scheitere jämerlich..😡 wo is mein Denkfehler???

    Info: Ich habe einen pointer welcher auf eine pointer-Array zeigt, jeder pointer zeicht auf einen datenzsatz

    Danke Schonmal



  • @krishan80 sagte in Array of Pointer Iterieren!?:

    scheitere jämerlich

    Das ist eine blumige aber nutzlose Beschreibung des Problems.



  • Ok mal anderes gefragt, wie sähe die Managed variante von:

    List<TLG_ARCHIVDATARAW> data = new List<TLG_ARCHIVDATARAW>();
               unsafe
               {
                   TLG_ARCHIVDATARAW** ppData = (TLG_ARCHIVDATARAW**)dataPtr.ToPointer();
                   for (int i = 0; i < reciveCount; i++)
                   {
                       var st = *((TLG_ARCHIVDATARAW*)*ppData);
                       data.Add(st);
                       *ppData += 1;
                   }
               }
    

    aus?


  • Administrator

    Da gibt es mehrere Dinge zu beachten. Wie ist TLG_ARCHIVDATARAW aufgebaut, hat es die nötigen Marshaling Attribute. Als was wird dein .Net Code kompiliert? Mixed? x86? x64? PtrToStructure scheint mir zudem recht fragwürdig zu sein, um einen IntPtr zu lesen. Ich würde da eher mit ReadIntPtr gehen.



  • Guten Morgen,

    die erste Datenstruktur kann ich auslesen, allerdings mach ich ein Fehler beim inkrementieren
    des pointer auf den nächsten Eintrag!?

    var pFirst = Marshal.ReadIntPtr(dataPtr);
              for (int i = 0; i < reciveCount; i++)
              {
                  var st = (TLG_ARCHIVDATARAW)Marshal.PtrToStructure(pFirst, typeof(TLG_ARCHIVDATARAW));
                  data.Add(st);
                  pFirst = new IntPtr(pFirst.ToInt64() + (Marshal.SizeOf(typeof(IntPtr)) * i));
              }
    

    und ja die Struktur hat die korrekten marshal attribute

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
      public struct TLG_ARCHIVDATARAW
          {
              [MarshalAs(UnmanagedType.Struct)]
              public SYSTEMTIME stTime;
              [MarshalAs(UnmanagedType.R8)]
              public double doValue;
              [MarshalAs(UnmanagedType.U4)]
              public uint dwFlags;
          }
    

    jemand noch ne Idee?

    P.s.: Acha ja "Any CPU"



  • Soooo.. morgens klappts dann wohl doch besser:)

    So geht's:

    var pFirst = Marshal.ReadIntPtr(dataPtr);
              for (int i = 0; i < reciveCount; i++)
              {
                  var st = (TLG_ARCHIVDATARAW)Marshal.PtrToStructure(pFirst, typeof(TLG_ARCHIVDATARAW));
                  data.Add(st);
                  pFirst = new IntPtr(pFirst.ToInt64() + (Marshal.SizeOf(typeof(TLG_ARCHIVDATARAW))));
              }
    

    musste natürlich die Adresse mit der Größe der Struktur inkrementieren:)

    Danke Euch:)



  • @krishan80 sagte in Array of Pointer Iterieren!?:

    musste natürlich die Adresse mit der Größe der Struktur inkrementieren:)

    Ja, klar. Weil es nämlich kein "Array of Pointer" ist was du da hast.



  • ja das stimmt.. laut ODK Doku war das aber so beschrieben.. naja wie auch immer.. dankeschön



  • Ach geh Schmarrn