Как исправить ошибку: error expected expression before

859
19 декабря 2016, 19:59
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
//односвязный список
typedef struct gms_t
{
    int data;   //дата
    int temp_vozducha;  //температура воздуха
    int temp_vodi;  //температура воды
    int atm_davl;   //атмосферное давление
    struct gms_t* next    //указатель на следующий элемент
}gms;
typedef gms* pelem; //тип-указатель
pelem HEAD = NULL; //"голова" списка
int NN = 0; //текущее количество элементов
int N_MAX = 10; //максимум списка
int main()
{
    int menu;
        puts("\n Menu :");
        puts("\n1) Dobavlenie elementa.");
        puts("\n2) Redaktirovanie.");
        puts("\n3) Udalenie elementa.");
        puts("\n4) Sortirovka po polju temperatura vozduha.");
        puts("\n5) Vyvod vseh dannyh.");
        puts("\n6) Formirovanie spiska jelementov s temperaturoj vody nizhe zadanogo znachenija.");
        puts("\n7) Vyvod daty s maksimal'noj temperaturoj vozduha i vody.");
        puts("\n8) Formirovanie spiska jelementov s atmosfernym davleniem vyshe 760 mm rt.st..");
        puts("\n0) THE END");
    do
    {
            printf("\nVvedite nomer zadachi : ");
            scanf("%d",&menu);
    switch(menu)
        {
      case 1 : ad();break;
      case 2 : ed(pelem p); break;
      case 3 : del(char obj_data[]); break;
      case 4 : sort(); break;
      case 5 : rd(pelem p); break;
    default:
             if (menu!=0)
                  puts("\n\n \t\tVveden nepravil'nyj nomer zadachi!");        }    }
 while (menu!=0);
        puts("\n ********THE END******** \n");
    return 0;
}
pelem ad() //добавление элемента
{
   pelem neo = (pelem) malloc(sizeof(gms));
   //добавление элемента в начало
   if (HEAD == NULL)
   {
      HEAD = neo;
      neo->next = NULL;
   }
   else
   {
      neo->next = HEAD;
      HEAD = neo;
   }
   NN++;
   if (NN < N_MAX)
         {
            pelem p = ad();
            ed(p);
         }
         else
         {
            printf("List is full\n");
         }
   return neo;
}
void ed(pelem p) //редактирование элемента
{
   pelem ad();
   //ввод данных
   gms dan;
   printf("Data: ");
   scanf("%d", &dan.data);
   printf("Temperatura vodi: ");
   scanf("%d", &dan.temp_vodi);
   printf("Temperatura vozducha: ");
   scanf("%d", &dan.temp_vozducha);
   printf("Atmosphere davlenie : ");
   scanf("%d", &dan.atm_davl);
   dan.next = p->next;
   *p = dan;
   system("cls");
   char obj[40];
         printf("Edit object : ");
         scanf("%s", obj);
         if (HEAD)
         {
            pelem p = find(obj);
            if (p)
            {
               ed(p);
            }
         }
         else
         {
            printf("List is empty\n");
         }
}
void rd(pelem p)  //чтение элемента
{
   int i;
   if (p)
   {
      for (i = 0; i < 80; i++)
      {
         printf("_");
      }
      printf("\n");
      printf("Data: %d\n", p->data);
      printf("Temperatura vodi: %d\n", p->temp_vodi);
      printf("Temperatura vozducha: %d\n", p->temp_vozducha);
      printf("Atmosphere davlenie: %d\n", p->atm_davl);
      for (i = 0; i < 80; i++)
      {
         printf("_");
      }
      printf("\n");
      pelem p = HEAD;
         if (p == NULL)
         {
            printf("List is empty\n");
         }
         else
            while (p != NULL)
            {
               rd(p);
               p = p->next;
            }
   }
}
pelem find(char obj_data[])  //поиск элемента
{
   pelem p = HEAD;
   do
   {
      if (!strcmp(p->data, obj_data))
      {
         return p;
      }
      p = p->next;
   }
   while (p);
   printf("Ne naydenu\n");
   return p;
}
void del(char obj_data[])
{
   if (HEAD)
   {
      pelem p = find(obj_data);
      if (p)
      {
         if (p == HEAD) //если голова - и есть искомый объект
         {
            if (NN > 1)
            {
               HEAD = HEAD->next;
            }
            else
            {
               HEAD = NULL;
            }
         }
         else
         {
            pelem father = HEAD;
            while (father->next != p)
            {
               father = father->next;
            }
            father->next = p->next;
         }
         free(p);
         NN--;
         printf("Udaleno: %s\n", obj_data);
         char obj[40];
         printf("Delete item : ");
         scanf("%s", obj);
         if (HEAD)
         {
            del(obj);
         }
         else
         {
            printf("List is empty\n");
         }
         return;
      }
   }
}
void sort()  //сортировка
{
   int j;
   for (j = 0; j < NN; j++)
   {
      pelem p = HEAD;
      pelem son = p->next;
      if (p->temp_vozducha < son->temp_vozducha)
      {
         p->next = son->next;
         HEAD = son;
         son->next = p;
      }
      p = HEAD;
      while ((p->next)->next)
      {
         pelem father = p;
         p = p->next;
         pelem son = p->next;
         if (p->temp_vozducha < son->temp_vozducha)
         {
            father->next = son;
            p->next = son->next;
            son->next = p;
         }
         p = father->next;
      }
      sort();
         pelem p = HEAD;
         if (p == NULL)
         {
            printf("List is empty\n");
         }
         else
            while (p != NULL)
            {
               rd(p);
               p = p->next;
            }
      }
   }
   while (c != '0');
   }
}
/*int main()
{
   char c;
   do
   {
      printf("Menu\n"
             "Count: %d/%d\n"
             "[1] add\n"
             "[2] list\n"
             "[3] edit\n"
             "[4] delete\n"
             "[5] sort\n"
             "[0] exit\n"
             ">>", NN, N_MAX);
      c = getch();
      system("cls");
      if (c == '1') //добавление элемента
      {
         if (NN < N_MAX)
         {
            pelem p = ad();
            ed(p);
         }
         else
         {
            printf("List is full\n");
         }
      }
      if (c == '2') //просмотр списка
      {
         pelem p = HEAD;
         if (p == NULL)
         {
            printf("List is empty\n");
         }
         else
            while (p != NULL)
            {
               rd(p);
               p = p->next;
            }
      }
      if (c == '3')
      {
         char obj[40];
         printf("Edit object : ");
         scanf("%s", obj);
         if (HEAD)
         {
            pelem p = find(obj);
            if (p)
            {
               ed(p);
            }
         }
         else
         {
            printf("List is empty\n");
         }
      }
      if (c == '4')
      {
         char obj[40];
         printf("Delete item : ");
         scanf("%s", obj);
         if (HEAD)
         {
            del(obj);
         }
         else
         {
            printf("List is empty\n");
         }
      }
      if (c == '5')
      {
         sort();
         pelem p = HEAD;
         if (p == NULL)
         {
            printf("List is empty\n");
         }
         else
            while (p != NULL)
            {
               rd(p);
               p = p->next;
            }
      }
   }
   while (c != '0');
   return 0;
}*/
Answer 1

