预期标识符或'('之前' int'

时间:2014-05-21 16:36:11

标签: c

我为prim的算法编写了这段代码,我收到了这个错误:"期望的标识符或'('之前' int'"我有一个头文件,一个主文件和另一个.c文件。 这是错误:" s算法2 \ prim.h | 6 |错误:预期的标识符或'('在' int' | s algoritm" 谁能告诉我为什么会收到这个错误?

HEADER文件

#ifndef prim
#define prim
#define nmax 10

void prim(int mat[nmax][nmax],int x,int n ,int m);

#endif // graphs

PRIM.c文件

#include <stdio.h>
#include <stdlib.h>
#include "prim.h"


void prim(int mat[nmax][nmax], int x, int n, int m)
{
int viz[nmax], u, v, min, total = 0;
int i, j, counter;

for(i = 0; i < n; i++)
{
    viz[i] = 0;
}

viz[x] = 1;

for(counter = 0; counter < m; counter++)
{
    min = 999;

    for(i = 0; i < n; i++)
    {
        if(viz[i]==1)
        {
            for(j = 0; j < n; j++)
            {
                if(viz[j]!=1)
                {
                    if(min > mat[i][j])
                    {
                        min = mat[i][j];
                        u = i;
                        v = j;
                        }
                    }
                }
             }
        }

        viz[v] = 1;
        total += min;
        printf("\nMuchie gasita de la %d -> %d de weight %d", u, v, min);

    }

    printf("\nDimensiunea arborelui de acoperire minim: ", total);

}

MAIN.c文件

#include <stdio.h>
#include <stdlib.h>
#include "prim.h"

void main()
{
    FILE *fin;
    char sursa[20];
    int mat[nmax][nmax], n, m, i, j, x;

    printf("\nIntroduceti fisierul sursa: ");
    gets(sursa);

    fin = fopen(sursa, "r");
    if(fin == NULL)
    {
         perror("\nEroare la deschiderea fisierului!");
         exit(-1);
    }

    fscanf(fin, "%d %d", &n, &m);

    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++){

            fscanf(fin, "%d", &mat[i][j]);

          if(mat[i][j] == 0)
        {    
             mat[i][j] = 999;
        }
             fprintf(stdout, " %3d ", mat[i][j]);
     }
    fprintf(stdout, "\n");
}

printf("\nIntroduceti nodul sursa: ");
scanf("%d", &x);

prim(mat, x, n, m);
}

3 个答案:

答案 0 :(得分:6)

您在头文件中#define prim,然后在您的程序中使用该术语。预处理器并不关心它在那里意味着什么,它只是根据你的#define指令替换它,在这种情况下什么也没有。

尽量避免使用小写字母和简单术语作为#define值(除非你知道如何使用它们,否则尽量避免使用#define),这会导致这种情况。首先,将#defines更改为大写字母

答案 1 :(得分:1)

问题出在您的头文件中:

#ifndef prim
#define prim
#define nmax 10

void prim(int mat[nmax][nmax],int x,int n ,int m);

#endif // graphs

看起来你正试图设置一个包含守卫,但你重新使用了prim;这是一个问题,因为现在每次预处理器在源代码中看到prim时,它都会用空字符串替换它,所以你的函数声明变为

void (int mat[10][10],int x, int m ,int m);

,定义变为

void (int mat[10][10], int x, int n, int m)
{
int viz[10], u, v, min, total = 0;
...

并且main中的函数调用变为

(mat, x, n, m);

包含警卫的一般惯例是使用带有_H后缀的全部大写,因此您的标题应写为

#ifndef PRIM_H
#define PRIM_H
#define nmax 10

void prim( int mat[nmax][nmax], int x, int n, int m );

#endif // PRIM_H

答案 2 :(得分:0)

删除.h文件中的第一行后,代码在MS VISUAL 2010中编译。我没有进行任何其他更改。也许您应该尝试更改编译器。