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

落爺英雄遲暮 提交于 2019-12-11 04:02:40

问题


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.


回答1:


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



回答2:


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;


来源:https://stackoverflow.com/questions/4187038/new-to-c-error-c2371-error-redefinition-diffrent-basic-types

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!