Создать класс Unsafe2DArray, при работе выбрасывается исключение AccessViolation - C#

Узнай цену своей работы

Формулировка задачи:

Целый день провозился, так и не нашел ошибку, а самое главное, что в интернете есть примеры и довольно подробное описание как это делать, но что-то у меня не так идёт, то StackOverflowException, то AccessViolationException появляются... Класс должен реализовать работу с двумерным массивом. Вот мой код:
unsafe public class Unsafe2DArray : IDisposable
    {
        private PixelColorDetails* pBase;
        private Int32 width;  //ширина массива
        private Int32 height; //высота массива
 
        public Unsafe2DArray(Int32 n, Int32 m)
        {
            width = n;
            height = m;
            pBase = (PixelColorDetails*)Marshal.AllocHGlobal(
                Marshal.SizeOf(typeof(PixelColorDetails)) * n * m);
        }
 
        public PixelColorDetails this[Int32 i, Int32 j]
        {
            get { return *(pBase + i * width + j); }
            set { *(pBase + i * width + j) = value; } //в этом месте выскакивает исключение во время 
                                                                   //заполнения массива в цикле.
        }
 
        public Int32 GetLength(Int32 dimension)
        {
            switch (dimension)
            {
                case 0: return width;
                case 1: return height;
                default: throw new ArgumentException();
            }
        }
 
        public void Dispose()
        {
            Marshal.FreeHGlobal(new IntPtr(pBase));
        }
    }
Этот класс расчитан только на работу с массивом структур типа PixelColorDetails, вот сам код структуры:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct PixelColorDetails
    {
        public Byte blue;
        public Byte green;
        public Byte red;
 
        public PixelColorDetails(Byte r, Byte g, Byte b)
        {
            red = r;
            green = g;
            blue = b;
        }
 
        public override string ToString()
        {
            return red.ToString() + green.ToString() + blue.ToString();
        }
 
        public static explicit operator Color(PixelColorDetails p)
        {
            return Color.FromArgb(p.red, p.green, p.blue);
        }
 
        public static bool operator ==(PixelColorDetails a, PixelColorDetails b)
        {
            return (a.blue == b.blue) && (a.red == b.red) && (a.green == b.green);
        }
 
        public static bool operator !=(PixelColorDetails a, PixelColorDetails b)
        {
            return !((a.blue == b.blue) && (a.red == b.red) && (a.green == b.green));
        }
    }
Буду благодарен также, если подскажете, как сделать обобщенный класс Unsafe2DArray<T> where T : struct Я вычитал про безтиповые указатели void* но не получается их потом привести к обобщенному типу, да и арифметика с этим указателем не удаётся, хотелось бы заранее иметь указатель на тип Т, но компилятор ругается. Пляски с бубном вокруг класса Type и всяческих преобразований в надежде получить указатель на тип Т или хотя бы на структуру такого же размера к успеху не привели... Надеюсь на вашу помощь.

Решение задачи: «Создать класс Unsafe2DArray, при работе выбрасывается исключение AccessViolation»

textual
Листинг программы
        public PixelColorDetails this[Int32 i, Int32 j]
        {
            get { return *(pBase + i * height + j); }
            set { *(pBase + i * height + j) = value; } //в этом месте выскакивает исключение во время 
                                                                   //заполнения массива в цикле.
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы