Zawieszenie programu - algorytm Floyda

0

Witam serdecznie, uprzejmie proszę o pomoc w analizie (mojego) poniższego kodu. Jest to realizacja sekwencyjnego algorytmu Floyda (na uczelnie).
Program wczytuje graf z pliku tekstowego (w pierwszej linii ilość węzłów a w następnych połączenia, węzeł start, węzeł stop, waga).
Program poprawnie wczytuje plik ale w zaznaczonym miejscu się zawiesza. Gapie się na niego już kilka godzin i nie mam absolutnie żadnego pomysłu co popsułem.
program kompiluje na pingwinie za pomocą gcc i odpalam: cat graf.txt | ./a.out.

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int ***A;
int cyc=0,N;
int i,j,k, x, y, value;

int min(int a1, int a2){
	if (a1<a2){
		return a1;
	} else {
		return a2;
	}
}

int main(int argc, int **argv){
	A = (int ***)malloc(2*sizeof(int**));
	char b[10];
	char *ptr;
	char *p;

	while(fgets(b, sizeof(b), stdin)!=NULL){
		p=strtok(b," ");
		while(p){
			if(cyc==0){
				N=strtol(p, NULL, 10);
				for(i = 0; i < 2; i++) {
				    	A[i] = (int **)malloc(N*sizeof(int*));
 					for (j = 0; j < N; j++) {
						A[i][j] = (int *)malloc(N*sizeof(int));
					}
				}
				for(i = 0; i < N; i++) {
					for (j = 0; j < N; j++) {
						A[0][i][j]=0;
						A[1][i][j]=1;
						if (i==j){
							A[1][i][j]=0;							
						}
					}				
				}					
			}else{
				switch (cyc%3){
				case 0: 
					value=strtol(p, NULL, 10); 
					A[0][x-1][y-1]=value;
					A[1][x-1][y-1]=0;
					break;
				case 1: x=strtol(p, NULL, 10); break;
				case 2: y=strtol(p, NULL, 10); break;
				}	
			}
			cyc++;
			p = strtok(NULL, " ");
		}
	}
  
  printf("test");
	
//tutaj program się zawiesza
//printf powyżej się wykonuje natomiast ten w pętli for poniżej nie

  for(k = 0; k < N; k++) { printf("%d",k);
		for(i = 0; i < N; i++) {
			for (j = 0; j < N; j++) {
				if ((A[1][i][k]=0)&&(A[1][k][j]=0)){		
					//printf("%d %d %d",k,i,j);
					if(A[1][i][j]=1){
						A[0][i][j]=A[0][i][k]+A[0][k][j];
					}else{
						A[0][i][j]=min(A[0][i][j],A[0][i][k]+A[0][k][j]);
					}
					A[1][i][j]=0;
				}
			}
		}
	}
	for(i = 0; i < N; k++) {
		for(j = 0; j < N; j++) {
			if (A[1][i][j]=0){
				printf("A[%d][%d]=%d",i,j,A[0][i][j]);
			}
		}		
	}

	for(i = 0; i < 3; i++) {
		for(j = 0; j < N; j++) {
    			free(A[i][j]);
		}   
		free(A[i]);
	}
	free(A);
	
	return EXIT_SUCCESS;
} 

plik graf.txt:

3
1 2 3
23
0

Plik graf się rozjechał nie wiem czemu powinien wyglądać tak:

3
1 2 3
2 3 4

2

Breakpoint na początku a potem debugger w dłoń. Nikt tego za ciebie nie zrobi.

0

Mi printf w pętli "zadziałał" (tj wyprintowało "012"), więc zapewne gdzieś masz UB. Nie jest to znany mi algorytm, a kod wygląda mało przejrzyście, więc zachęcam do debugowania.

1
  1. Zapoznaj się z operatorami inkrementacji, bo wg mnie nie rozumiesz ich działania: http://4programmers.net/Forum/1101404
  2. Zapoznaj się z operatorem porównania == oraz czym się różni od operatora przypisania = tu na 100% nie rozumiesz różnicy.
0

Kilka lat pisania w Delphi i człowiek zapomina że = to nie =. Gapiłem się na to i gapiłem i nie widziałem a gdb mnie przeraża.
Bardzo dziękuje za odblokowanie mi mózgu :)

0

@JA3 eclipse ma graficzną nakładkę na gdb ;)

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