开发者

new to C , error C2371: 'error" : redefinition; diffrent basic types

i've to submit this assigment in few hours and i'm very nervous, it's sort of Gas Station managing programs, handeling input files, and printing results... it's only 1 .c file and that's my first code lines, which defines the structs

#include <stdio.h>
#include <string.h>
#include <stdlib.h>



struct Gas_Station *pgasStationHead = NULL;
typedef struct Gas_Station {
   char *name;
   double octan95SS;
 double octan95FS;
 double octan98SS;
 double octan98FS;
 double gasSoldTotal;
 double gasSoldSS;
 double gasSoldFS;
 struct Gas_Station* pgasStationNext;
 struct Client_List* pclientHead;
} Station;

typedef struct Client_List {
   char carID[10];
 char gasType[3];
   double gasAmount;
 char serviceType[12];
 struct Client_List* pclientNext;
} Client;

and those are the problematic functions and the main :

void CommandsSwitch(char *orders) {
 FILE *input , *output;
 input = fopen(orders, "rt");
 output = fopen("result.txt" , "wt");
 if (input == NULL) {
   error("can't open file, might not exists");
 }
 else if (output == NULL) {
   error("can't open file");
 }
 else {
  do {
   int i;
   char *ptemp, *pfuncNum, *pcarID , *pstationName;

   ptemp = fgets(ptemp , 80 , input);
   if (ptemp[0] != '#') {
    pfuncNum = strtok(ptemp , ",");
    i = (int)pfuncNum[0];
    switch (i)
    {
     case 1:
     HowMuchGasPerStation(output);
     break;

     case 2 :
     pstationName = strtok(pstationName , ",");
     AverageGasInSpecieficStation(output , pstationName);
     break;

     case 3 :
     HowMuchGasInAllStations(output);
     break;

     case 4 :
     HowMuchGasFSInAllStations(output);
     break;

     case 5 :
     pcarID = strtok(ptemp , ",");
     HowMuchGasSoldByCarID(output , pcarID);
     break;
     case 6 :
     pcarID = strtok(ptemp , ",");
     pstationName = strtok(pstationName , ",");
     HowMuchGasSoldByStationPerCarID(output , pcarID , pstationName);
     break;
     case 7 :
     pcarID = strtok(ptemp , ",");
     StationsWithClientByCarID(output , pcarID);
     break;
     case 8 :
     pcarID开发者_运维知识库 = strtok(ptemp , ",");
     pstationName = strtok(pstationName , ",");
     HowMuchClientSpentByStation(output , pcarID , pstationName);
     break;
     case 9 :
     pcarID = strtok(ptemp , ",");
     HowMuchClientSpentInTotalByCarID(output , pcarID);
     break;

     case 10 :
     pstationName = strtok(pstationName , ",");
     ClientDetailsBySpecieficStation(output , pstationName);
     break;
    }
   }
  }while(!feof(input)); 
 }
 fclose(input);
 fclose(output);
}

static void error(char *msg) {
 fprintf(stderr , "Error: %s\n", msg);
 exit(1);
}

int main (int argc, char* argv[]) {
 int i;
 FILE *f;
 char *orders = argv[1];
 for (i = 2; i < argc; i++) {
  f = fopen(argv[i] , "rt");
  if (f == NULL) {
   error("can't open file, might not exists");
  }
  else {
   AddStation(f);
  }
  fclose(f);
 }
 CommandsSwitch(orders);

}

now the error points to the static void error(char *msg) function but before that it pointed to void CommandsSwitch(char *orders), the CommandsSwitch give the same error.

plz try to help and guide me, i'm confused. tnx.


One of your problems is your use of the error function in CommandSwitch.

void CommandsSwitch(char *orders) {
 FILE *input , *output;
 input = fopen(orders, "rt");
 output = fopen("result.txt" , "wt");
 if (input == NULL) {
   error("can't open file, might not exists");
 }
 else if (output == NULL) {
   error("can't open file");
 }
 /* ...more... */

You use this error function before your actual declaration of your error function further down:

static void error(char *msg) {
 fprintf(stderr , "Error: %s\n", msg);
 exit(1);
}

You ran into the implicit function declaration feature of C, which allows you to use a function as if it were implicitly declared, as you are not using function prototypes.

To the compiler, it acts as though there's a function declared as

int error(...);

which is a conflict with your function:

static void error(char *);

So basically, the code acts as though there was already a function called error declared, and with a default return type of int. Then the compiler would run into your void error() function declaration, and complain that there was a redefinition of the function error.

The easiest method for you to fix this issue, at least, is to move the error function before void CommandsSwitch.

You will want to read about function declarations and prototypes:

  • http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=/com.ibm.vacpp6m.doc/language/ref/clrc07fundec.htm
  • http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Functions
  • Function Prototypes


This won't help with your compile-time errors, but when you get to the point that you can actually try running this code then you should be aware that you didn't allocate any memory for ptemp - it's just a dangling pointer. Change the definition from:

char *ptemp, *pfuncNum, *pcarID, *pstationName;

to e.g.

char ptemp[LINE_MAX];
char *pfuncNum, *pcarID, *pstationName;
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