Создать класс Unsafe2DArray, при работе выбрасывается исключение AccessViolation - C#
Формулировка задачи:
Целый день провозился, так и не нашел ошибку, а самое главное, что в интернете есть примеры и довольно подробное описание как это делать, но что-то у меня не так идёт, то StackOverflowException, то AccessViolationException появляются...
Класс должен реализовать работу с двумерным массивом. Вот мой код:
Этот класс расчитан только на работу с массивом структур типа PixelColorDetails, вот сам код структуры:
Буду благодарен также, если подскажете, как сделать обобщенный класс Unsafe2DArray<T> where T : struct
Я вычитал про безтиповые указатели void* но не получается их потом привести к обобщенному типу, да и арифметика с этим указателем не удаётся, хотелось бы заранее иметь указатель на тип Т, но компилятор ругается. Пляски с бубном вокруг класса Type и всяческих преобразований в надежде получить указатель на тип Т или хотя бы на структуру такого же размера к успеху не привели... Надеюсь на вашу помощь.
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)); } }
[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, при работе выбрасывается исключение AccessViolation»
textual
Листинг программы
public PixelColorDetails this[Int32 i, Int32 j] { get { return *(pBase + i * height + j); } set { *(pBase + i * height + j) = value; } //в этом месте выскакивает исключение во время //заполнения массива в цикле. }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д