На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> E0065. Требуется точка с запятой ";"
    Зравствуйте!
    Подскажите, пожалуйста, почему компилятор требует точку с запятой - ;?
    Прикреплённая картинка
    Прикреплённая картинка
    Сообщение отредактировано: DDim1000 -
      Хм. Серьёзно?
        Это не компилятор требует. Это синтаксис языка того требует. Учите язык, а не методом тыка осваивайте работу компилятора.
          Почему-то тема продублировалась...

          ExpandedWrap disabled
            #include <conio.h>
            #include <iostream>
            #include "time.h"
             
            using namespace std;
             
            int main()
            {
                setlocale(0, "ru");
             
                time t1(4500);
             
                _getch();
                return 0;
            }


          Добавлено
          Цитата macomics @
          Это синтаксис языка того требует.

          Ну и куда нужно поставить точку с запятой?
          [img]https://disk.yandex.ru/i/vqXnEcXI3YsQeA[/img]
          Сообщение отредактировано: DDim1000 -
            DDim1000, покажи содержимое своего файла time.h
              time – это функция:
              ExpandedWrap disabled
                time_t time(time_t *timer);
              Лексически ты просто используешь имя функции, что согласно стандарту языка приводится к указателю на неё. Само по себе это просто выражение, состоящее из использования значения, вроде:
              ExpandedWrap disabled
                int a;
                 
                int main()
                {
                  a;
                  3;
                  12+34;
                }
              что хоть и бессмысленно, но не является ошибкой. (Впрочем, компиляторы могут тут выдать предупреждение о неэффективном коде.) Но следом за ним идёт некое t1(4500), что нарушает грамматику выражения, т.к. между первым операндом и последующим t1 нет никакой операции. Компилятор мог бы поругаться на t1, мол, неизвестный идентификатор, но он не может этого сделать, т.к. смысл токена t1 ему пока неведом как раз из-за того, что нарушена грамматика выражения. Вот он и выдал ошибку на то, что послужило исходной причиной: т.к. за time нет никакой операции, а начало выражения корректно, то следует завершить выражение, что ; и должна бы сделать.

              Добавлено
              P.S. Если копнуть в детали, то вот сравни:
              ExpandedWrap disabled
                 time_t t1(int);                // прототип функции
                 time_t t1(4500);               // определение переменной t1 типа time_t, инициализируемой значением 4500
                 time_t t1 = 4500;              // аналогично предыдущей строке
                 time() + t1(4500);             // вызов time() и сложение результата с вызовом t1 (при условии, что t1 некая функция с одним параметром; в C отсутствие прототипа функции не ошибка)
                 time; t1(4500);                // бессмысленное, но корректное выражение с последующим ещё одним выражением, содержащим вызов t1 (да-да, в C отсутствие прототипа функции не ошибка, в отличие от C++)
                /* итп */
              Вариантов много, так что увидеть "Неверное использование имени функции в выражении" от компилятора нереально, если не дать ему достаточно конкретики.
              Сообщение отредактировано: Qraizer -
                Вот и я подумал про функцию, но решил уточнить. Ибо, если time.h брать как стандартный заголовок, его бы необходимо бы обрамлять угловыми скобками по фэн-шую, а не двойными кавычками. Но и в нем это объявление - функция. А если свой заголовочный файл - должно быть корректное объявление класса time.
                  Цитата Majestio @

                  time.h
                  ExpandedWrap disabled
                    #pragma once
                    #include <iostream>
                     
                    typedef unsigned int ui;
                    class time
                    {
                    private:
                        ui seconds;
                        ui minutes;
                        ui hours;
                    public:
                        time(void);
                        time(ui);
                        time(ui,ui,ui);
                     
                        time::operator+(const time& t) const;
                        void operator<<(std::ostream& os)
                        {
                            os << hours << " : " << " : " << seconds;
                        }
                     
                        ~time(void);
                    };

                  time.cpp.
                  ExpandedWrap disabled
                    #include "time.h"
                     
                    // time:: - указывает на то, что данный метод принадлежит к классу time, и за пределами этого класса данный метод не доступен.
                    // Данный метод называется "конструктор по умолчанию", и он каждый раз вызывается при создании объекта класса.
                     
                    time::time(void)
                    {
                        hours = minutes = seconds = 0;
                    }
                     
                    // time:: - указывает на то, что данный метод принадлежит к классу time, и за пределами этого класса данный метод не доступен
                    // Данный метод называется "явный конструктор", и он каждый раз вызывается при создании объекта класса.
                    time::time(ui sec)
                    {
                        hours = sec / (60 * 60);
                        minutes = sec % (60 * 60) / 60;
                        seconds = sec % (60 * 60) % 60;
                    }
                     
                    time::time(ui h, ui m, ui s)
                    {
                        if (h > 24 || m > 60 || s > 60)
                        {
                            time::time();
                            return;
                        }
                     
                        hours = h;
                        minutes = m;
                        seconds = s;
                    }
                     
                    time time::operator+(const time& t) const
                    {
                        time result;
                        result.seconds = (seconds+t.seconds)%60;
                        result.minutes = (minutes + t.minutes(seconds + t.seconds) / 60)%60;
                        result.hours = (hours + t.minutes(minutes + t.minutes) / 60);
                     
                        return result;
                    }
                     
                    // time:: - указывает на то, что данный метод принадлежит к классу time, и за пределами этого класса данный метод не доступен
                    // Данный метод называется "деструктор", и он вызывается когда удаляется бъекта класса.
                    time::~time(void)
                    {
                     
                    };

                  Source.cpp
                  ExpandedWrap disabled
                    #include <conio.h>
                    #include <iostream>
                    #include "time.h"
                     
                    using namespace std;
                     
                    int main(int argc, char** argv)
                    {
                        setlocale(0, "ru");
                     
                        time t1(4500);
                        time t2(2, 35, 21);
                        time t3;
                     
                        t3 << cout;
                     
                        _getch();
                        return 0;
                    }
                    Тэкссс.... А давай-ка присоедини весть свой проект в виде архива...
                      Цитата Majestio @
                      Тэкссс.... А давай-ка присоедини весть свой проект в виде архива...

                      Вот, пожалуйста. Прекрепляю проект и видеоурок, по которому пишу код.
                      https://disk.yandex.ru/d/C1_ktdLcDo0ulQ
                      Сообщение отредактировано: DDim1000 -
                        В коде настолько много ошибок, что у меня просто нет времени. Сорри.

                        По теме. Это ничего не меняет в сказанном мною. Функция
                        ExpandedWrap disabled
                          time_t time(time_t *timer);
                        остаётся быть частью языка, и отсутствие явного <time.h> ничего не меняет. Стандарт не требует от реализаций Стандартной библиотеки (за очень малым исключением) каких-либо чётких правил включения одних заголовков в другие. Т.е. невключение <time.h> в программу не означает, что такого включения не будет внутри iostream или conio.h, и походу именно это и происходит.

                        Добавлено
                        P.S. Исправить Закостылить код легко, достаточно добавить class ко всем time в коде. Типа:
                        ExpandedWrap disabled
                          #include <conio.h>
                          #include <iostream>
                          #include "time.h"
                           
                          using namespace std;
                           
                          int main(int argc, char** argv)
                          {
                              setlocale(0, "ru");
                           
                              class time t1(4500);
                              class time t2(2, 35, 21);
                              class time t3;
                           
                              t3 << cout;
                           
                              _getch();
                              return 0;
                          }
                        Это заставит компилятор искать time исключительно внутри пространства имён классов (злое наследие C с его пространствами имён структур, объединений и перечислений, да) и игнорировать глобальное. Но это не Плюсовый метод. Плюсовый – не использовать имена из Стандартной библиотеки иначе как это определяется Стандартной библиотекой, не называть свои заголовки интерфейсов сообразно заголовкам Стандартной библиотеки, заключать свои интерфейсы в Плюсовые пространства имён, не использовать глобально using namespace.
                        Сообщение отредактировано: Qraizer -
                          Qraizer, я не поленился =)

                          DDim1000, лови подправленные файлы. Но как сказал Qraizer, ошибок over-многовато :yes: Тут уж разбирайся сам - мне лениво. Я просто сделал код работающим.

                          main.cpp

                          ExpandedWrap disabled
                            #include <conio.h>
                            #include <iostream>
                            #include "time.h"
                             
                            using namespace std;
                             
                            int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv) {
                              setlocale(0, "ru");
                              time t1(4500);
                              time t2(2, 35, 21);
                              std::cout << t2;
                              _getch();
                              return 0;
                            }

                          time.h

                          ExpandedWrap disabled
                            #ifndef TIME_H
                            #define TIME_H
                             
                            #include <iostream>
                             
                            typedef unsigned int ui;
                             
                            class time {
                              private:
                                ui seconds;
                                ui minutes;
                                ui hours;
                              public:
                                time(void);
                                time(ui);
                                time(ui, ui, ui);
                             
                                friend std::ostream& operator<<(std::ostream& os, const time& t);
                                time operator+(const time& t) const;
                                ~time(void);
                            };
                             
                            #endif // TIME_H

                          time.cpp

                          ExpandedWrap disabled
                            #include "time.h"
                             
                            time::time(void) {
                              hours = minutes = seconds = 0;
                            }
                             
                            time::time(ui sec) {
                              hours = sec / (60 * 60);
                              minutes = sec % (60 * 60) / 60;
                              seconds = sec % (60 * 60) % 60;
                            }
                             
                            time::time(ui h, ui m, ui s) : time() {
                              if (h <= 24 && m <= 60 && s <= 60) {
                                hours = h;
                                minutes = m;
                                seconds = s;
                              }
                            }
                             
                            time time::operator+(const time& t) const {
                              time result;
                              unsigned int totalSeconds = seconds + t.seconds;
                              unsigned int carryMinutes = totalSeconds / 60;
                              result.seconds = totalSeconds % 60;
                              unsigned int totalMinutes = minutes + t.minutes + carryMinutes;
                              unsigned int carryHours = totalMinutes / 60;
                              result.minutes = totalMinutes % 60;
                              result.hours = (hours + t.hours + carryHours) % 24;
                              return result;
                            }
                             
                            std::ostream& operator<<(std::ostream& os, const time& t) {
                                os << t.hours << " : " << t.minutes << " : " << t.seconds;
                                return os;
                            }
                             
                            time::~time(void) {}


                          Спойлер has been censored
                          Сообщение отредактировано: Qraizer -
                            DDim1000, краем одного глаза глянул урок. Гм. Я бы настоятельно предостерёг от таких уроков. Автор по ходу программировать по LLM учился. И дело даже не в C++.
                            Вот буквально сразу же. Цитата из Стандарта C:
                            Цитата
                            If a file with the same name as one of the above < and > delimited sequences, not provided as part of the implementation, is placed in any of the standard places for a source file to be included, the behavior is undefined.
                            Назвав свой заголовок time.h, он уже грубо нарушил правила. Второе грубейшее нарушение:
                            Цитата
                            ...If the program defines an external identifier with the same name as a reserved external identifier, even in a semantically equivalent form, the behavior is undefined.
                            Нельзя было называть свою сущность как time, потому что это самый настоящий external identifier with the same name as a reserved external identifier. Больше комментировать не буду, у меня нет столько времени.
                            Сообщение отредактировано: Qraizer -
                              Попробую по-быстрому отметить баги. За разъяснениями, если надо, спрашивай конкретно, конкретизирую.
                              ExpandedWrap disabled
                                #pragma once                                            // нестандартное решение, но поддерживаемое много где, т.ч. формально допустимое
                                #include <iostream>                                     // избыточно, достаточно ostream
                                 
                                typedef unsigned int ui;
                                class time                                              // уже сказал; очень плохое имя класса
                                {
                                private:
                                    ui seconds;
                                    ui minutes;
                                    ui hours;
                                public:
                                    time(void);                                         // void в C++ избыточно, но не ошибка
                                    time(ui);                                           // конструктор с одним параметром в большинстве случаев должен быть explicit
                                    time(ui,ui,ui);
                                 
                                    time::operator+(const time& t) const;               // не скомпилится; тут :: явная ошибка, должен быть просто пробел; кроме того, иметь подобные операторы элементами классов, вообще говоря, не следует,
                                                                                        // лучше их делать свободными функциями; для демонстрационного примера сойдёт, но в продакшне использовать не надо
                                    void operator<<(std::ostream& os)                   // аналогично; кроме того, тут грубо (и не очень тоже) нарушены правила интерфейса iostream; так же следует заметить, этот метод будет inline
                                    {                                                   // и вообще, тут достаточно объявления, и значит и вместо <ostream> было бы достаточно <iosfwd>
                                        os << hours << " : " << " : " << seconds;       // пропущен вывод minutes
                                    }
                                 
                                    ~time(void);                                        // деструктор для этого класса избыточен;
                                };


                              Добавлено
                              ExpandedWrap disabled
                                #include "time.h"
                                 
                                // time:: - указывает на то, что данный метод принадлежит к классу time, и за пределами этого класса данный метод не доступен.
                                // Данный метод называется "конструктор по умолчанию", и он каждый раз вызывается при создании объекта класса.
                                 
                                time::time(void)
                                {
                                    hours = minutes = seconds = 0;
                                }
                                 
                                // time:: - указывает на то, что данный метод принадлежит к классу time, и за пределами этого класса данный метод не доступен
                                // Данный метод называется "явный конструктор", и он каждый раз вызывается при создании объекта класса.
                                time::time(ui sec)
                                {
                                    hours = sec / (60 * 60);
                                    minutes = sec % (60 * 60) / 60;
                                    seconds = sec % (60 * 60) % 60;
                                }
                                 
                                time::time(ui h, ui m, ui s)
                                {
                                    if (h > 24 || m > 60 || s > 60)
                                    {
                                        time::time();                                   // это точно делает не то, что хотелось; тут создаётся новый временный объект и сразу же уничтожается, текущий же остаётся неинициализированным
                                        return;                                         // если хотелось вызвать конструктор существующего объекта, то надо было this->time::time(), но это плохо
                                    }                                                   // в таких случаях делается отдельный, обычно приватный, метод и зовётся из конструкторов
                                 
                                    hours = h;
                                    minutes = m;
                                    seconds = s;
                                }
                                 
                                time time::operator+(const time& t) const
                                {
                                    time result;
                                    result.seconds = (seconds+t.seconds)%60;
                                    result.minutes = (minutes + t.minutes(seconds + t.seconds) / 60)%60;        // тут явно пропущены сложения
                                    result.hours = (hours + t.minutes(minutes + t.minutes) / 60);               // надо бы + между minutes и (
                                 
                                    return result;
                                }
                                 
                                // time:: - указывает на то, что данный метод принадлежит к классу time, и за пределами этого класса данный метод не доступен
                                // Данный метод называется "деструктор", и он вызывается когда удаляется бъекта класса.
                                time::~time(void)
                                {
                                 
                                };


                              Добавлено
                              ExpandedWrap disabled
                                #include <conio.h>
                                #include <iostream>
                                #include "time.h"
                                 
                                using namespace std;
                                 
                                int main(int argc, char** argv)                 // аргументы main не используются и потому избыточны; Стандарт разрешает main без аргументов
                                {                                               // с ними же, но без использования, компиляторы могут ругаться предупреждениями
                                    setlocale(0, "ru");                         // вызов абсолютно бесполезен, он ничего не меняет в системе; поменял бы вызов LC_ALL вместо 0,
                                                                                // но не для уже сконструированного (и других тоже) std::cout; для него нужен был бы std::cout.imbue(std::locale("ru"));
                                    time t1(4500);
                                    time t2(2, 35, 21);
                                    time t3;
                                 
                                    t3 << cout;
                                 
                                    _getch();
                                    return 0;                                   // для main() – и только для main() – return 0 необязателен, т.к. подразумевается
                                }                                               // но только 0! другие, если нужны, должны быть явными; это однако не ошибка, просто для информации
                              Сообщение отредактировано: Qraizer -
                                Приведеденный мной код работает! Всего одно слово дописал. Угадайте, какое и куда?))
                                ExpandedWrap disabled
                                  time time::operator+(const time& t) const
                                  {
                                      time result;
                                      result.seconds = (seconds+t.seconds)%60;
                                      result.minutes = (minutes + t.minutes+(seconds + t.seconds) / 60)%60;
                                      result.hours = (hours + t.minutes+(minutes + t.minutes) / 60);
                                   
                                      return result;
                                  }
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0590 ]   [ 17 queries used ]   [ Generated: 16.06.25, 09:50 GMT ]