Создать класс 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; } //в этом месте выскакивает исключение во время
//заполнения массива в цикле.
}