Преобразуйте тип int [] в int ** - PullRequest
0 голосов
/ 06 февраля 2012

Я играю с пикселями в изображении ..

Что у меня есть:

int w; // width
int h; // height
unsafe private int **pData; // pixel data

я хочу иметь возможность устанавливать высоту и ширину pData ... так что-то вроде следующего:

 pData = new int*[w]; 

 for(int x = 0; x<w; x++)
    pData = new int*[h]; 

это вызывает ошибку, хотя ("не может неявно преобразовать int [] в int **). Как бы я мог сделать это в C #? Я знаю, что это будет работать в C и C ++ ...

Полагаю, то, что я ищу, эквивалентно приведенному выше в C # ... как написано в C ++

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

Вы не можете инициализировать буферы таким образом.Вы можете сделать это:

class MyImage
{
    Int32[] _Buffer;
    Int32* _Pointer;
    GCHandle _Handle;

    public MyImage() {
        _Buffer = new Int32[w * h];
        _Handle = GCHandle.Alloc(_Buffer, GCHandleType.Pinned);
        _Pointer = (Int32*)_Handle.AddrOfPinnedObject().ToPointer();
    }
}

Но не делайте этого, это помешает GC выполнять свою работу.Лучше использовать fixed каждый раз, когда вы хотите получить доступ к вашему буферу.

Images

При работе с изображениями вы должны использовать Int32 [], поскольку Int32 [,]медленнее (см. msdn).Вы можете просто создать и изменить изображение следующим образом:

Int32[] buffer = new Int32[width * height];

Доступ:

buffer[x + (width * y)] ...
1 голос
/ 06 февраля 2012

То есть, вам нужна пиксельная сетка?

В C # вы можете просто использовать многомерные массивы или массив массивов, например,

private int[,] pixelData = new int[w, h];

// (Might have confused some variables here)
private int[][] pixelData = new int[w][];
for (int i = 0; i < w; i++) pixelData[i] = new int[h];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...