我需要帮助解决CS50课程中我从speller.c
获取pset5的错误。错误如下所示:
clang -ggdb3 -O0 -Qunused-arguments -std=c11 -Wall -Werror -o speller speller.o dictionary.o
dictionary.o: In function `main':
/home/ubuntu/workspace/pset5/dictionary.c:21: multiple definition of `main'
speller.o:/home/ubuntu/workspace/pset5/speller.c:28: first defined here
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [speller] Error 1a"
有谁知道如何解决这个问题?
/****************************************************************************
* speller.c
*
* Computer Science 50
* Problem Set 6
*
* Implements a spell-checker.
***************************************************************************/
#include <ctype.h>
#include <stdio.h>
#include <sys/resource.h>
#include <sys/time.h>
#include "dictionary.h"
// default dictionary
#define DICTIONARY "/home/cs50/pset6/dictionaries/large"
// prototype
double calculate(const struct rusage *b, const struct rusage *a);
int
main(int argc, char *argv[])
{
// check for correct number of args
if (argc != 2 && argc != 3)
{
printf("Usage: speller [dictionary] text\n");
return 1;
}
// structs for timing data
struct rusage before, after;
// benchmarks
double ti_load = 0.0, ti_check = 0.0, ti_size = 0.0, ti_unload = 0.0;
// determine dictionary to use
char *dictionary = (argc == 3) ? argv[1] : DICTIONARY;
// load dictionary
getrusage(RUSAGE_SELF, &before);
bool loaded = load(dictionary);
getrusage(RUSAGE_SELF, &after);
// abort if dictionary not loaded
if (!loaded)
{
printf("Could not load %s.\n", dictionary);
return 2;
}
// calculate time to load dictionary
ti_load = calculate(&before, &after);
// try to open text
char *text = (argc == 3) ? argv[2] : argv[1];
FILE *fp = fopen(text, "r");
if (fp == NULL)
{
printf("Could not open %s.\n", text);
unload();
return 3;
}
// prepare to report misspellings
printf("\nMISSPELLED WORDS\n\n");
// prepare to spell-check
int index = 0, misspellings = 0, words = 0;
char word[LENGTH+1];
// spell-check each word in text
for (int c = fgetc(fp); c != EOF; c = fgetc(fp))
{
// allow only alphabetical characters and apostrophes
if (isalpha(c) || (c == '\'' && index > 0))
{
// append character to word
word[index] = c;
index++;
// ignore alphabetical strings too long to be words
if (index > LENGTH)
{
// consume remainder of alphabetical string
while ((c = fgetc(fp)) != EOF && isalpha(c));
// prepare for new word
index = 0;
}
}
// ignore words with numbers (like MS Word can)
else if (isdigit(c))
{
// consume remainder of alphanumeric string
while ((c = fgetc(fp)) != EOF && isalnum(c));
// prepare for new word
index = 0;
}
// we must have found a whole word
else if (index > 0)
{
// terminate current word
word[index] = '\0';
// update counter
words++;
// check word's spelling
getrusage(RUSAGE_SELF, &before);
bool misspelled = !check(word);
getrusage(RUSAGE_SELF, &after);
// update benchmark
ti_check += calculate(&before, &after);
// print word if misspelled
if (misspelled)
{
printf("%s\n", word);
misspellings++;
}
// prepare for next word
index = 0;
}
}
// check whether there was an error
if (ferror(fp))
{
fclose(fp);
printf("Error reading %s.\n", text);
unload();
return 4;
}
// close text
fclose(fp);
// determine dictionary's size
getrusage(RUSAGE_SELF, &before);
unsigned int n = size();
getrusage(RUSAGE_SELF, &after);
// calculate time to determine dictionary's size
ti_size = calculate(&before, &after);
// unload dictionary
getrusage(RUSAGE_SELF, &before);
bool unloaded = unload();
getrusage(RUSAGE_SELF, &after);
// abort if dictionary not unloaded
if (!unloaded)
{
printf("Could not unload %s.\n", dictionary);
return 5;
}
// calculate time to unload dictionary
ti_unload = calculate(&before, &after);
// report benchmarks
printf("\nWORDS MISSPELLED: %d\n", misspellings);
printf("WORDS IN DICTIONARY: %d\n", n);
printf("WORDS IN TEXT: %d\n", words);
printf("TIME IN load: %.2f\n", ti_load);
printf("TIME IN check: %.2f\n", ti_check);
printf("TIME IN size: %.2f\n", ti_size);
printf("TIME IN unload: %.2f\n", ti_unload);
printf("TIME IN TOTAL: %.2f\n\n",
ti_load + ti_check + ti_size + ti_unload);
// that's all folks
return 0;
}
/*
* Returns number of seconds between b and a.
*/
double
calculate(const struct rusage *b, const struct rusage *a)
{
if (b == NULL || a == NULL)
return 0;
else
return ((((a->ru_utime.tv_sec * 1000000 + a->ru_utime.tv_usec) -
(b->ru_utime.tv_sec * 1000000 + b->ru_utime.tv_usec)) +
((a->ru_stime.tv_sec * 1000000 + a->ru_stime.tv_usec) -
(b->ru_stime.tv_sec * 1000000 + b->ru_stime.tv_usec)))
/ 1000000.0);
}
答案 0 :(得分:1)
您向我们展示的文件spelling.c
包含main()
个功能;没关系。您未向我们展示的文件dictionary.c
也包含main()
个功能;这就是问题所在。
您需要确保链接在一起的目标文件中只有一个main()
函数才能生成拼写程序 - 在这种情况下,您可能只想要来自{{1}的main()
}。
您可能需要将spelling.c
中的main()
程序转换为仅在您测试dictionary.c
时编译的代码。或者,您需要将测试dictionary.c
移动到新文件中,例如main()
,只留下test-dictionary.c
本身的主要工作字典代码 - 两者都使用的代码dictionary.c
和spelling.c
,dictionary.c
描述的代码。