Почему это происходит? (Ошибка программирования на C)

#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()
{