2011-01-24 2 views
1

Je suis en train de compiler suivant dijkstra algorithm, qui est écrit en C.erreur: variable ou champ « DTRA » déclarée nulle

mais après ne compile pas sur les fenêtres avec gcc.

void dtra(dd) 
float dd[MAX][MAX]; 
{ 
    init(); 
    nstep=1; 
    is=istart; 
    output(); 
    while(nm!=0) { 
     nstep++; 
     cal(dd); 
     output(); 
    } 
    route(); 
} 

et d'obtenir l'erreur suivante sur le bloc ci-dessus.

error: variable or field 'dtra' declared void 

Et je jamais vu une telle déclaration de fonction, donc je ne sais pas comment le résoudre.

void dtra(dd) 
float dd[MAX][MAX]; 

Quelqu'un pourrait me Allégé?

Modifier:

Voici le code complet, copie collé

/***** 14.1 Dijkstra Method ***/ 
/***** Programmed by M.Hisai and Y.Matano 1995 *****/ 
#include <stdio.h> 
#include<stdlib.h> 
#define MAX 20 
void dtra(); 
void init(); 
void cal(); 
void output(); 
void route(); 
int i,j,n,istart,nm,is,jp,nstep,m[MAX],p[MAX],path[MAX][MAX]; 
float vmin,d[MAX][MAX],v[MAX],sd[MAX][MAX]; 
FILE *fp; 

main() 
{ 
    if((fp=fopen("dijkstra.dat","r"))==NULL) { 
     printf("データファイルがありません。  \n"); 
     exit(1); 
    } 
    fp=fopen("dijkstra.dat","r"); 
    fscanf(fp,"%d",&n); 
    for(i=1;i<=n;i++) { 
     for(j=1;j<=n;j++) { 
      fscanf(fp,"%f",&d[i][j]); 
      if(d[i][j]==0.0) 
       d[i][j]=9000.0; 
     } 
    } 
    fscanf(fp,"%d",&istart); 
    fclose(fp); 
    fp=fopen("dijkstra_output.dat","w"); 
    dtra(d); 
    fclose(fp); 
    printf("dijkstra_output.txtにも出力しました\n"); 
} 

void dtra(dd) 
float dd[MAX][MAX]; 
{ 
    init(); 
    nstep=1; 
    is=istart; 
    output(); 
    while(nm!=0) { 
     nstep++; 
     cal(dd); 
     output(); 
    } 
    route(); 
} 

void init() 
{ 
    for(j=1;j<=n;j++) { 
     v[j]=9000; 
     p[j]=0; 
    } 
    v[istart]=0; 
    nm=n-1; 
    for(i=1;i<=nm;i++) { 
     if(i<istart) m[i]=i; 
     else  m[i]=i+1; 
    } 
} 

void cal(dd) 
float dd[MAX][MAX]; 
{ 
    for(i=1;i<=nm;i++) { 
     j=m[i]; 
     if(dd[is][j]<9000 && v[is]+dd[is][j]<v[j]) { 
      v[j]=v[is]+dd[is][j]; 
     p[j]=is; 
     } 
    } 
    vmin=100000.0; 
    for(i=1;i<=nm;i++) { 
     j=m[i]; 
     if(v[j]<vmin) { 
      vmin=v[j]; 
      is=j; 
     } 
    } 
    nm+=-1; 
    for(i=1;i<=nm;i++) { 
     if(m[i]>=is) m[i]=m[i+1]; 
    } 
} 

void output() 
{ 
    printf("STEP%2d \n",nstep);     fprintf(fp,"STEP%2d \n",nstep); 
    printf(" j  Vj Pj \n");   fprintf(fp," j  Vj Pj \n"); 
    for(j=1;j<=n;j++) { 
     printf("%3d %9.1f %3d \n",j,v[j],p[j]); fprintf(fp,"%3d %9.1f %3d \n",j,v[j],p[j]); 
    } 
    printf("M=(");        fprintf(fp,"M=("); 
    for(i=1;i<=nm;i++) { 
     printf("%2d ",m[i]);     fprintf(fp,"%2d ",m[i]); 
    } 
    printf(") \n\n");       fprintf(fp,") \n\n"); 
} 

void route() 
{ 
    printf("OPTIMAL SOLUTION \n");    fprintf(fp,"OPTIMAL SOLUTION \n"); 
    printf("START NODE=%2d \n",istart);   fprintf(fp,"START NODE=%2d \n",istart); 
    for(j=1;j<=n;j++) { 
     path[istart][j]=p[j]; 
     sd[istart][j]=v[j]; 
     if(j!=istart) { 
      printf("SHORTEST ROUTE:");   fprintf(fp,"SHORTEST ROUTE:"); 
      jp=j; 
      while(jp!=istart) { 
       printf("%2d<--",jp);   fprintf(fp,"%2d<--",jp); 
       jp=p[jp]; 
      } 
      printf("%2d  ",jp);   fprintf(fp,"%2d  ",jp); 
      printf("DISTANCE=%3.0f \n",v[j]); fprintf(fp,"DISTANCE=%3.0f \n",v[j]); 
     } 
    } 
} 

Modifier:

Merci, je l'ai travail.

/***** 14.1 Dijkstra Method ***/ 
/***** Programmed by M.Hisai and Y.Matano 1995 *****/ 
#include <stdio.h> 
#include<stdlib.h> 
#define MAX 20 

int i,j,n,istart,nm,is,jp,nstep,m[MAX],p[MAX],path[MAX][MAX]; 
float vmin,d[MAX][MAX],v[MAX],sd[MAX][MAX]; 
FILE *fp; 

