Deklaracja tablicy 2D z adresu pierwszego elementu (bitmapy)

0

Witam.
mam pewną funkcję do której jako jeden z parametrów przekazuję adres początkowy tablicy 2D (w zasadzie jest to bitmapa). I teraz jak 'normalnie' zadeklarować w moim przypadku zmienną 'src' jako zmienną tablicową 2D (tak żeby można było z niej korzystać tak jak w przykładzie czyli src[y][x])? W zasadzie to moja funkcja już działa ale tak trochę po partyzancku.

PS. #1 - Przy okazji chciałbym się zapytać czy obecne kompilatory potrafią to skompilować tak jakbym używał pointerów czy lepiej jest to przepisać pod arytmetykę pointerów? Aktualnie korzystam z tablicy bo jest to łatwiejsze w edycji.
2# - Korzystając z tej funkcji zauważyłem, że jak nie wyczyszczę tablicy 'q' i 'b' to pozostają śmieci po poprzednim obrazie a spodziewałem się, że sama deklaracja wystarczy aby wyzerować tablicę. Ktoś może mi wyjaśnić o co tutaj chodzi? (moje funkcje są kompilowane do .dll a następnie wywoływanie w Autohotkey)
#3 - Jakiś ogólne rady co zrobiłem źle w tej funkcji, pomijając kwestię samego algorytmu? Z c korzystam sporadycznie.

void _FloodFillExcept(int w,int h,uint32_t src[h][w],int x,int y,uint32_t newColor,uint32_t exceptColor,struct _bound *Frame){
    struct PT q[w*h];
    for(int i=0;i<w*h;i++){
        q[i] = (struct PT){0,0};
    }
    int b[w][h];
    for(int i=0;i<w;i++){
        for(int j=0;j<h;j++){
            b[i][j] = 0;
        }
    }
    uint64_t i = 0;
    if (src[y][x]==exceptColor)
        return;
    q[++i] = (struct PT){x,y} ,b[x][y] = 1;
    Frame->L = (struct PT){x,y};
    Frame->R = (struct PT){x,y};
    Frame->U = (struct PT){x,y};
    Frame->D = (struct PT){x,y};
    w--;
    h--;
    while(i>0){
        struct PT p = q[i--];
        x = p.x;
        y = p.y;

        if (x<Frame->L.x) Frame->L = (struct PT){x,y};
        if (x>Frame->R.x) Frame->R = (struct PT){x,y};
        if (y<Frame->U.y) Frame->U = (struct PT){x,y};
        if (y>Frame->D.y) Frame->D = (struct PT){x,y};

        src[y][x] = newColor;

        if ( (x<w) && (b[x+1][y]!=1) && (src[y][x+1]!=exceptColor) )
            q[++i] = (struct PT){x+1,y} ,b[x+1][y] = 1;
		if ( (x>0) && (b[x-1][y]!=1) && (src[y][x-1]!=exceptColor) )
            q[++i] = (struct PT){x-1,y} ,b[x-1][y] = 1;
		if ( (y<h) && (b[x][y+1]!=1) && (src[y+1][x]!=exceptColor) )
            q[++i] = (struct PT){x,y+1} ,b[x][y+1] = 1;
		if ( (y>0) && (b[x][y-1]!=1) && (src[y-1][x]!=exceptColor) )
            q[++i] = (struct PT){x,y-1} ,b[x][y-1] = 1;
    }
}
0

Co do przekazywania tablicy nie widzę powodów aby to zmieniać na wskaźniki. Dzięki temu co masz teraz wiesz że operujesz na dwuwymiarowej tablicy.

#1 Tak samo jak wyżej, skoro jest to łatwiejsze w edycji to bym zostawił dla czytelności kodu.

0

A co jakbym chciał to skompilować pod c++? Nie jest to konieczne ale klasy przydałyby mi się czasami w innych funkcjach.
Poza tym z czystej ciekawości chciałbym wiedzieć jak za pomocą adresu uzyskać tablicę 2D.

1 użytkowników online, w tym zalogowanych: 0, gości: 1