1

(C プログラム) ヘッダーを使用する main.c をコンパイルしようとしていますが、以下のエラーが発生します。ヘッダー (メイン ファイル内のすべてのメソッド) を使用しない場合、すべてが機能します。

文字列 S で、プログラムは出現するすべての単語を検索し、最も多く出現する単語を返します。

私は以下を使用してコンパイルしています:gcc main.c

ありがとうございました。

エラー

In file included from main.c:9:0:
frequence.h:4:16: warning: useless storage class specifier in empty declaration [enabled by default]
main.c: In function ‘main’:
main.c:15:10: error: variable ‘word’ has initializer but incomplete type
main.c:15:10: warning: passing argument 1 of ‘show_all_words’ from incompatible pointer type [enabled by default]
frequence.h:6:17: note: expected ‘char *’ but argument is of type ‘char (*)[34]’
main.c:15:10: error: invalid use of undefined type ‘struct stat_mot’
main.c:15:19: error: storage size of ‘word’ isn’t known

main.c

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

#define LONGUEURMAX 4

int main(char *argv[]) {
  char texte[] = ";! one two, tree foor one two !:;";
  struct stat_mot word = show_all_words(&texte);

  printf("%s : %d\n", word.word, word.frequency);

  return (EXIT_SUCCESS);
};

頻度.h

#ifndef DEF_FREQUENCE
#define DEF_FREQUENCE

typedef struct stat_mot;
int count_word(char * , char * );
struct stat_mot show_all_words(char *);

#endif

頻度.c

#include "frequence.h"

typedef struct stat_mot {
    char * word;
    int frequency;
} stat_mot;

int count_word(char * mot, char * text) {
  int n = 0;
  char *p;

  p = strstr(text, mot);  
  while (p != NULL) {
    n++;
    p = strstr(p + 1, mot);
  }  

  return n;
}

stat_mot show_all_words(char * text) {
    char * text_rw = strdup(text);
    char * p = strtok(text_rw, " .,;:-!?");

    char word_to_return[strlen(text)];
    int  word_frequence = 0;

    while (p != NULL) {
      if (strlen(p) >= 0) {
        int offset = p - text;
        int count = count_word(p, text);

        if (word_frequence < count) {
          strcpy(word_to_return, p);          
          word_frequence = count;
        }
      };

      p = strtok(NULL, " .,;:-!?");
    }

    free(text_rw);
    struct stat_mot word = { word_to_return, word_frequence };
    return word;
}
4

8 に答える 8

5

少なくとも、 の定義をstat_motfrequence.c から frequence.h に移動する必要があります。main()そのインスタンスを作成しようとしますが、構造体定義なしでは作成できません。

他にもいくつかの問題があります。

  • すべてを 1 つのファイルに入れることで、 との型の不一致が解決されるchar*とは信じがたいです。char(*)[34]したがって、修正はコードをファイルに編成することとは何の関係もないと思いtexteます&texte
  • 「useless storage class specifier in empty declaration」 -- 紛らわしいエラー メッセージですが、C 構文typedefでは がストレージ クラス指定子であるために発生します。理由を聞かないでください。基本的にtypedef struct stat_mot;は間違っていますが、構造体定義を移動するときにとにかく削除できるので問題ありません。
于 2012-10-11T12:18:48.370 に答える
3

構造体の定義はヘッダーにある必要があります。

于 2012-10-11T12:18:31.257 に答える
1

stat_mot構造をに配置する必要がありますfrequence.h

さらに、次のmain()ように宣言する必要があります

int main(int argc, char **argv)

texteする必要がありますchar *

int main(char *argv[])
{
    char *texte = ";! one two, tree foor one two !:;";
    struct stat_mot word = show_all_words(texte);

また、、、およびを使用するため、および<string.h>を含める必要があります。<stdlib.h>frequence.cstrstrstrlenfree

ではfrequence.cstrlenは常にゼロ以上であるため、比較は常に真になります。

于 2012-10-11T12:28:27.823 に答える
1

ヘッダーは定義にのみ適しています。たとえば、コンパイルは実際に機能しますが、リンカーは関数の本体を探す場所を知りません。

でコンパイルしてみるgcc main.c frequence.c

また、typedef struct stat_mot;あまり意味がありません --struct stat_motは現時点では定義されていません。また、 this で新しい名前を付けているわけでもありませんtypedef。たとえ許可されていたとしても、構造体定義を分離することは意味がないと思います - 結局、ヘッダーファイルを配布するだけなら、人々は構造体の使い方を知っているべきです (例えば、含まれているものを見てください)。

于 2012-10-11T12:19:37.610 に答える
1

構造体はヘッダー ファイルで宣言しますが (前方宣言) ソースファイルで定義します。そのため からは使えません。stat_motfrequence.cmain.c

于 2012-10-11T12:20:14.853 に答える
1

構造体宣言をヘッダー ファイルに入れるだけです。

/* in frequence.h */
struct stat_mot {
    char* word;
    int frequency;
};

したがって、両方の翻訳単位 (つまり、.cファイル) がそれを認識します。

于 2012-10-11T12:20:21.057 に答える
0

たぶんあなたはこれを書くべきです

typedef struct stat_mot stat_mot;

あなたのfrequence.hでそしてそれから

typedef struct stat_mot {
    char * word;
    int frequency;
};

.cファイル内。

.hファイルはデータファイルまたはメソッドの単なる宣言ですが、明確に宣言する必要があります。

ヒント:必要はありません;; main(){}の終わりに;

于 2012-10-12T03:11:15.833 に答える
0

struct stat_motヘッダー ファイルで定義するか、ポインターを使用する必要があります。

ああ、(これは問題ではありませんが)

typedef struct stat_mot;

次のように 2 番目のタイプ名を指定する必要があります。

typedef struct stat_mot stat_mot;

于 2012-10-11T12:20:26.097 に答える