новинка для C, ошибка C2371: «ошибка»: переопределение; различные базовые типы - PullRequest
2 голосов
/ 15 ноября 2010

Я должен отправить это задание за несколько часов, и я очень нервничаю, это своего рода управление программами АЗС, обработка входных файлов и печать результатов ... это всего 1 файл .c, и это мои первые строки кода, который определяет структуры

#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;

и это проблемные и основные функции:

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);

}

теперь ошибка указывает на функцию static void error(char *msg), но до этого она указывала на void CommandsSwitch(char *orders), CommandsSwitch выдают ту же ошибку.

плз попробуйте помочь и направить меня, я запутался.Тпй.

Ответы [ 2 ]

4 голосов
/ 15 ноября 2010

Одной из ваших проблем является использование функции error в 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... */

Эта функция error используется до фактического объявления вашей функции error ниже:

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

Вы столкнулись с функцией неявного объявления функции C, которая позволяет использовать функцию, как если бы она была неявно объявлена, так как вы не используете прототипы функций.

Длякомпилятор, он действует так, как будто есть функция, объявленная как

int error(...);

, что является конфликтом с вашей функцией:

static void error(char *);

Таким образом, в основном код действует так, как если бы уже была функцияВызван error объявлен, и с типом возврата по умолчанию int.Затем компилятор запустит ваше объявление функции void error() и пожалуется на переопределение функции error.

Самый простой способ решить эту проблему, по крайней мере, эточтобы переместить функцию error до void CommandsSwitch.

Вы можете прочитать о объявлениях функций и прототипах:

1 голос
/ 15 ноября 2010

Это не поможет с вашими ошибками во время компиляции, но когда вы дойдете до того, что вы действительно можете попытаться запустить этот код, вы должны знать, что вы не выделяли память для ptemp - это просто свисающий указатель . Изменить определение с:

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

например

char ptemp[LINE_MAX];
char *pfuncNum, *pcarID, *pstationName;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...