问题
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