Почему это происходит? (Ошибка программирования 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) && (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) && (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) && (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) && (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 - Animals\n");
  printf("Option 2 - Colours\n");
  printf("Option 3 - Video Games\n");
  printf("Option 4 - Sports\n");
  printf("Option 5 - Countries\n");

 int i;

  if ((scanf("%d", &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$ 

@ChristianGibbons, я отредактировал это

TheRealFawcett 09.04.2019 18:08

Это происходит с какой-то простой программой «Hello World»? Кстати, вы не должны ставить точку с запятой после реализации функции.

Eugene Sh. 09.04.2019 18:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
2
68
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Где у вас есть:

int main();

  const char *animalArray[] = {

Вы должны иметь:

int main()
{
  const char *animalArray[] = {

@TheRealFawcett, но ваш вопрос не об этих ошибках. Начните новый вопрос теперь, когда вы исправили этот.

Clifford 09.04.2019 18:31

@TheRealFawcett, тебе не следует этого делать. Это другой вопрос. SO - это не дискуссионный форум. Этот и другие данные ответы являются приемлемыми ответами на ваш первоначальный вопрос, но вы не можете ожидать, что те, которые помогли вам, сохранят свои ответы на вашу движущуюся цель. Кроме того, теперь у вас явно есть простая проблема с балансировкой брекетов, в которой вы наверняка разберетесь сами - это просто подсчет!

Clifford 09.04.2019 18:37

Похоже, у вас нет функции main. я вижу линию

int main();

но это нигде не реализовано. Ошибка, которую вы получаете, связана с тем, что компилятор не знает, где запустить программу. Возможно, это опечатка.

Возможно, вы имели в виду не закрывать функцию fillWordsearch, а запускать функцию main().

}

int main()
{
Ответ принят как подходящий

Ошибка говорит о том, что вы не предоставили функцию main(). Глядя на ваш код, я вижу следующее:

int main();

Это объявление функции, а не определение. Похоже, вы забыли фигурные скобки вокруг тела вашей функции main().

Я также вижу, что вы продолжаете ставить точку с запятой после закрывающей скобки всех ваших функций. Это не обязательно и заставляет меня задаться вопросом, какой ужасный ресурс вы используете для изучения C.

Редактировать:

Ваша функция fillWordsearch() имеет несбалансированные фигурные скобки. Где-то не хватает скобки }.

Я бы не стал так быстро обвинять учебный ресурс. Новичку не составит труда перепутать, когда использовать точку с запятой с функциями.

Christian Gibbons 09.04.2019 18:16

@TheRealFawcett Вы также ставите ненужные точки с запятой после закрывающей скобки ваших циклов for и оператора switch. Это также не обязательно, и это не дает мне большой уверенности в знании C вашим лектором.

Blastfurnace 09.04.2019 18:18

Я думаю, что исправил это, но я все еще получаю ту же ошибку?

TheRealFawcett 09.04.2019 18:22

@TheRealFawcett У вас есть другие ошибки, которые я добавил в свой ответ.

Blastfurnace 09.04.2019 18:28

@Blastfurnace это новая ошибка, которую я получаю после всех изменений, но когда я делаю то, что говорит мне компилятор, я получаю более 20 новых ошибок TheRealFawcett:Wordsearch therealfawcett$ gcc -o Wordsearch1 Wordsearch1.c Wordsearch1.c:173:1: ожидаемый идентификатор или '(' { ^ 1 ошибка. TheRealFawcett:Wordsearch therealfawcett$

TheRealFawcett 09.04.2019 18:32

@TheRealFawcett Вот ваш код в Compiler Explorer. Я добавил недостающий { в начале main() и догадался, где недостающий } находится в fillWordsearch() (строка 152). Он компилируется, но все еще имеет много предупреждений.

Blastfurnace 09.04.2019 18:38

@Blastfurnace Я уже исправил все ошибки, но спасибо за ваше время. моя проблема сейчас в том, что когда категория выбрана, программа просто вечно что-то делает, если она вообще что-то делает (я не знаю, я все еще жду)

TheRealFawcett 09.04.2019 18:47

@TheRealFawcett Если вы не можете легко найти логическую ошибку, мой лучший совет — выполнить программу с помощью отладчика. Это поможет вам увидеть значения переменных во время выполнения и, возможно, увидеть, где логика не соответствует вашим намерениям.

Blastfurnace 09.04.2019 18:56

@Blastfurnace я пропустил свой код через отладчик, и вот что я получил - Ошибка выполнения #stdin #stdout 0s 9432KB что это значит?

TheRealFawcett 09.04.2019 19:10

Другие вопросы по теме