Не обломался и вчитался :)

Учитесь читать то, что вам пишет компилятор. Первая же строка:

main.cpp(15) : error C2143: syntax error : missing ';' before '}'
//...

говорит о том, что на строке 15 не хватает ; перед }. Посмотрим:

//...
    struct gms_t* next    //указатель на следующий элемент
}gms;
//...

Действительно, не хватает. Исправляем (после next поставьте ;), снова компилируем. Следующая ошибка:

main.cpp(41) : error C3861: 'ad': identifier not found

Компилятор не знает, что такое ad. Смотрю на код. Оказывается, это функция, но она определена ниже, чем используется. Тут есть 2 варианта:

  1. переместить определение функции ad() до функции, откуда ad() вызывается (это main()).
  2. Оставить все определения функций на своих местах. Добавить объявление функции ad() до вызова.

Пойдем по второму пути. Заодно объявим другие функции, которые будут вызваны выше, чем определены:

// объявления функций
pelem ad();
void ed(pelem p);
void del(char obj_data[]);
void sort();
void rd(pelem p);
int main()
{
//...

Следующая ошибка:

main.cpp(49) : error C2275: 'pelem' : illegal use of this type as an expression

Посмотрите на 49-ю строку:

  case 2 : ed(pelem p); break;

Зачем тут тип pelem? Типичная ошибка программирования методом copy-paste. Исправляем это и такую же ошибку на 50й и 52й строках:

  case 1 : ad();break;
  case 2 : ed(p); break;
  case 3 : del(obj_data); break;
  case 4 : sort(); break;
  case 5 : rd(p); break;

Дальше.

main.cpp(49) : error C2065: 'p' : undeclared identifier

Наверное, название переменной p тоже осталось после copy-paste. Судя по коду функции ed(pelem p), Вы планируете изменить элемент списка. Но какой? Сперва пытаетесь вызывать функцию ad(), но делаете это неправильно.

void ed(pelem p) //редактирование элемента
{
pelem ad();

Тип возвращаемого значения тут уже не нужен. А то, что функция возвращает, вы не используете.

Дальше читаю код:

pelem ad() //добавление элемента
{
   pelem neo = (pelem) malloc(sizeof(gms));

И тут пламенный порыв помочь новичку угасает навсегда. Срочно бегите к семинаристу, посыпайте голову пеплом, и признайтесь ему, что не понимаете синтаксиса языка C++, не знаете, как работает malloc. Попросите дополнительно позаниматься с Вами!!!

READ ALSO
Немного запутался с вложенными циклами

Немного запутался с вложенными циклами

map[0][j] - сюда я пытаюсь вывести каждую цифру в 1й строчке в каждый отдельный столбик цифры должны выводиться от нуля до 9, но почему то не получаетсяесли...

338
Ftp клиент

Ftp клиент

Делаю лабораторную "ftp client" , когда посылаю серверу "LIST" , в массив приходит список папок и фалов ввиде : drwxrwxrwx 1 user group 11 May 10 23:12 !! Папка1drwxrwxrwx 1 user group 22 May 10 12:11 !! Песня1

359
Выполнение системой событий qt

Выполнение системой событий qt

пишу клиент серверное приложение на qt - программа удаленного доступа к компьютеруПодскажите, в каком виде отсылать события, совершенные...

299
Рисование плавной линии

Рисование плавной линии

Отрисовываемая линия выходит угловатой если рисовать слишком быстроКак осуществить сглаживание на лету, чтобы линия была более естественной?

323