void init(){ 
    for(j=1;j<=n;j++) { 
     v[j]=9000; 
     p[j]=0; 
    } 
    v[istart]=0; 
    nm=n-1; 
    for(i=1;i<=nm;i++) { 
     if(i<istart) m[i]=i; 
     else  m[i]=i+1; 
    } 
} 

void cal(float dd[MAX][MAX]){ 
    for(i=1;i<=nm;i++) { 
     j=m[i]; 
     if(dd[is][j]<9000 && v[is]+dd[is][j]<v[j]) { 
      v[j]=v[is]+dd[is][j]; 
     p[j]=is; 
     } 
    } 
    vmin=100000.0; 
    for(i=1;i<=nm;i++) { 
     j=m[i]; 
     if(v[j]<vmin) { 
      vmin=v[j]; 
      is=j; 
     } 
    } 
    nm+=-1; 
    for(i=1;i<=nm;i++) { 
     if(m[i]>=is) m[i]=m[i+1]; 
    } 
} 

void output(){ 
    printf("STEP%2d \n",nstep);     fprintf(fp,"STEP%2d \n",nstep); 
    printf(" j  Vj Pj \n");   fprintf(fp," j  Vj Pj \n"); 
    for(j=1;j<=n;j++) { 
     printf("%3d %9.1f %3d \n",j,v[j],p[j]); fprintf(fp,"%3d %9.1f %3d \n",j,v[j],p[j]); 
    } 
    printf("M=(");        fprintf(fp,"M=("); 
    for(i=1;i<=nm;i++) { 
     printf("%2d ",m[i]);     fprintf(fp,"%2d ",m[i]); 
    } 
    printf(") \n\n");       fprintf(fp,") \n\n"); 
} 

void route(){ 
    printf("OPTIMAL SOLUTION \n");    fprintf(fp,"OPTIMAL SOLUTION \n"); 
    printf("START NODE=%2d \n",istart);   fprintf(fp,"START NODE=%2d \n",istart); 
    for(j=1;j<=n;j++) { 
     path[istart][j]=p[j]; 
     sd[istart][j]=v[j]; 
     if(j!=istart) { 
      printf("SHORTEST ROUTE:");   fprintf(fp,"SHORTEST ROUTE:"); 
      jp=j; 
      while(jp!=istart) { 
       printf("%2d<--",jp);   fprintf(fp,"%2d<--",jp); 
       jp=p[jp]; 
      } 
      printf("%2d  ",jp);   fprintf(fp,"%2d  ",jp); 
      printf("DISTANCE=%3.0f \n",v[j]); fprintf(fp,"DISTANCE=%3.0f \n",v[j]); 
     } 
    } 
} 

void dtra(float dd[MAX][MAX]){ 
    init(); 
    nstep=1; 
    is=istart; 
    output(); 
    while(nm!=0) { 
     nstep++; 
     cal(dd); 
     output(); 
    } 
    route(); 
} 

main() 
{ 
    if((fp=fopen("dijkstra.dat","r"))==NULL) { 
     printf("データファイルがありません。  \n"); 
     exit(1); 
    } 
    fp=fopen("dijkstra.dat","r"); 
    fscanf(fp,"%d",&n); 
    for(i=1;i<=n;i++) { 
     for(j=1;j<=n;j++) { 
      fscanf(fp,"%f",&d[i][j]); 
      if(d[i][j]==0.0) 
       d[i][j]=9000.0; 
     } 
    } 
    fscanf(fp,"%d",&istart); 
    fclose(fp); 
    fp=fopen("dijkstra_output.dat","w"); 
    dtra(d); 
    fclose(fp); 
    printf("dijkstra_output.txtにも出力しました\n"); 
} 

dijkstra.dat

6 
    0.0 30.0 15.0 55.0 0.0 0.0 
10.0 0.0 15.0 20.0 0.0 0.0 
20.0 10.0 0.0 35.0 65.0 0.0 
    0.0 25.0 0.0 0.0 30.0 25.0 
    0.0 0.0 55.0 25.0 0.0 10.0 
    0.0 0.0 0.0 20.0 15.0 0.0 
1 
+0

C'est une façon assez étrange de déclarer des fonctions. –

Répondre

1

Il est ancien K & Syntaxe de style R pour définir une fonction.

Modifier à:

void dtra(float dd[MAX][MAX]) { 
.... 
} 
+0

Comment appelez-vous la fonction? – codaddict

+0

J'ai ajouté le code complet dans le message, pourriez-vous s'il vous plaît jeter un oeil si vous êtes ok. – YOU

+0

@ S. Mark: http: //www.ideone.com/3jLEP – codaddict

3
void dtra(dd) 
float dd[MAX][MAX]; 

à

void dtra(float dd[MAX][MAX]) 

L'original est une ancienne K & définition de la fonction R.

modifier: (le code complet)

Vous devez mettre à jour la définition de cal aussi. De plus, vous devez corriger les déclarations afin qu'elles correspondent aux définitions (il suffit de copier la pâte &).

comme ceci:

void dtra(float dd[MAX][MAX]); 
/* later */ 
void dtra(float dd[MAX][MAX]) 
{ /* func definiton */ } 

Le code contient plusieurs bizarreries (comme l'ouverture d'un fichier pour la lecture deux fois - mais seulement vérifier le succès de la première tentative), et ne sont pas standard conforme. Pas une bonne source pour apprendre C à partir de!

+0

Merci pour l'info et les conseils. – YOU

0

C'est ancien style K & R de déclarer les fonctions.

Questions connexes