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