2

私はこの割り当てを数時間で提出する必要があり、非常に緊張しています。これは一種のガソリンスタンドの管理プログラム、入力ファイルの処理、結果の印刷です...これはたった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同じエラーを出します。

plzは私を助けて案内しようとします、私は混乱しています。tnx。

4

2 に答える 2

4

error問題の1つは、の関数の使用です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 *);

したがって、基本的に、コードは、errordeclaredと呼ばれる関数がすでに存在するかのように動作し、デフォルトの戻り型はint。です。次に、コンパイラはvoid error()関数宣言に遭遇し、関数の再定義があったと文句を言いますerror

この問題を修正する最も簡単な方法は、少なくとも、error関数をの前に移動することvoid CommandsSwitchです。

関数宣言とプロトタイプについて読みたいと思うでしょう:

于 2010-11-15T17:30:58.547 に答える
1

これはコンパイル時のエラーには役立ちませんが、実際にこのコードを実行してみることができるようになったときは、ptempにメモリを割り当てていないことに注意する必要があります。これは単なるダングリングポインタです。定義を次から変更します。

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

例えば

char ptemp[LINE_MAX];
char *pfuncNum, *pcarID, *pstationName;
于 2010-11-15T17:26:01.090 に答える