Как устранить ошибки объявления - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь запустить код, который занимает введенное пользователем стандартное время и переводит его в военное время.Для пользовательского ввода часы можно вводить в виде одной или двух цифр, а AM / PM можно вводить любым способом.Учитывая это, мой код выглядит следующим образом:

#include <iostream>
#include <string>

using namespace std;

string time, hour, minute, amPm, miltime;

char amPmCheck;

int main()
{

    cout<<"Enter time:\n";

    cin>>time;

    colon = time.find(':');

    space = time.find (' ');

    hour = time.substr(0, colon);

    minute = time.substr(colon + 1, space);

    amPm = time.substr(space, back);

    amPmCheck = amPm[0];

    timeConversion(hour, minute, amPmCheck);

    return 0;
}


void timeConversion(hour, minute, amPmCheck)
{
    if(amPmCheck == 'a'||'A')
    {
        if(int(hour) == 12)
        {
            hour.assign('00');
        }
        else if (int(hour) <= 9)
        {
            hour.insert(0, '0');
        }
    }
    else
        if(int(hour) < 12)
        {
            hour.assign(12+int(hour));
        }

    miltime = hour + minute

    cout<< "Corresponding military time is", miltime;
}

Однако при попытке скомпилировать код я получаю следующие ошибки от выбранного мной компилятора:

main.cpp:50:25: warning: multi-character character constant [-Wmultichar]
             hour.assign('00');
                         ^~~~
main.cpp:15:8: error: 'std::string time' redeclared as different kind of symbol
 string time, hour, minute, amPm miltime;
        ^~~~
In file included from /usr/include/pthread.h:24:0,
                 from /usr/include/x86_64-linux-gnu/c++/6/bits/gthr-default.h:35,
                 from /usr/include/x86_64-linux-gnu/c++/6/bits/gthr.h:148,
                 from /usr/include/c++/6/ext/atomicity.h:35,
                 from /usr/include/c++/6/bits/ios_base.h:39,
                 from /usr/include/c++/6/ios:42,
                 from /usr/include/c++/6/ostream:38,
                 from /usr/include/c++/6/iostream:39,
                 from main.cpp:10:
/usr/include/time.h:192:15: note: previous declaration 'time_t time(time_t*)'
 extern time_t time (time_t *__timer) __THROW;
               ^~~~
main.cpp:44:21: error: variable or field 'timeConversion' declared void
 void timeConversion(hour, minute, amPmCheck)
                     ^~~~
main.cpp:44:35: error: 'amPmCheck' was not declared in this scope
 void timeConversion(hour, minute, amPmCheck)
                                   ^~~~~~~~~

Я все ещеОтносительно новичок в программировании, поэтому мы будем благодарны за любую информацию о моих ошибках и о том, как проще всего их исправить.

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Для начала нет необходимости объявлять эти переменные как переменные пространства имен.

string time, hour, minute, amPm, miltime;

char amPmCheck;

Они должны быть объявлены как локальные переменные, если функция main.

И нет никаких объявлений переменных colon и space.

Это утверждение

amPm = time.substr(space, back);

не имеет смысла. Переменная amPm объявлена ​​имеющей тип char вместо типа std::string.

Объявление функции

void timeConversion(hour, minute, amPmCheck)

неправильно. Вы не указали типы параметров функции.

Заявления, подобные этому

    if(int(hour) == 12)

не имеет смысла. Вы должны использовать хотя бы стандартную функцию std::stoi для преобразования объекта типа std::string в объект типа int.

В заявлении

hour.assign('00');

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

hour.assign("00");

То же самое верно для выписки

hour.insert(0, '0');

Это утверждение

hour.assign(12+int(hour));

тоже не имеет смысла.

В вашем коде слишком много ошибок.

Сначала вы должны прочитать документацию класса std::basic_string, чтобы узнать, как использовать его nethods.

И не используйте обличительный

using namespace std;

Это может быть причиной ошибки конфликтующих объявлений. Смотрите, например, сообщение об ошибке вашего компилятора

main.cpp:15:8: error: 'std::string time' redeclared as different kind of symbol
 string time, hour, minute, amPm miltime;
        ^~~~
In file included from /usr/include/pthread.h:24:0,
                 from /usr/include/x86_64-linux-gnu/c++/6/bits/gthr-default.h:35,
                 from /usr/include/x86_64-linux-gnu/c++/6/bits/gthr.h:148,
                 from /usr/include/c++/6/ext/atomicity.h:35,
                 from /usr/include/c++/6/bits/ios_base.h:39,
                 from /usr/include/c++/6/ios:42,
                 from /usr/include/c++/6/ostream:38,
                 from /usr/include/c++/6/iostream:39,
                 from main.cpp:10:
/usr/include/time.h:192:15: note: previous declaration 'time_t time(time_t*)'
 extern time_t time (time_t *__timer) __THROW;
               ^~~~

Используйте вместо квалифицированных имен стандартные имена, объявленные в пространстве имен std.

0 голосов
/ 08 мая 2019

Здесь сначала несколько проблем:

  • изменить

void timeConversion(hour, minute, amPmCheck)

на

void timeConversion(string & hour, string & minute, string & amPmCheck)

, если вы хотите работать с параметрами функции

  • или изменить ту же функцию (в вашем случае лучший вариант) на:

void timeConversion()

, поскольку вы все равно имеете дело с глобальными переменными.

  • поставьте timeConversion функцию перед main или используйте предварительное объявление следующим образом:

void timeConversion();

также до функции main.

PS.Пожалуйста, прочитайте хорошую книгу о C ++.

...