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.