#c
#c
Вопрос:
Я написал программу для создания 2D-игры для поиска слов, которая позволяет пользователю выбирать из категории, и программа сгенерирует поиск слов, содержащий слова из указанной категории. однако, когда я компилирую программу, я получаю ошибку, которую я никогда раньше не видел, и я не могу понять, как ее исправить.
Это ошибка, которую я получаю —
TheRealFawcett:Wordsearch therealfawcett$ gcc -o Wordsearch1
Wordsearch1.c
Undefined symbols for architecture x86_64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
TheRealFawcett:Wordsearch therealfawcett$
Это мой код —
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define WIDTH 16
#define HEIGHT 16
#define NWORDS 6
char wordsearch[HEIGHT][WIDTH];
/* horizontaly */
int canPlaceH (const char * word, int i, int j)
{
if ((strlen(word) j) > WIDTH)
return 0;
do {
if ((wordsearch[i][j] != 0) amp;amp; (wordsearch[i][j] != *word))
return 0;
j = 1;
} while (* word);
return 1;
};
void placeH(const char * word, int i, int j)
{
do {
wordsearch[i][j ] = *word;
} while (* word);
};
/* verticaly */
int canPlaceV(const char * word, int i, int j)
{
if ((strlen(word) i) > HEIGHT)
return 0;
do {
if ((wordsearch[i][j] != 0) amp;amp; (wordsearch[i][j] != *word))
return 0;
i = 1;
} while (* word);
return 1;
};
void placeV(const char * word, int i, int j)
{
do {
wordsearch[i ][j] = *word;
} while (* word);
};
/* diagonal up */
int canPlaceDU(const char * word, int i, int j)
{
int ln = strlen(word);
if (((ln j) > WIDTH) || ((i - ln) < 0))
return 0;
do {
if ((wordsearch[i][j] != 0) amp;amp; (wordsearch[i][j] != *word))
return 0;
i -= 1;
j = 1;
} while (* word);
return 1;
};
void placeDU(const char * word, int i, int j)
{
do {
wordsearch[i--][j ] = *word;
} while (* word);
};
/* diagonal down */
int canPlaceDD(const char * word, int i, int j)
{
int ln = strlen(word);
if (((ln j) > WIDTH) || ((i ln) > HEIGHT))
return 0;
do {
if ((wordsearch[i][j] != 0) amp;amp; (wordsearch[i][j] != *word))
return 0;
i = 1;
j = 1;
} while (* word);
return 1;
};
void placeDD(const char * word, int i, int j)
{
do {
wordsearch[i ][j ] = *word;
} while (* word);
};
void fillWordsearch(const char ** a, int sz)
{
/* first step add words from a */
const char * used[NWORDS - 1] = { NULL }; /* to not get two times
the same word */
for (int w = 0; w != NWORDS; w) {
/* random choice of a word not yet used */
const char * word;
for (;;) {
word = a[rand() % sz];
int i;
/* check not yet used */
for (i = 0; i != w; i)
if (!strcmp(used[i], word))
break;
if (i == w) {
/* not yet used */
used[w] = word;
break;
}
};
/* random placement */
int i, j, d;
typedef int (*canFunc)(const char *, int, int);
typedef void (*placeFunc)(const char *, int, int);
const canFunc canPlace[] = { canPlaceH, canPlaceV, canPlaceDU,
canPlaceDD };
const placeFunc place[] = { placeH, placeV, placeDU, placeDD };
do {
i = rand() % HEIGHT;
j = rand() % WIDTH;
d = rand() % 4;
} while (!(*canPlace[d])(word, i, j));
(*place[d])(word, i, j);
#ifdef DEBUG
for (int i = 0; i != HEIGHT; i) {
for (int j = 0; j != WIDTH; j)
putchar((wordsearch[i][j] == 0) ? '.' : wordsearch[i][j]);
putchar('n');
};
putchar('n');
#endif
/* second step fill not yet set characters with random lowercase
letters */
int q,w;
for (q = 0; q < HEIGHT; q )
for (w = 0; w != WIDTH; w)
if (wordsearch[q][w] == 0)
wordsearch[q][w] = 'a' rand() % ('z' - 'a' 1);
};
int main();
const char *animalArray[] = {
"lynx",
"kitten",
"cheetah",
"ape",
"doe",
"reindeer",
"whale",
"baboon",
"skunk",
"dugong",
"elephant",
"anteater",
"chameleon",
"lizaed",
"horse"
};
const char *colourArray[] = {
"red",
"green",
"blue",
"black",
"pink",
"yellow",
"brown",
"orange",
"purple",
"black",
"white",
"cyan",
"maroon",
"magenta",
"grey"
};
const char *videogameArray[] = {
"fortnite",
"fifa",
"hytale",
"soma",
"prey",
"destiny",
"titanfall",
"woldenstein",
"battlefield",
"fallout",
"tekken",
"skyrim",
"dishonored",
"uncharted",
"anthem"
};
const char *sportsArray[] = {
"basketball",
"football",
"cricket",
"wrestling",
"fencing",
"rowing",
"volleyball",
"baseball",
"hockey",
"racing",
"golf",
"bobsleigh",
"curling",
"snowboarding",
"bowling"
};
const char *countryArray[] = {
"england",
"ireland",
"china",
"wales",
"bangladesh",
"maldives",
"slovenia",
"uruguay",
"colombia",
"samoa",
"jamaica",
"malta",
"bulgaria",
"armenia",
"gamnbia"
};
printf("--------------------------------n");
printf("| Welcome to the WordSearch Game|n");
printf("--------------------------------n");
printf("Choose a Category - n");
printf("Option 1 - Animalsn");
printf("Option 2 - Coloursn");
printf("Option 3 - Video Gamesn");
printf("Option 4 - Sportsn");
printf("Option 5 - Countriesn");
int i;
if ((scanf("%d", amp;i) != 1) || (i < 1) || (i > 5))
return;
srand(time(NULL));
switch (i) {
case 1:
fillWordsearch(animalArray,
sizeof(animalArray)/sizeof(*animalArray));
break;
case 2:
fillWordsearch(colourArray,
sizeof(colourArray)/sizeof(*colourArray));
break;
case 3:
fillWordsearch(videogameArray,
sizeof(videogameArray)/sizeof(*videogameArray));
break;
case 4:
fillWordsearch(sportsArray,
sizeof(sportsArray)/sizeof(*sportsArray));
break;
default:
fillWordsearch(countryArray,
sizeof(countryArray)/sizeof(*countryArray));
break;
};
/* print result */
for (i = 0; i != HEIGHT; i) {
for (int j = 0; j != WIDTH; j)
putchar(wordsearch[i][j]);
putchar('n');
};
return;
};
Это новые ошибки, которые я получаю, однако, когда я их изменяю, я получаю новые ошибки.
Это наименьшее количество ошибок, которые я получаю —
TheRealFawcett:Wordsearch therealfawcett$ gcc -o Wordsearch1
Wordsearch1.c
Wordsearch1.c:173:1: error: expected identifier or '('
{
^
1 error generated.
TheRealFawcett:Wordsearch therealfawcett$
Комментарии:
1. @ChristianGibbons теперь я отредактировал это
2. Это происходит с какой-то простой программой «hello world»? Кстати, вы не должны ставить точки с запятой после реализации функции.
Ответ №1:
Ошибка говорит о том, что вы не предоставили main()
функцию. Глядя на ваш код, я вижу следующее:
int main();
Это объявление функции, а не определение. Похоже, вы забыли фигурные скобки вокруг тела вашей main()
функции.
Я также вижу, что вы продолжаете ставить точку с запятой после закрывающей скобки всех ваших функций. Это не требуется и заставляет меня задуматься, какой ужасный ресурс вы используете для изучения C.
Редактировать:
Ваша fillWordsearch()
функция имеет несбалансированные фигурные скобки. Где-то отсутствует }
фигурная скобка.
Комментарии:
1. Я бы не стал так быстро обвинять учебный ресурс. Новичку не так уж сложно перепутать, когда использовать точку с запятой с функциями.
2. @TheRealFawcett Вы также ставите ненужные точки с запятой после закрывающей скобки ваших
for
циклов иswitch
оператора. В этом также нет необходимости, и это не дает мне особой уверенности в знаниях вашего лектора о C.3. я думаю, что теперь я исправил это, но я все еще получаю ту же ошибку?
4. @TheRealFawcett У вас есть некоторые другие ошибки, которые я добавил к своему ответу.
5. @Blastfurnace это новая ошибка, которую я получаю после всех изменений, но когда я делаю то, что говорит мне компилятор, я получаю более 20 новых ошибок TheRealFawcett:Wordsearch therealfawcett $ gcc -o Wordsearch1 Wordsearch1.c Wordsearch1.c:173:1: ошибка: ожидаемый идентификатор или ‘(‘ { ^ 1 ошибкасгенерировано. TheRealFawcett:поиск слов therealfawcett $
Ответ №2:
Где у вас есть:
int main();
const char *animalArray[] = {
у вас должно быть:
int main()
{
const char *animalArray[] = {
Комментарии:
1. @TheRealFawcett но ваш вопрос не об этих ошибках. Начните новый вопрос теперь, когда вы исправили этот.
2. @TheRealFawcett вы не должны этого делать. Это другой вопрос. SO не является дискуссионным форумом. Этот и другие приведенные ответы являются приемлемыми ответами на ваш первоначальный вопрос, но вы не можете ожидать, что те, которые помогли вам сохранить свои ответы на вашу движущуюся цель. Кроме того, теперь у вас явно есть простая проблема со сбалансированными фигурными скобками, которую вы наверняка можете решить сами — это просто подсчет!
Ответ №3:
Похоже, у вас нет main
функции. Я вижу строку
int main();
но это нигде не реализовано. Ошибка, которую вы получаете, заключается в том, что компилятор не знает, с чего начать программу. Возможно, это опечатка.
Возможно, вы имеете в виду не закрывать fillWordsearch
функцию и запускать main()
функцию.
}
int main()
{