Taa, nie zauważyłem tego, nie zwiększasz początku, bo return wychodzi wcześniej.
zapisz to tak return *(bufor + (poczatek++));
dałem te dodatkowe nawiasy na wszelki wypadek, ale chyba nie są potrzebne z tego co pamiętam postinkrementacja ma wyższy priorytet od całej reszty
Poza tym w pierwszym kodzie w warunkach dodawania masz OR czego tez nie zuważyłem, powinno być and inaczej dodasz coś zawsze jesli a =/= x lub a =/= y to jest tautologia dla bo a nie moze byc jednoczesnie x i y aby to kiedy kolwiek zwróciło fałsz (chyba ze x = y)
– Dodane 29.12.2011 (Cz) 18:56 –
Nie mam pojęcia o co chodzi, ale pod windowsem mi się na moim programie ten labirynt wywala błąd to (0xC0000005), a pod unixem wyrzuca 22 kroki. Dziś ci już raczej nie dam rady pomóc bo mam jeszcze kilka spraw do załatwienia. Ale i tak wątpie, może “pogooglanie” za tym kodem błędu coś da.
Dla drugiego mój zwraca 4, musiałeś coś poknocić w algorytmie, albo w otaczaniu ścianami, ja dodaje to po chamie do wejścia (zakładam, że labirnynt będzie zabezpieczony) i wtedy działa. Może juto przepisze to na C, ale muszę usiąść z manualem do niego bo nigdy nie pisałem w czystym C.Przy czym zaznaczam, pod windowsem się sypie na unixie działa, nie wiem czemu.
– Dodane 31.12.2011 (So) 14:30 –
Dobra wymęczony, ale nadal ten duży labirynt sypie się pod mingw (code::blocks) na windowsie, pod gcc na linuksie działa, zwraca 22, tak jak sprawdziłem ręcznie, ten mały działa i pod windowsem i pod uniksem.
#include 
#define WALL -1
#define START -4
#define FINISH -5
#define VISITED 2
#define NOT_VISITED 0
#define DEBUG //Usunac te linijke aby pozbyc sie debugow w kodzie
//START FIFO
struct FIFO {
    int** buffer;
    int begin, end;
} fifo;
void FIFOConstructor(int fieldsNo) {
    fifo.buffer = (int**) malloc(sizeof(int*) * fieldsNo);
}
void flush() {
    fifo.begin = 0;
    fifo.end = 0;
}
void in(int* e) {
    *(fifo.buffer + fifo.end++) = e;
}
int* out() {
    return *(fifo.buffer + fifo.begin++);
}
//END FIFO
int main() {
    int columns, rows, startX, startY, finishX, finishY, i, j, counter = 0;
    int* dumm, *equidistance;
    int** labirynt;
    scanf("%d %d %d %d %d %d", &rows, &columns, &startY, &startX, &finishY, &finishX);
    columns += 2; rows += 2;
    startX += 1; finishX += 1;
    startY += 1; finishY += 1;
    //Przenioslem do przodu, bo nie ma sensu wczytywac wejscia, jak dostalismy dane spoza obszaru labiryntu, poprostu dajemy odpowiedź i konczymy program
    if(startX < 1 || startX > columns - 2 || finishX < 1 || finishX > columns - 2 || startY < 1 || startY > rows - 2 || finishY < 1 || finishY > rows - 2) {
        printf("BRAK WYJSCIA");
        return 0;
    }
    //alokacja labiryntu
    labirynt = (int**) malloc(sizeof(int*) * rows);
    dumm = (int*) malloc(sizeof(int) * rows * columns);
    for(i = 0; i < rows; i++)
        *(labirynt + i) = dumm + i * columns;
    //tworzenie kolejki fifo
    FIFOConstructor(columns * rows);
    // obramowanie
    for(i = 0; i < columns; i++) {
        *(*(labirynt + 0) + i) = WALL;
        *(*(labirynt + rows - 1) + i) = WALL;
    }
    for(i = 0; i < rows; i++) {
        *(*(labirynt + i) + 0) = WALL;
        *(*(labirynt + i) + columns - 1) = WALL;
    }
    #ifdef DEBUG
        printf("Obramowanie:\n");
        for(i = 0; i < rows; i++) {
            for(j = 0; j < columns; j++)
                printf("%3d", *(*(labirynt + i) + j));
            printf("\n");
        }
        printf("\n");
    #endif
    // wczytywanie labiryntu
    for(i = 1; i < rows - 1; i++)
        for(j = 1; j < columns - 1; j++)
            scanf("%d", &(*(*(labirynt + i) + j)));
    *(*(labirynt + startY) + startX) = START;
    #ifdef DEBUG
        printf("Labirynt:\n");
        for(i = 0; i < rows; i++) {
            for(j = 0; j < columns; j++)
                printf("%3d", *(*(labirynt + i) + j));
            printf("\n");
        }
        printf("\n");
    #endif
    //Umieszczamy start inicjalnie w kolejce
    in(&(*(*(labirynt + startY) + startX)));
    #ifdef DEBUG
        printf("Kolejka inicjalnie:");
        for(i = fifo.begin; i < fifo.end; i++) {
           printf(" %d", *(*(fifo.buffer + i)));
        }
        printf("\n\n");
    #endif
    //wskaznik mowiacy gdzie konczy sie strefa rownych odleglosci
    equidistance = &(*(*(labirynt + startY) + startX));
    while(fifo.end - fifo.begin > 0) {
        int* element, *left, *right, *up, *down;
        element = out();
        *element = VISITED;
        left = element - 1;
        right = element + 1;
        up = element - columns;
        down = element + columns;
        if(*left == FINISH || *right == FINISH || *up == FINISH || *down == FINISH) {
			counter++;
			break;
		}
        if(*left != VISITED && *left != WALL)
            in(left);
        if(*right != VISITED && *right != WALL)
            in(right);
        if(*up != VISITED && *up != WALL)
            in(up);
        if(*down != VISITED && *down != WALL)
            in(down);
        #ifdef DEBUG
            for(i = 0; i < rows; i++) {
                for(j = 0; j < columns; j++)
                    printf("%3d", *(*(labirynt + i) + j));
                printf("\n");
            }
            printf("\n");
        #endif
        if(element == equidistance) {
            equidistance = *(fifo.buffer + fifo.end - 1);
            counter++;
        }
    }
    #ifdef DEBUG
        for(i = 0; i < rows; i++) {
            for(j = 0; j < columns; j++)
                printf("%3d", *(*(labirynt + i) + j));
            printf("\n");
        }
        printf("\n");
    #endif
	printf("%d\n", counter);
    return 0;
}
Nie znalazłem powodu wysypywania się tej aplikacji pod windowsem kod błędu taki sam jak powyżej. Tam jeszcze nie dodałem warunku jak patrze na to ze kolejka jest zero a wyjścia nie możemy znaleźć, bo jest np. ogrodzenie zewsząd ścianami trzeba to dodać. Nie mniej ja już na dziś spadam z wiadomych sylwestrowych przyczyn. 