Cin не является однозначным ошибка c

Программа по вычислениям полностью устраивает, она перемножает 2 матрицы указанного размера с рандомными числами, она запускается и правильно считает, но показывает, что есть ошибки типа: c...

Программа по вычислениям полностью устраивает, она перемножает 2 матрицы указанного размера с рандомными числами, она запускается и правильно считает, но показывает, что есть ошибки типа: cin, cout, system не являются однозначными, всего 17 ошибок, подчеркивает красным эти операторы, как это убрать?

#include <iostream>
#include <ctime>
#include <iomanip>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int** P1, ** P2, ** P3, n, m;
cout << "Введите кол-во строк матрицы: ";
cin >> n;
cout << "Введите кол-во столбцов матрицы: ";
cin >> m;
P1 = new int* [n];
for (int i = 0; i < n; i++)
    P1[i] = new int[m];
srand(time(0));
for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)  //рандом 1 матрицы
        P1[i][j] = rand() % 10;
for (int i = 0; i < n; i++)
{
    cout << endl;                  //вывод 1 матрицы
    for (int j = 0; j < m; j++)
    {
        cout << setw(3) << P1[i][j] << "t";
    }
}
cout << endl;
int k;
cout << "Введите кол-во столбцов 2 матрицы: ";
cin >> k;
P2 = new int* [k];
for (int i = 0; i < m; i++)
    P2[i] = new int[k];
for (int i = 0; i < m; i++)
    for (int j = 0; j < k; j++)  //рандом 2 матрицы
        P2[i][j] = rand() % 10;
for (int i = 0; i < m; i++)
{
    cout << endl;                  //вывод 2 матрицы
    for (int j = 0; j < k; j++)
    {
        cout << setw(3) << P2[i][j] << "t";
    }
}
cout << endl;
P3 = new int* [n];
for (int i = 0; i < n; i++)
    P3[i] = new int[k];
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < k; j++)  //умножение матриц
    {
        P3[i][j] = 0;
        for (int z = 0; z < m; z++)
            P3[i][j] = P3[i][j] + P1[i][z] * P2[z][j];
    }
}
cout << endl << "Результат умножения:" << endl;
for (int i = 0; i < n; i++)                     //вывод результата 
 умножения
{
    cout << endl;
    for (int j = 0; j < k; j++)
        cout << setw(3) << P3[i][j] << "t";
}
cout << endl;
for (int i = 0; i < n; i++)
    delete[] P1[i];
delete[] P1;
for (int i = 0; i < m; i++)
    delete[] P2[i];
delete[] P2;
for (int i = 0; i < n; i++)
    delete[] P3 [i];
delete[] P3;
system("pause");
return 0;
}

Surges

2 / 2 / 0

Регистрация: 04.06.2013

Сообщений: 44

1

Ошибка при объявлении глобальной переменной: «Переменная не является однозначной»

01.11.2013, 23:30. Показов 64852. Ответов 2

Метки нет (Все метки)


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <conio.h>
#include <ctime>
 
    int sec(0);
    int min(0);
    int chas(0);
    int B = 1;
    int sok;
 
void how2timer(int ms) {
    int CLOCKS_PER_MSEC = CLOCKS_PER_SEC / 1000;   // новая константа
    clock_t end_time = clock() + ms * CLOCKS_PER_MSEC ;  // время завершения
    while (clock() < end_time) {}  // цикл ожидания времени
}
 
using namespace std;
int main()
{
    setlocale(LC_ALL, "Russian");
    
    cout << "nttt***Таймер выключения компьютера***nnttttttttversion 0.2";
    cout << "nnnnttПомощь:n1 час   = 60 минут.n2 часа  = 120 минут.n3 часа  = 180 минут.n4 часа  = 240 минут.n5 часов = 300 минут.n6 часов = 360 минут.n7 часов = 420 минут.n8 часов = 480 минут.";
    cout << "nntТаймер на сколько минут? : ";
    cin >> min(); // Здесь он пишет про... однозначность.
    system("cls");
    cout << "nntПробный режим? Или обычный? (1 or 2): ";
    while (!(cin >> sok) || sok >= 3 || sok <= 0)
    {
        cin.clear();
        while(cin.get() != 'n');
        system("color c0");
        cout << "tnЭто таймер, а не зрелище на смерть консоли. Введите заново Ваш выбор. ";
        how2timer(2000);
        system("color 7");
        cout << "nntПробный режим? Или обычный? (1 or 2): ";
    }
    vibor1();
    vibor2();
    getch();
    return 0;
}

Создал я значит глобальную переменную min. Но подчеркивает красной волнистой линией переменную min в main. Ошибку обосновывает «min не является однозначной».
Может кто-нибудь расшифровать?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



1



Don’t worry, be happy

17781 / 10545 / 2036

Регистрация: 27.09.2012

Сообщений: 26,516

Записей в блоге: 1

01.11.2013, 23:35

2

Либо переименуйте, либо уберите using namespace std, иначе пересечение имен с std::min



4



shuraros1

1 / 1 / 0

Регистрация: 19.06.2018

Сообщений: 173

31.10.2018, 13:44

3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdafx.h"
#include <iostream>
#include "cmath"
#include <string>
#include <array>
 
int main()
{
    char * ps = new char;
    char l[] = "done";
    do {
        std::cin.getline(ps,100);
    }while (strcmp(l, ps) != 0);
    std::system("pause");
    return 0;  
}

Добавлено через 27 секунд
если я напишу done не в начале строки,то программа идёт дальше. Как исправить?



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

31.10.2018, 13:44

3

Содержание

  1. Cin не является однозначным
  2. Решение
  3. Объект класса string не является однозначным
  4. Решение
  5. Ошибка «переменная не является однозначной»
  6. Как исправить ошибку «cout не является однозначным»?
  7. Поточный ввод-вывод в C++
  8. Ввод информации
  9. Манипуляторы потока

Cin не является однозначным

Позвольте мне предвосхитить это, сказав, что я включил (также относится к string, endl, и буквально все не работает); моя IDE не показывает ошибок, насколько синтаксис идет; и я не могу понять, почему эта проблема происходит? Он отлично работает в одном из моих других примеров кода C ++, которые я написал.

Поэтому я пытаюсь сделать небольшую игру, быков и коров. Мой основной код выглядит следующим образом:

Наконец, мой файл BullsAndCows.cpp:

Ошибки, которые я получаю, так как «cout не является членом std», символ cout не может использоваться в объявлении использования. До этого я использовал «использование пространства имен std», и это возвращало бы ошибки, такие как «BullsAndCows» не является пространством имен или классом (если это не класс, то я должен быть марсианином). Также кое-что о пропавшем «;» перед userInput, например, в моем коде main.cpp; что не имеет смысла, так как нет ничего, что не хватает этого. Я использую VS2017. Почему C ++ такой раздражающий язык для работы?

Решение

прежде чем любые другие включают директивы.

Автор Јляп Шляпович задал вопрос в разделе Другие языки и технологии

Помогите пожалуйста исправить ошибку в коде программы (C++). Был бы благодарен. и получил лучший ответ

Ответ от Valrand()[гуру]
Причина: здесь, возможно, компилятором делается попытка интерпретировать «cout

Двоичное дерево поиска
Задание. Построение и обработка двоичных деревьев поиска. Реализовать программу, выполняющую следующий набор операций с деревьями поиска:

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

Выдает (в VS 2012) следующие ошибки:

Т. Е. он утв-ет что count не является однозначным и не определен

Источник

Объект класса string не является однозначным

Вот ошибка:
Ошибка 1 error C2872: left: неоднозначный символ c:usersмdesktopdocumentsvisual studio 2013projectsмлитамлитаметод вонга.cpp 33 1 МЛиТА

и таких около 100 штук где используется два объекта left and right. Вчера успешно закрыл программу после тестирования пару примеров. Сегодня открыл вот эта жуть.

как узнать,является данный объект класса А1 наследником класса А2
Всем привет)есть классы S, A1, A2, B1, B2. Иерархия наследования следующая S — Является.

Является ли однозначным небаном то,
Вообщем вопрос такого плана — при добавлении сайта в http://webmaster.yandex.ru/add.xml — выдается.

Является ли отображение взаимно-однозначным.
помогите пожалуйста.. не могу решить. является ли отображение множеств натуральных чисел в.

Является ли натуральное число а однозначным.
Определить, является ли натуральное число а однозначным. Заранее спасибо!

_Valera_, я все подробно выложил, или мне код закинуть?

Добавлено через 8 минут

Решение

в том что кто-то не читает ссылки, которые ему дают.

_Valera_, код ведь понятен, логических ошибок нет, в нем. Можешь проверить функцию где я пробелы убираю, вроде и там все правильно. Он останавливается компилить на 13шаге, я помню точно он компилил его раз 10 вчера

Добавлено через 1 минуту
_Valera_, я не понимаю тебя, до сих пор так подключал пространство и ничего подобного не выводил

Добавлено через 2 минуты
_Valera_, ну я понял твои статьи у меня ведь ничего такого нет, я всегда так и работал!

Добавлено через 3 минуты
_Valera_, и все же я не вижу зависимость между названиями

Источник

Ошибка «переменная не является однозначной»

Глобальная или статическая переменная не может иметь тип управляемый «System::String ^»
Привет, такая проблема, необходимо создать объект типа String в программе вот часть кода.

Синтаксическая ошибка: отсутствие «;» перед «)»
не пойму. где тут ошибка. private: System::Void button2_Click(System::Object^ sender.

Ошибка при запуске приложения под Windows XP: «Не является приложением Win32»
Здравствуйте, написал приложение на Visual Studio Express 2013. У меня ОС Windows 7 x64. Работает.

После запуска среды выскакивает окошечко с ошибкой «Unknown error» или «Неизвестная ошибка»
Доброго времени суток. Возникла проблема. После запуска среды выскакивает окошечко с ошибкой.

В общем-то тоже верно))

В общем, проблему с ошибкой компилятора решил. Для тех, кого интересуют подробности:
В строке public ref class MessageFilter : public IMessageFilter нужно было IMessageFilter записать так: System::Windows::Forms::IMessageFilter
Теперь все собирается и запускается, однако (встал новый вопрос) перехват системных сообщений почему-то не происходит((
Причем не ловит именно сообщение WM_DEVICECHANGE (находится в Dbt.h). Сам алгоритм работает верно, проверил на сообщениях нажатия кнопок мыши (по нажатию проверяемых кнопок, мэсседжбоксы выскакивали стабильно).
У кого-нибудь есть мысли, почему обработчик может не видеть и не обрабатывать сообщения из подключенного файла Dbt.h (в частности хотя бы WM_DEVICECHANGE)??

Кто может помочь с данной проблемой? Может кто сталкивался с подобной обработкой сообщений именно под C++ .NET Windows Forms .

Источник

Как исправить ошибку «cout не является однозначным»?

А так же выдает ошибку ‘эта переменная не содержит класс хранения или спецификатор типа’
В чем проблема?(
Подскажите пожаалулйстааа))))

#include
#include
using namespace std;

country();
country(char* aname , double at_winter, double at_spring,double at_summer,double at_autumn);
country(const country& CONTRY);

char* name;
double t_winter, t_spring, t_summer, t_autumn;

class NewCountry : public country <
public:

NewCountry();
NewCountry(char* aname, double at_winter, double at_spring, double at_summer, double at_autumn, int apolusharie);
NewCountry(const NewCountry& COUNTRY);

unsigned short int gpolusharie() < return polusharie; >;
string sReturnpolusharie();

private:
unsigned short int polusharie;
>;

country::country()
<
name = NULL;
t_winter = NULL;
t_spring = NULL;
t_summer = NULL;
t_autumn = NULL;
>;

country::country(char* aname, double at_winter, double at_spring, double at_summer, double at_autumn) :
name(new char[strlen(aname) + 1])
<
strcpy_s(name, strlen(aname) + 1, aname);
t_winter = at_winter;
t_spring = at_spring;
t_summer = at_summer;
t_autumn = at_autumn;
>;

ostream& operator >(istream& In, country& COUNTRY)
<
char TEMP[123];
In >> TEMP >> COUNTRY.t_winter >> COUNTRY.t_spring >> COUNTRY.t_summer >> COUNTRY.t_autumn;
delete[] COUNTRY.name;
COUNTRY.name = new char[strlen(TEMP) + 1];
strcpy_s(COUNTRY.name, strlen(TEMP) + 1, TEMP);
return In;
>;

country& country::operator=(const country& COUNTRY) <
if (this == &COUNTRY) return *this;
delete[] name;
name = new char[strlen(COUNTRY.name) + 1];
strcpy_s(name, strlen(COUNTRY.name) + 1, COUNTRY.name);
name = COUNTRY.name;
t_winter = COUNTRY.t_winter;
t_spring = COUNTRY.t_spring;
t_summer = COUNTRY.t_summer;
t_autumn = COUNTRY.t_autumn;
return *this;
>;

NewCountry::NewCountry() :
country()
<
polusharie = NULL;
>;

NewCountry::NewCountry(char* aname, double at_winter, double at_spring, double at_summer, double at_autumn, int apolusharie) :
country(aname,at_winter, at_spring, at_summer, at_autumn)
<
polusharie = apolusharie;
>;

string NewCountry::sReturnpolusharie() <
if (polusharie == 1) return «северное»;
if (polusharie == 2) return «южное»;
if (polusharie == 3) return «по обе стороны экватора»;
return «. ОШИБКА:данные отсутствуют. «;
>;

ostream& operator >(istream& In, NewCountry& COUNTRY)
<
char TEMP[123];
In >> TEMP >> COUNTRY.t_winter >> COUNTRY.t_spring >> COUNTRY.t_summer >> COUNTRY.t_autumn >> COUNTRY.polusharie;
delete[] COUNTRY.name;
COUNTRY.name = new char[strlen(TEMP) + 1];
strcpy_s(COUNTRY.name, strlen(TEMP) + 1, TEMP);
return In;
>;

NewCountry& NewCountry::operator=(const NewCountry& COUNTRY) <
if (this == &COUNTRY) return *this;
delete[] name;
name = new char[strlen(COUNTRY.name) + 1];
strcpy_s(name, strlen(COUNTRY.name) + 1, COUNTRY.name);
t_winter = COUNTRY.t_winter;
t_spring = COUNTRY.t_spring;
t_summer = COUNTRY.t_summer;
t_autumn = COUNTRY.t_autumn;
polusharie = COUNTRY.polusharie;
return *this;
>;

void main() <
setlocale(LC_ALL, «Russian»);
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int N;
double winter = lol[0].ReturnT_Winter;
double summer = lol[0].ReturnT_Summer;
NewCountry* lol;
cout > N;
lol = new NewCountry[N];
cout > lol[i];
for ( int i = 0; i lol[i].ReturnT_Summer ())
summer = lol[i].ReturnT_Summer();
>
>;
cout Вопрос задан более двух лет назад

  • 2516 просмотров
  • Источник

    Поточный ввод-вывод в C++

    Поточный ввод-вывод в C++ выполняется с помощью функций сторонних библиотек. В С++, как и в С, нет встроенных в язык средств ввода-вывода.

    В С для этих целей используется библиотека stdio.h .
    В С++ разработана новая библиотека ввода-вывода iostream , использующая концепцию объектно-ориентированного программирования:

    Библиотека iostream определяет три стандартных потока:

    • cin стандартный входной поток ( stdin в С)
    • cout стандартный выходной поток ( stdout в С)
    • cerr стандартный поток вывода сообщений об ошибках ( stderr в С)

    Для их использования в Microsoft Visual Studio необходимо прописать строку:

    Для выполнения операций ввода-вывода переопределены две операции поразрядного сдвига:

    • >> получить из входного потока
    • cout

    Возможно многократное назначение потоков:
    cout

    Ввод информации

    При этом из входного потока читается последовательность символов до пробела, затем эта последовательность преобразуется к типу идентификатора, и получаемое значение помещается в идентификатор:

    Возможно многократное назначение потоков:
    cin >> переменная1 >> переменная2 >>. >> переменнаяn;

    При наборе данных на клавиатуре значения для такого оператора должны быть разделены символами (пробел, n, t ).

    Особого внимания заслуживает ввод символьных строк. По умолчанию потоковый ввод cin вводит строку до пробела, символа табуляции или перевода строки.

    Результат выполнения

    Для ввода текста до символа перевода строки используется манипулятор потока getline() :

    Результат выполнения

    Манипуляторы потока

    Функцию — манипулятор потока можно включать в операции помещения в поток и извлечения из потока ( >).

    В С++ имеется ряд манипуляторов. Рассмотрим основные:

    Манипулятор Описание
    endl Помещение в выходной поток символа конца строки ‘n’
    dec Установка основания 10-ой системы счисления
    oct Установка основания 8-ой системы счисления
    hex Установка основания 16-ой системы счисления
    setbase Вывод базовой системы счисления
    width(ширина) Устанавливает ширину поля вывода
    fill(‘символ’) Заполняет пустые знакоместа значением символа
    precision(точность) Устанавливает количество значащих цифр в числе (или после запятой) в зависимости от использования fixed
    fixed Показывает, что установленная точность относится к количеству знаков после запятой
    showpos Показывает знак + для положительных чисел
    scientific Выводит число в экспоненциальной форме
    get() Ожидает ввода символа
    getline(указатель, количество) Ожидает ввода строки символов. Максимальное количество символов ограничено полем количество

    Пример Программа ввода-вывода значения переменной в C++

    Та же программа, написанная на языке Си

    Пример Использование форматированного вывода

    Результат выполнения

    Еще один пример использования форматированного вывода: для t∈[0;3] с шагом 0,5 вычислить значение y=cos(t).

    Результат выполнения

    Источник

    Неоднозначный Синтаксис

    Почему последние две строки в основной функции перед закрывающей скобкой дают ошибку? Почему выражение MYINT() трактуется по-разному в разных контекстах? Любая стандартная ссылка будет полезна.

    5 Ответов

    MYINT() может, в зависимости от контекста, интерпретироваться как выражение типа MYINT или спецификатор типа функции, не принимающий аргументов и возвращающий MYINT . В некоторых ситуациях, когда допустимо выражение или спецификатор типа, это дает неоднозначность; это разрешается путем интерпретации его как спецификатора типа, если это возможно ( EDIT: C++03 8.2/2, если требуется стандартная ссылка).

    sizeof может принимать либо выражение, либо заключенный в скобки спецификатор типа, как это аргумент, давая эту двусмысленность. Таким образом, здесь MYINT() интерпретируется как спецификатор типа; затем вы получаете ошибку, так как sizeof не может быть применен к типу функции.

    EDIT: вы можете исправить ошибку, удалив скобки, чтобы она интерпретировалась как выражение ( sizeof MYINT() ), добавив дополнительные скобки, чтобы она не была допустимым спецификатором типа ( sizeof((MYINT())) ), или изменив ее на правильный тип ( sizeof(MYINT) ).

    cout является однозначным, поэтому ошибки быть не должно, и действительно нет на моем компиляторе. Что такое ошибка, и что такое ваш компилятор?

    Если ваш MINTINT — это typedef int MYINT , то MYINT() -это не функция, а int() , которая является инициализацией по умолчанию, равнозначной int y = 0 или int y = int(0) .

    Ваша вторая строка, т. е. cout компилируется правильно для меня с g++ -Wall -ansi -pedantic по той же причине.

    Но g++ будет жаловаться на sizeof со следующей ошибкой error: invalid application of «sizeof» to a function type , потому что он интерпретирует MYINT() как «a call to a default constructor for int» ( EDIT : это неверно) «a function type returning MYINT which is not allowed» ( EDIT : это правильный ответ, см. Майка). Но это не имеет ничего общего с typedef .

    Редактировать (снова)

    Как сказано в комментарии, строки cout не работают для вас, это потому, что вы, вероятно, забыли include .

    Edit Посмотрите также ответ Майка Сеймура для объяснения двусмысленности с sizeof .

    Почему последние две строки в основной функции перед закрывающей скобкой дают ошибку?

    cout не работает, потому что cout не определен. Как только вы сделаете #include и using std::cout , он будет работать нормально.

    sizeof(MYINT()) действительно не работает, но sizeof(int()) тоже не работает, так что этого следует ожидать. sizeof(MYINT) будет работать просто отлично.

    Почему выражение MYINT() трактуется по-разному в разных контекстах?

    Это не. В каждом случае MYINT() ведет себя точно так же, как int() .

    Я не вижу никакой ошибки для строки cout . Однако я вижу invalid application of ‘sizeof’ to a function type для строки cout . Проблема заключается в () вокруг MYINT() . Стандарт C++ говорит Это О sizeof и о том, как он анализируется:

    Существует неоднозначность синтаксического анализа между sizeof unary-expression и sizeof ( type-id ) . Он решается с помощью более длинного матча. Он анализирует sizeof (MYINT()) как sizeof ( type-id ) , MYINT() -это тип функции, и таким образом вы видите ошибку.

    Похожие вопросы:

    Как исправить эту ошибку? ошибка C2668: ‘std::_Tree :: end’: неоднозначный вызов перегруженной функции Мой код выглядит так: typedef map my_map_t; my_map_t.

    Я создаю новый проект, и я добавляю существующую ссылку на проект и вызываю один класс из существующего. Я получаю ниже ошибку — — — Ошибка c2872: неоднозначный символ

    Я читаю следующий документ о функциональных зависимостях. На странице 5 он описывает неоднозначный тип: Во-первых, пустая функция имеет неоднозначный тип: empty :: Collects e ce ⇒ ce. Под.

    Предположим, у меня есть такой запрос select id, company_id, name, type, number from people as p inner join company c on c.id = p.company_id limit 10 и здесь обе таблицы имеют столбец name, и name.

    У меня есть внутреннее соединение двух таблиц и дисплей. Я попробовал приведенный ниже код. Но он генерирует на ошибке неоднозначный столбец site_name’ SELECT site_name, Mains_Run_Hrs.

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

    Скажи, что у меня есть: @Given(first name is $firstName) @Given(first name is $firstName and last name is $lastName) Следующий шаг будет помечен как неоднозначный: Given first name is John and last.

    Я предоставлю этих двух конструкторов. BigUnsigned(int value) :BigUnsigned(static_cast (value)) < >BigUnsigned(unsigned long long value); Проблема в том, что вызов.

    То, что я часто вижу в интернете, когда тема переворачивается, — это такой синтаксис *(_WORD *)(a1 + 6) = *(_WORD *)(a2 + 2); Я думаю, что этот код от плагина IDA (верно?), но я не могу этого понять.

    NOTICE: этот вопрос не о Java do not have pointers В языке C код identifier1 * identifier2 неоднозначен для двух возможных значений: Если identifier1 является типом, то это может быть объявление.

    C++ для людей

    std::cout

    Часто встречающиеся ошибки стадии компиляции

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

    А если помножить этот факт на незнание английского языка («чего там ему не нравится. ») и слабое владение синтаксисом C++ («хм, а может, тут нужна точка с запятой…»), то проблема принимает масштаб катастрофы.

    Тот факт, что компилятор в силу своих ограниченных возможностей изо всех сил старается объяснить, что конкретно неверно, не спасает ситуацию. Как быть, если гуглить неохота, а спросить не у кого?

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

    В качестве компилятора возьмем g++, который, в частности, может использоваться в среде Code::Blocks. Версия gcc (куда входит g++) для ОС Windows зовется MinGW. По ходу я буду давать аналоги ошибок из лексикона русскоязычной Microsoft Visual C++.

    Итак, частые ошибки:

    undeclared identifier

    doy.cpp: In function ‘int main()’:
    doy.cpp:25: ‘DayOfYear’ undeclared (first use this function)
    doy.cpp:25: (Each undeclared identifier is reported only once for each function it appears in.)
    doy.cpp:25: parse error before ‘;’ token

    2) Смысл
    Использован идентификатор DayOfYear , но компилятор не нашел его объявления. Он не знает, что такое DayOfYear .

    • Вы забыли включить какой-то заголовочный файл ( #include. )
    • Вы где-то ошиблись в написании идентификатора (при объявлении или использовании)
    • Вы вообще забыли, что эту переменную надо объявить

    Попытавшись скомпилировать это в Microsoft Visual C++, вы увидите:

    error C2065: DayOfYear: необъявленный идентификатор

    cout undeclared

    xyz.cpp: In function ‘int main()’:
    xyz.cpp:6: ‘cout’ undeclared (first use this function)
    xyz.cpp:6: (Each undeclared identifier is reported only once for each function it appears in.)

    2) Смысл
    Суперклассика. Без комментариев.

    • Вы забыли включить
    • Вы забыли написать using namespace std;

    jump to case label

    switch.cpp: In function ‘int main()’:
    switch.cpp:14: jump to case label
    switch.cpp:11: crosses initialization of ‘int y’

    2) Смысл
    Смысл туманен

    3) Когда бывает
    Вы попытались объявить и инициализировать переменную (объект, указатель и т.п.) в метке case оператора выбора switch. Правилами C++ это запрещено.

    В Microsoft Visual C++ эта ошибка зовется

    error C2360: пропуск инициализации ‘y’ из-за метки ‘case’

    Выход: заключите операторы этого case’а в фигурные скобки <>.

    multi-line string / unterminated string

    using namespace std;

    вызовет бурную реакцию компилятора:

    string.cpp:7:12: warning: multi-line string literals are deprecated
    string.cpp: In function ‘int main()’:
    string.cpp:7: ‘so’ undeclared (first use this function)
    string.cpp:7: (Each undeclared identifier is reported only once for each function it appears in.)
    string.cpp:7: parse error before ‘Mary’
    string.cpp:8:28: warning: multi-line string literals are deprecated
    string.cpp:8:28: missing terminating » character
    string.cpp:7:12: possible start of unterminated string literal

    2) Смысл
    Компилятор думает, что мы хотим создать строковую константу с содержащимся в ней переносом строки, что-то типа

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

    3) Когда бывает
    Когда не соблюдается правильное количество и положение кавычек в строковых литералах. Надо быть внимательнее.

    Microsoft Visual C++ со свойственной ему детской непосредственностью, отметит, что нельзя делать переносы в строках и возмутится, где точка с запятой:

    error C2001: newline в константе
    error C2146: синтаксическая ошибка: отсутствие «;» перед идентификатором «cout»

    comparison between signed and unsigned integer expressions

    xyz.cpp: In function ‘int main()’:
    xyz.cpp:54: warning: comparison between signed and unsigned integer expressions

    2) Смысл
    Это — предупреждение компилятора, которое говорит о том, что мы пытаемся сравнить (==, и т.д.) целочисленное выражение (может принимать положительные, отрицательные значения и 0) и беззнаковое целочисленное выражение (может быть только положительным, либо 0).

    3) Когда бывает
    Собственно, тогда и бывает. Напомню, что тип int по умолчанию знаковый, а некоторые функции (например, vector::size() ) возвращают unsigned int .
    К примеру, следующий на первый взгляд безобидный код вызовет описываемое предупреждение:

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

    В Microsoft Visual C++ предупреждение выглядит так:

    suggest parentheses around assignment used as truth value

    xyz.cpp: In function `int main()’:
    xyz.cpp:54: warning: suggest parentheses around assignment used as truth value

    2) Смысл
    Тоже классика. Компилятор предполагает (и в 99% случаев прав), что вы по ошибке включили в скобки в качестве условия для if/while/for вместо условного выражения выражение присваивания.

    3) Когда бывает
    Чаще всего — в if ‘ах, когда вместо «==» используется «=»

    if (length = maxLength)

    if (length == maxLength)

    Заминка в том, что это не ошибка, т.к. в скомпилированной программе (если мы проигнорируем предупреждение) выражение присваивания (которое возвращает значение правого аргумента) во всех случаях, кроме тех, когда оно вернет 0 , будет преобразовано к true .

    Обзор средств ввода-вывода в C++

    Приложение, написанное на любом языке программирования, должно взаимодействовать с окружающим миром. Иначе пользы от него не будет. Как правило, такое взаимодействие осуществляется посредством ввода-вывода информации на монитор или в файл. Правда, есть некоторое множество программ, которые не используют файловый или консольный ввод-вывод: это программы, осуществляющие низкоуровневое взаимодействие с аппаратной частью компьютера и периферией (ядро ОС, драйверы и пр.), но это уже экзотика.

    В стандартном C++ существует два основных пути ввода-вывода информации: с помощью потоков, реализованных в STL (Standard Template Library) и посредством традиционной системы ввода-вывода, унаследованной от C. Если копнуть немного глубже, то окажется, что и потоки, и традиционная система ввода-вывода для осуществления необходимых действий используют вызовы операционной системы. И это правильно.

    Дальнейшее изложение не претендует на полноту, но описывает основные принципы использования библиотек. Подробности использования можно посмотреть в многочисленной литературе по C++ и STL, в MSDN и пр.

    Традиционный ввод-вывод

    Для использования традиционного ввода-вывода в духе C, в программу необходимо включить заголовочный файл . (Разумеется, компилятор должен иметь доступ к соответствующей объектной библиотеке для правильной сборки исполняемого файла.)

    Библиотека stdio предоставляет необходимый набор функций для ввода и вывода информации как в текстовом, так и в двоичном представлении. Следует отметить, что в отличие от классической C‑библиотеки, в современных библиотеках имеются более безопасные аналоги «классических» функций. Как правило, они имеют такое же имя, к которому добавлен суффикс _s. Рекомендуется использовать именно эти, безопасные функции.

    Самая Первая Программа с использованием библиотеки stdio выглядит так:

    При запуске консольного приложения неявно открываются три потока: stdin — для ввода с клавиатуры, stdout — для буферизованного вывода на монитор и stderr — для небуферизованного вывода на монитор сообщений об ошибках. Эти три символа определены посредством .

    В stdio для консольного ввода-вывода предусмотрена отдельная группа функций. Однако эти функции, как правило, являются обёртками для аналогичных функций файлового ввода-вывода, для которых аргумент типа FILE задан по умолчанию.

    Самая Первая Программа с использование файлового вывода из библиотеки stdio выглядит так:

    Некоторые популярные функции из stdio:

    Сущность FILE представляет собой структуру, в которой хранится вся информация для управления потоком ввода-вывода.

    Файл открывается функцией fopen(), которой передаются два параметра. Первый параметр определяет имя файла. Второй — определяет режим открытия файла: чтение, запись, произвольный доступ и т.п., а также указание на то, как работать с данными: в текстовом или двоичном режиме. Подробности — см. в документации.

    Пример использования stdio

    Следует отметить, что существует еще одна библиотека, ориентированная исключительно на консольный ввод-вывод — .

    Ввод-вывод с помощью потоков STL

    Для использования объектно-ориентированного консольного ввода-вывода с помощью потоков (stream) STL в программу необходимо включить заголовочный файл , а для файлового ещё и . (Разумеется, компилятор должен иметь доступ к соответствующей объектной библиотеке для правильной сборки исполняемого файла.)

    Самая Первая Программа с использованием потоков STL выглядит так:

    При запуске консольного приложения неявно открываются четыре потока: сin — для ввода с клавиатуры, сout — для буферизованного вывода на монитор, сerr — для небуферизованного вывода на монитор сообщений об ошибках и clog — буферизованный аналог cerr. Эти четыре символа определены посредством .

    Потоки cin, cout и cerr соответствуют потокам stdin, stdout и stderr соответственно.

    Иерархия классов ввода-вывода STL достаточно сложна. Любители тонких ощущений могут найти её описание в литературе. Впрочем, остальных также не минует чаша сия, но только позже, когда потребуются знания чуть повыше того базового уровня, который описывается здесь.

    Для ввода-вывода сначала необходимо создать поток — экземпляр соответствующего класса STL, а затем связать его с файлом. Для потока вывода используется класс ofstream, для потока ввода — ifstream, для потока ввода-вывода — fstream. В каждом из этих классов есть метод open(), который связывает поток с файлом. Проще говоря, открывает файл. Методу передаются два параметра: имя файла и режим открытия файла. Второй параметр представляет собой набор битовых флагов, определяющих режим открытия файла (чтение, запись и пр.) и способ работы с данными (текстовый или двоичный режим). Второй параметр опционален, т.е. имеет значение по умолчанию, соответствующее классу.

    Вышеупомянутые классы имеют также конструкторы, позволяющие открыть файл сразу при создании потока. Параметры этих конструкторов полностью совпадают с параметрами метода open().

    При ошибке открытия файла (в контексте логического выражения) поток получает значение false.

    Файл закрывается методом close(). Этот метод также вызывается при разрушении экземпляров классов потоков.

    Операции чтения и записи в поток, связанный с файлом, осуществляются либо с помощью операторов >, перегруженных для классов потоков ввода-вывода, либо с помощью любых других методов классов потоков ввода-вывода.

    Некоторые наиболее употребляемые методы:

    Пример использования потоков STL

    Взаимодействие потокового и традиционного ввода-вывода

    Апологеты C++ рекомендуют использовать для ввода-вывода только потоки STL и отказаться от использования традиционного ввода-вывода в духе C. Однако, ничто не мешает, по крайней мере пока, использовать традиционную систему ввода-вывода. Более того, предусмотрена специальная функция для синхронизации ввода-вывода, выполненного посредством потоков и посредством старых функций.

    Заключение

    Какой механизм использовать — вопрос предпочтений программиста, если работодателем явно не предписано использование конкретного механизма. В любом случае для физического ввода-вывода используются вызовы операционной системы. Всё остальное — обёртка, набор более или менее удобных функций или классов для взаимодействия с ОС.

    Использование механизма потоков считается более безопасным. Но, как известно, плохую программу можно написать на любом языке программирования. Это также относится и к использованию библиотек. Автор статьи: Череп.

    C++ — Урок 011. Исключения

    Что такое исключение? Это ситуация, которая не предусмотрена стандартным поведением программы. Например, попытка доступа к элементу в классе Vector (который мы разбирали в статье про классы ), который не существует. То есть происходит выход за пределы вектора. В данном случае можно воспользоваться исключениями, чтобы прервать выполнение программы. Это необходимо потому, что

    • Как правило в таких случаях, автор класса Vector не знает, как пользователь захочет использовать его класс, а также не знает в какой программе этот класс будет использоваться.
    • Пользователь класса Vector не может всегда контролировать правильность работы этого класса, поэтому ему нужно сообщить о том, что что-то пошло не так.

    Для разрешения таких ситуация в C++ можно использовать технику исключений.

    Рассмотрим, как написать вызов исключения в случае попытки доступа к элементу по индексу, который не существует в классе Vector.

    Здесь применяется исключение out_of_range. Данное исключение определено в заголовочном файле .

    Оператор throw передаёт контроль обработчику для исключений типа out_of_range в некоторой функции, которая прямо или косвенно вызывает Vector::operator[]() . Для того, чтобы обработать исключения необходимо воспользоваться блоком операторов try catch.

    Инварианты

    Также блоки try catch позволяют производить обработку нескольких различных исключений, что вносит инвариантность в работу механизма исключений C++.

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

    Данный конструктор может выбросить исключение в двух случаях:

    • Если в качестве аргумента size будет передано отрицательное значение
    • Если оператор new не сможет выделить память

    length_error — это стандартный оператор исключений, поскольку библиотека std часто использует данные исключения при своей работе.

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

    Также можно выделить свои собственные исключения.

    Виды исключений

    Все исключения стандартной библиотеки наследуются от std::exception.

    На данный момент существуют следующие виды исключений:

    • logic_error
      • invalid_argument
      • domain_error
      • length_error
      • out_of_range
      • future_error (C++11)
    • runtime_error
      • range_error
      • overflow_error
      • underflow_error
      • system_error (C++11)
        • ios_base::failure (начиная с C++11)
    • bad_typeid
    • bad_cast
    • bad_weak_ptr (C++11)
    • bad_function_call (C++11)
    • bad_alloc
      • bad_array_new_length (C++11)
    • bad_exception
    • ios_base::failure (до C++11)

    std::logic_error

    Исключение определено в заголовочном файле

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

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

    std::invalid_argument

    Исключение определено в заголовочном файле

    Наследован от std::logic_error. Определяет исключение, которое должно быть брошено в случае неправильного аргумента.

    Например, на MSDN приведён пример, когда в объект класса bitset из стандартной библиотеки

    В данном примере передаётся неправильная строка, внутри которой имеется символ ‘b’, который будет ошибочным.

    std::domain_error

    Исключение определено в заголовочном файле

    Наследован от std::logic_error. Определяет исключение, которое должно быть брошено в случае если математическая функция не определена для того аргумента, который ей передаётся, например:

    std::length_error

    Исключение определено в заголовочном файле

    Наследован от std::logic_error. Определяет исключение, которое должно быть броше в том случае, когда осуществляется попытка реализации превышения допустим пределов для объекта. Как это было показано для размера вектора в начале статьи.

    std::out_of_range

    Исключение определено в заголовочном файле

    Наследован от std::logic_error. Определяет исключение, которое должно быть брошено в том случае, когда происходит выход за пределы допустимого диапазона значений объекта. Как это было показано для диапазона значений ветора в начале статьи.

    std::future_error

    Исключение определено в заголовочном файле

    Наследован от std::logic_error. Данное исключение может быть выброшено в том случае, если не удалось выполнить функцию, которая работает в асинхронном режиме и зависит от библиотеки потоков. Это исключение несет код ошибки совместимый с std::error_code .

    std::runtime_error

    Исключение определено в заголовочном файле

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

    std::range_error

    Исключение определено в заголовочном файле

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

    std::overflow_error

    Исключение определено в заголовочном файле

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

    std::underflow_error

    Исключение определено в заголовочном файле

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

    std::system_error

    Исключение определено в заголовочном файле

    std::system_error — это тип исключения, которое вызывается различными функциями стандартной библиотеки (как правило, функции, которые взаимодействуют с операционной системой, например, конструктор std::thread ), при этом исключение имеет соответствующий std::error_code .

    std::ios_base::failure

    Исключение определено в заголовочном файле

    Отвечает за исключения, которые выбрасываются при ошибках функций ввода вывода.

    std::bad_typeid

    Исключение определено в заголовочном файле

    Исключение этого типа возникает, когда оператор typeid применяется к нулевому указателю полиморфного типа.

    std::bad_cast

    Исключение определено в заголовочном файле

    Данное исключение возникает в том случае, когда производится попытка каста объекта в тот тип объекта, который не входит с ним отношения наследования.

    std::bad_weak_ptr

    Исключение определено в заголовочном файле

    std::bad_weak_ptr – тип объекта, генерируемый в качестве исключения конструкторами std::shared_ptr , которые принимают std::weak_ptr в качестве аргумента, когда std::weak_ptr ссылается на уже удаленный объект.

    std::bad_function_call

    Исключение определено в заголовочном файле

    Данное исключение генерируется в том случае, если был вызван метод std::function::operator() объекта std::function , который не получил объекта функции, то есть ему был передан в качестве инициализатора nullptr, например, а объект функции так и не был передан.

    std::bad_alloc

    Исключение определено в заголовочном файле

    Вызывается в том случае, когда не удаётся выделить память.

    std::bad_array_new_length

    Исключение определено в заголовочном файле

    Исключение вызывается в следующих случаях:

    1. Массив имеет отрицательный размер
    2. Общий размер нового массива превысил максимальное значение, определяемое реализацией
    3. Количество элементов инициализации превышает предлагаемое количество инициализирующих элементов

    std::bad_exception

    Исключение определено в заголовочном файле

    std::bad_exception — это тип исключения в C++, которое выполняется в следующих ситуациях:

    1. Если нарушается динамическая спецификация исключений
    2. Если std::exception_ptr хранит копию пойманного исключения, и если конструктор копирования объекта исключения поймал current_exception, тогда генерируется исключение захваченных исключений.

    Рекомендуем хостинг TIMEWEB

    Рекомендуемые статьи по этой тематике

    По статье задано1 вопрос(ов)

    Дополнительные возможности cin и cout в C++

    ЧТО ВНУТРИ iostream.h

    Каждая написанная вами на C++ программа включала заголовочный файл iostream.h. Этот файл содержит определения, позволяющие вашим программам использовать cout для выполнения вывода и cin для выполнения ввода. Более точно, этот файл определяет классы istream и ostream (входной поток и выходной поток), a cin и соut являются переменными (объектами) этих классов. Выберите время, чтобы напечатать файл iostream.h. Он находится в подкаталоге INCLUDE. Определения в этом файле достаточно сложны. Однако если вы пройдете по файлу медленно, то обнаружите, что большинство определений являются просто определениями классов и констант. Внутри файла вы найдете объявления переменных cin и cout.

    ИСПОЛЬЗОВАНИЕ cout

    Как вы уже знаете, cout представляет собой класс, который содержит несколько разных методов. Следующие программы иллюстрируют использование некоторых методов, которые ваши программы могут применять для форматирования вывода. Из урока 3 вы узнали, что манипулятор setw позволяет вашим программам указать минимальное количество символов, которое может занять следующее выходное значение:

    Подобным образом метод cout.width позволяет вам указать минимальное количество символов, которое будет использовать сои/для вывода следующего значения. Следующая программа COUTWIDT.CPP использует функцию cout.width для выполнения работы, аналогичной той, которую выполняет setw, что и показано ниже:

    <
    int i;
    for (i = 3; i

    Если вы откомпилируете и запустите вашу программу, на экране дисплея появится следующий вывод:

    Мое любимое число1001

    Мое любимое число 1001

    Мое любимое число 1001

    Мое любимое число 1001

    Подобно манипулятору setw, ширина, выбираемая с помощью функции cout.width, действует только для следующего выходного значения.

    Использование символа-заполнителя

    Если вы используете манипулятор setw или функцию cout.width для управления шириной вывода, cout будет помещать пробелы до (или после для выровненных влево) значений, как это и требуется. В зависимости от назначения вашей программы вы, возможно, захотите использовать символ, отличный от пробела. Предположим, например, что ваша программа создает такую таблицу:

    Таблица информации
    Профиль компании. 10
    Доходы и убытки компании. 11
    Члены правления компании. 13

    В данном случае вывод предваряет номера страниц точками. Функция cout.fill позволяет вам указать символ, который cout будет использовать для заполнения пустого пространства. Следующая программа COUTFILL.CPP создает таблицу, подобную приведенной выше:

    Если вы однажды выбрали символ-заполнитель с помощью cout.fill, он будет оставаться действительным, пока вы не измените его повторным вызовом cout.fill.

    Управление цифрами значений с плавающей точкой

    Если вы используете cout для вывода значения с плавающей точкой, то обычно не можете сделать каких-либо предположений о том, сколько цифр будет выводить cout no умолчанию. Однако, используя манипулятор setprecision, вы можете указать количество требуемых цифр- Следующая программа SETPREC.CPP использует манипулятор setprecision для управления количеством цифр, которые появятся справа от десятичной точки:

    <
    float value = 1.23456;
    int i;
    for (i = 1; i

    Когда вы откомпилируете и запустите эту программу, на экране дисплея появится следующий вывод:

    Если вы используете манипулятор setprecision для изменения точности, ваша установка действует до тех пор, пока программа повторно не использует setprecision.

    ВЫВОД И ВВОД ОДНОГО СИМВОЛА ЗА ОДИН РАЗ

    В зависимости от назначения вашей программы вам, возможно, потребуется выводить символы на дисплей или читать с клавиатуры по одному символу за один раз. Для вывода одного символа за один раз ваши программы могут использовать функцию cout.put. Следующая программа COUTPUT.CPP использует эту функцию для вывода на экран сообщения Учимся программировать на языке C++! по одному символу за раз:

    <
    char string[] = «Учимся программировать на языке C++!»;
    int i;
    for (i = 0; string[i]; i++) cout.put(string[i]) ;
    >

    Библиотека этапа выполнения предоставляет функцию с именем toupper, которая возвращает заглавный эквивалент строчной буквы. Следующая программа COUTUPPR.CPP использует функцию toupper для преобразования символа в верхний регистр, а затем выводит эту букву с помощью cout.put.

    #include // прототип toupper

    <
    char string[] = «C++ language»;
    int i;
    for (i = 0; string[i]; i++) cout.put(toupper(string[i]));
    cout

    Если вы откомпилируете и запустите эту программу, на экране дисплея появится следующий вывод*:

    Результирующая строка: C++ language

    * К сожалению, функция toupper применима только к английским буквам. Прим. перев.

    ЧТЕНИЕ ВВОДА С КЛАВИАТУРЫ ПО ОДНОМУ СИМВОЛУ ЗА РАЗ

    Точно так же, как cout предоставляет функцию cout.put для вывода символа, cin предоставляет функцию cin.get, которая позволяет вам читать один символ данных. Чтобы воспользоваться функцией cin.get, вы просто присваиваете переменной возвращаемый этой функцией символ, как показано ниже:

    Следующая программа CIN_GET.CPP выводит сообщение, в ответ на которое вам необходимо ввести Y или N. Затем она повторяет в цикле вызов cin.get для чтения символов, пока не получит Y или N:

    ЧТЕНИЕ С КЛАВИАТУРЫ ЦЕЛОЙ СТРОКИ

    Как вы уже знаете, при использовании cin для выполнения ввода с клавиатуры, cin использует пустые символы, такие как пробел, табуляция или возврат каретки, для определения, где заканчивается одно значение и начинается другое. Во многих случаях вы захотите, чтобы ваши программы считывали целую строку данных в символьную строку. Для этого программы могут использовать функцию cin.getline. Для использования cin.getline вам необходимо указать символьную строку, в которую будут помещаться символы, а также размер строки, как показано ниже:

    Когда cin.get читает символы с клавиатуры, она не будет читать символов больше, чем может вместить строка. Удобным способом определить размер массива является использование оператора C++ sizeof, как показано ниже:

    Если позже вы измените размер массива, то вам не нужно будет искать и изменять каждый оператор с cin.get, встречающийся в вашей программе. Вместо этого оператор sizeof » будет использовать корректный размер массива. Следующая программа GETLINE.CPP использует функцию cin.getline для чтения с клавиатуры строки текста:

    <
    char string[128];
    cout

    Когда вы читаете символы с клавиатуры, то, возможно, вам понадобится читать символы вплоть до и включая определенный символ. Когда такой символ будет прочитан, возможно, вы захотите завершить операцию ввода. Для выполнения подобной операции ваша программа может передать искомый символ в cin.getline. Например, следующий вызов заставляет функцию cin.getline читать строку текста, пока не встретится возврат каретки, или пока не будут прочитаны 64 символа, или пока не встретится буква Я:

    cin.getline(string, 64, «Я»);

    Следующая программа UNTIL_Z.CPP использует cin.getline для чтения строки текста или символов вплоть до появления буквы Я (включая и эту букву):

    <
    char string[128];
    cout

    Откомпилируйте и запустите эту программу. Экспериментируйте с различными строками текста. Некоторые из них начинайте с буквы Я, некоторые заканчивайте буквой Я, а некоторые пусть вообще не содержат букву Я.

    ЧТО ВАМ НЕОБХОДИМО ЗНАТЬ

    Каждая созданная вами на C++ программа будет, вероятно, использовать cin или cout для выполнения операций ввода и вывода. Этот урок посвящен некоторым манипуляторам В/В и функциям, которые вы можете использовать с потоками cin и cout. По мере усложнения ваших программ они часто будут сохранять информацию в файлах. Из урока 34 вы узнаете, как в C++ выполнять операции файлового ввода и вывода. Прежде чем приступить к изучению урока 34, убедитесь, что вы освоили следующие основные концепции:

    Двоичное дерево поиска
    Задание. Построение и обработка двоичных деревьев поиска. Реализовать программу, выполняющую следующий набор операций с деревьями поиска:

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

    Выдает (в VS 2012) следующие ошибки:

    Т. Е. он утв-ет что count не является однозначным и не определен

    Причина: здесь, возможно, компилятором делается попытка интерпретировать «cout << count << . какая-то чушь» как стандартную шаблонную функцию std::count.

    Ты сделал ТРИ ошибки, которые сделали ГОВНОМ этот исходный код:

    1) Свалил пространство имен std в общую кучу, с легкой руки вычертив using namespace std;
    2) НЕ указывал оператор :: перед обращением к глобальной переменной
    3) НЕ удосужился отформатировать исходник, но очень круто выложил это в pastebin

    Не является однозначным ошибка c

    Избавляемся от ошибки «This function or variable may be unsafe» в Visual Studio

    Время чтения: 5 минут

    Компилятор в Visual Studio сильно отличается от привычных большинству программистов GCC или CLANG, из-за чего при написании кода на C или C++ очень часто возникают неожиданные проблемы в виде ошибки использования стандартных функций, например, scanf, fopen, sscanf и тому подобным. Студия предлагает заменять функции на безопасные (повезёт, если нужно просто добавить _s к функции с ошибкой, но нередко в этих функциях идёт иной набор аргументов, нежели в обычной программе). Если вы не готовы с этим мириться, то этот пост для вас!

    Давайте для начала создадим обычный консольный проект в Visual Studio и напишем простенькую программу, которая запрашивает ввод двух чисел, вводит их и затем выводит на экран.

    Попробовав выполнить сборку проекта, обнаружим те самые ошибки.

    Чтобы Visual Studio не тратила ваши нервы, сделаем следующее:

    1. Выберем пункт «Проект» в верхнем меню

    2. В открывшемся списке щёлкнем по «Свойства название_проекта»

    3. В появившемся окне выберем Свойства конфигурации , C/C++ , Препроцессор

    4. В строке Определения препроцессора допишем в самый конец строку ;_CRT_SECURE_NO_WARNINGS

    6. Попробуем заново выполнить сборку проекта:

    Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!

    Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов

    Языки программирования: C, C++, Pascal, C#

    Студент МГУ им. М.В. Ломоносова

    А Вы знаете, что мы пишем программы на C, C++, C#, Pascal и Python?

    Так что если Вам нужно написать программу на C/C++, C#, Pascal или Python — мы с радостью поможем с этим!

    В том числе мы занимаемся репетиторством по информатике и программированию, а также готовим к ОГЭ и ЕГЭ!

    Почему именно мы?

    • Более 1800 выполненных заказов;
    • Более 170 отзывов;
    • Качественное решение
    • Короткие сроки и привлекательные цены
    • Различные акции и скидки

    Как с нами связаться?

    • группа Вконтакте: vk.com/programforyou
    • наша почта: order@programforyou.ru

    Programforyou — позвольте нам писать код для вас и вы получите качественное решение в короткие сроки по привлекательной цене!

    Ошибка C2653: . не является существующим классом

    Я продолжаю получать ту же ошибку, когда я определенно создал «non-existent» класс RandomNumGuesser .

    Я уже позаботился о том, чтобы включить ; после закрытия каждого класса >

    Не знаю, что еще сказать.

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

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

    2 Ответа

    У вас есть синтаксическая ошибка. Есть и другие проблемы: getCurrentGuess не является частью класса RandomNumGuesser (то же самое с другими методами в классе Guesser ). Я считаю, что журнал ошибок был сокращен в вопросе.

    Вот как должен выглядеть cpp

    RandomNumGuess не имеет функций-членов

    Однако вы определяете их в исходном файле.

    Может быть, они должны быть абстрактными виртуальными функциями?

    Вы также не можете определить конструктор по умолчанию для NumberGuesser и RandomNumGuesser .

    Похожие вопросы:

    Это серьезно действует мне на нервы. Этот код работал просто отлично раньше, я перезапустил IDE (Visual Studio 2010), и теперь внезапно код выходит из строя на меня. Журнал ошибок огромен, и я.

    Я пытаюсь сослаться на структуру из другого класса в своем коде, и это дает мне ошибку, говоря, что у меня есть проблема синтаксиса. #pragma once #include Definitions.h #include GV.h #include UI.h.

    Общий вопрос об интеграции Realm с существующим проектом. Другой фреймворк у меня есть класс User , который имеет кучу свойств. Есть ли в любом случае с Realm, что я могу просто сохранить этот.

    Когда я запускаю эту программу, она говорит, что в этом файле есть ошибка под названием error C2653: ‘Application’ : is not a class or namespace name #include MyForm.h using namespace std; int.

    Я понимаю, что многие люди задавали этот вопрос, и есть похожие на Stack Overflow, но я не могу их понять. Я надеюсь, что кто-то скажет мне, почему это происходит, но и что происходит. Я кодировал.

    Я загружаю jsoncpp на Github. И построил и установил его с мезоном и ниндзя. Но когда я включаю в свою программу, я получил ошибку: ‘PrecisionType’ не является классом или.

    Добрый день. Я начал изучать c++ , и у меня есть и проблема компиляции моего проекта. Если вы найдете какой-нибудь неисправный код, я буду рад, если вы мне скажете. У меня есть следующие.

    Мои предыдущие вопросы касались одного и того же проекта: Один и два . Нет необходимости читать их; просто знайте, что я пытаюсь использовать родной C++ SDK в проекте Visual C++. Это гораздо.

    В Laravel4 я хочу использовать модель, которая представляет собой Event , поступающую из моей базы данных. Таким образом, в app/models у меня есть моя модель Event , которая расширяет Eloquent.

    Я работаю над некоторым программным обеспечением для моделирования, написанным на C++. В настоящее время, когда я пытаюсь построить свой код, я получаю 9 ошибок компиляции, все жалуются на три.

    C++ для людей

    std::cout

    Часто встречающиеся ошибки стадии компиляции

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

    А если помножить этот факт на незнание английского языка («чего там ему не нравится. ») и слабое владение синтаксисом C++ («хм, а может, тут нужна точка с запятой…»), то проблема принимает масштаб катастрофы.

    Тот факт, что компилятор в силу своих ограниченных возможностей изо всех сил старается объяснить, что конкретно неверно, не спасает ситуацию. Как быть, если гуглить неохота, а спросить не у кого?

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

    В качестве компилятора возьмем g++, который, в частности, может использоваться в среде Code::Blocks. Версия gcc (куда входит g++) для ОС Windows зовется MinGW. По ходу я буду давать аналоги ошибок из лексикона русскоязычной Microsoft Visual C++.

    Итак, частые ошибки:

    undeclared identifier

    doy.cpp: In function ‘int main()’:
    doy.cpp:25: ‘DayOfYear’ undeclared (first use this function)
    doy.cpp:25: (Each undeclared identifier is reported only once for each function it appears in.)
    doy.cpp:25: parse error before ‘;’ token

    2) Смысл
    Использован идентификатор DayOfYear , но компилятор не нашел его объявления. Он не знает, что такое DayOfYear .

    • Вы забыли включить какой-то заголовочный файл ( #include. )
    • Вы где-то ошиблись в написании идентификатора (при объявлении или использовании)
    • Вы вообще забыли, что эту переменную надо объявить

    Попытавшись скомпилировать это в Microsoft Visual C++, вы увидите:

    error C2065: DayOfYear: необъявленный идентификатор

    cout undeclared

    xyz.cpp: In function ‘int main()’:
    xyz.cpp:6: ‘cout’ undeclared (first use this function)
    xyz.cpp:6: (Each undeclared identifier is reported only once for each function it appears in.)

    2) Смысл
    Суперклассика. Без комментариев.

    • Вы забыли включить
    • Вы забыли написать using namespace std;

    jump to case label

    switch.cpp: In function ‘int main()’:
    switch.cpp:14: jump to case label
    switch.cpp:11: crosses initialization of ‘int y’

    2) Смысл
    Смысл туманен

    3) Когда бывает
    Вы попытались объявить и инициализировать переменную (объект, указатель и т.п.) в метке case оператора выбора switch. Правилами C++ это запрещено.

    В Microsoft Visual C++ эта ошибка зовется

    error C2360: пропуск инициализации ‘y’ из-за метки ‘case’

    Выход: заключите операторы этого case’а в фигурные скобки .

    multi-line string / unterminated string

    using namespace std;

    вызовет бурную реакцию компилятора:

    string.cpp:7:12: warning: multi-line string literals are deprecated
    string.cpp: In function ‘int main()’:
    string.cpp:7: ‘so’ undeclared (first use this function)
    string.cpp:7: (Each undeclared identifier is reported only once for each function it appears in.)
    string.cpp:7: parse error before ‘Mary’
    string.cpp:8:28: warning: multi-line string literals are deprecated
    string.cpp:8:28: missing terminating » character
    string.cpp:7:12: possible start of unterminated string literal

    2) Смысл
    Компилятор думает, что мы хотим создать строковую константу с содержащимся в ней переносом строки, что-то типа

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

    3) Когда бывает
    Когда не соблюдается правильное количество и положение кавычек в строковых литералах. Надо быть внимательнее.

    Microsoft Visual C++ со свойственной ему детской непосредственностью, отметит, что нельзя делать переносы в строках и возмутится, где точка с запятой:

    error C2001: newline в константе
    error C2146: синтаксическая ошибка: отсутствие «;» перед идентификатором «cout»

    comparison between signed and unsigned integer expressions

    xyz.cpp: In function ‘int main()’:
    xyz.cpp:54: warning: comparison between signed and unsigned integer expressions

    2) Смысл
    Это — предупреждение компилятора, которое говорит о том, что мы пытаемся сравнить (==, и т.д.) целочисленное выражение (может принимать положительные, отрицательные значения и 0) и беззнаковое целочисленное выражение (может быть только положительным, либо 0).

    3) Когда бывает
    Собственно, тогда и бывает. Напомню, что тип int по умолчанию знаковый, а некоторые функции (например, vector::size() ) возвращают unsigned int .
    К примеру, следующий на первый взгляд безобидный код вызовет описываемое предупреждение:

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

    В Microsoft Visual C++ предупреждение выглядит так:

    suggest parentheses around assignment used as truth value

    xyz.cpp: In function `int main()’:
    xyz.cpp:54: warning: suggest parentheses around assignment used as truth value

    2) Смысл
    Тоже классика. Компилятор предполагает (и в 99% случаев прав), что вы по ошибке включили в скобки в качестве условия для if/while/for вместо условного выражения выражение присваивания.

    3) Когда бывает
    Чаще всего — в if ‘ах, когда вместо «==» используется «=»

    if (length = maxLength)

    if (length == maxLength)

    Заминка в том, что это не ошибка, т.к. в скомпилированной программе (если мы проигнорируем предупреждение) выражение присваивания (которое возвращает значение правого аргумента) во всех случаях, кроме тех, когда оно вернет 0 , будет преобразовано к true .

    Вопрос по плюсам (error C2102: ‘&’ requires l-value)

    Привет.
    Такой вопрос:

    значит тут будет ошибка.. error C2102: ‘&’ requires l-value
    Нашёл тут вроде как объяснение.. И там говорят про локальную переменную.. Что типа я реально возвращаю временный объект типа int*. Это так ? То есть в стеке создаётся переменная и туда помещается значение int*, так ? Если так, то почему я не могу взять её адрес ?? Она же есть !

    • =A=L=X=
    • Постоялец

    Gladiator
    > Что типа я реально возвращаю временный объект типа int*. Это так ? То есть в
    > стеке создаётся переменная и туда помещается значение int*, так ?

    > Если так, то
    > почему я не могу взять её адрес ?? Она же есть !

    Ну вообще то можешь, но уже в следующем операторе команды функции оно не будет иметь смысла и корректного адреса, так что правильно ругается.

    • Genx
    • Удалён

    >То есть в стеке создаётся переменная и туда помещается значение int*, так ?
    Не в стеке. По умолчанию результат функции помещается не на стек, а в регистр EAX процессора (если он влезает туда).

    • laMer007
    • Удалён

    Gladiator
    Вы делаете что-то странное и за последствия я не ручаюсь, но думаю во время учебы нужно заниматься странными вещами.
    Чтобы скомпилировалось достаточно что-то вроде:

    • Zefick
    • Постоялец

    upd: специальное дополнение: приведённые два варианта неравносзачны, неоднозначны и не-ещё-что-хотите, если вы считаете их по какой-то причине некорректными для непоставленной задач, если они оскорбляют ваши религиозные чувства, доставляют вам батхёрт потому что их написал явист или ещё каким-то образом нарушают ваш внутренний мир, то просьба в треде об этом больше не писать

    • nes
    • Постоялец

    Zefick
    Приведенные тобой варианты не однозначны, первый не корректный для данной задачи.

    • Gladiator
    • Постоялец

    =A=L=X=
    > Ну вообще то можешь, но уже в следующем операторе команды функции оно не будет
    > иметь смысла и корректного адреса, так что правильно ругается.
    Почему не будет ? Стековая переменная держится в памяти пока жива переменная.. А жива она до тех пор, пока не покинула блок в котором объявлена.

    • Gladiator
    • Постоялец

    Не решаю конкретной задачи, чисто академический интерес

    • Gladiator
    • Постоялец

    аа.. всё дошло.. типа я беру адрес временной переменной, которая уничтожается после операции присваивания..

    • PANDA
    • Постоялец

    Zefick
    > int **pMember1 = &p;
    > int **pMember2 = a.GetMember2();
    Ты хочешь сказать, что это одно и то же? Может, ты лучше будешь давать советы по жабе?

    • susageP
    • Постоялец

    возможно прокатит как int*const & pMember = a.GetMember();
    const продлевает жизнь временным объектам. возможно прокатит и с int.

    Gladiator
    > И там говорят про локальную переменную.. Что типа я реально возвращаю временный
    > объект типа int*. Это так ? То есть в стеке создаётся переменная и туда
    > помещается значение int*, так ? Если так, то почему я не могу взять её адрес ??
    > Она же есть !

    это временная переменная ‘выражения’ она живет до’;’ также как и временные объекты.
    ссылочная константа если не ошибаюсь это единственный способ продлить жизнь временного объекта.

    • Zefick
    • Постоялец

    PANDA
    > Ты хочешь сказать, что это одно и то же?
    Нет, это ты так решил.

    > Может, ты лучше будешь давать советы по жабе?
    А может ты не будешь писать посты с наездами, если не умеешь читать мысли?

    • PANDA
    • Постоялец

    Zefick
    Из твоего кода создается именно такое впечатление.
    1 «вариант»
    > int *p = a.GetMember1();
    > int **pMember1 = &p;
    2 «вариант»
    > int **pMember2 = a.GetMember2();
    Зачем давать советы, если сам не понимаешь указатели?

    • Eugene
    • Участник

    PANDA
    Все нормально. Два варианта для двух разных целей.
    Если я захочу сделать что то вроде foo(int** out_ptr), то я, может быть, захочу изменить поле класса,
    foo(pMember2);
    bor(*pMember2);
    а может и не захочу
    if(!*pMember1) foo(pMember1);
    bar(*pMember1);

    Reference to ‘ ‘ is ambigous error in Xcode

    I was working with a custom iOS framework project in Xcode.There I am getting a lot of errors mentioning «Reference to ‘ ‘ is ambigous».I am attaching the screenshot of errors.Please help me correcting this.

    Создан 03 июл. 15 2015-07-03 05:53:29 haritha

    It looks like you forgot to mention any «;» or «,» in the code line. or i can’t debug that’s why it looks like problem with if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) line. – Code Hunterr 06 июл. 15 2015-07-06 04:31:41

    Click on the disclosure next to the error (in the Error navigator on the left). Make the navigator wide enough to show the full messages after you do. Post a screenshot of those messages. – rob mayoff 06 июл. 15 2015-07-06 04:52:40

    try ‘Cmd+Shift+K’ – 0yeoj 06 июл. 15 2015-07-06 04:54:30

    @robmayoff:Yes please check the screen shot – haritha 06 июл. 15 2015-07-06 05:09:26

    Actually when I build this in latest iOS 8 sdks I am not getting any error.It is showing problems in sdks 6.1 and other lower versions.But I want to run this in sdks 6.1 itself – haritha 06 июл. 15 2015-07-06 05:12:53

    5 ответов

    Actually This error was cleared when I shift from iOS SDK 6.1 to 7.1(or any version higher that 6.1)

    Создан 10 июл. 15 2015-07-10 05:00:35 haritha

    i am having same ios SDK. and i import UIKit and CoreGraphicsframework the error is shown CGRectMinXEdge is ambiguous in MMDrawer class. what can i do? – ios developer 20 июл. 16 2016-07-20 13:09:09

    The error message makes me think you have two declarations of the same library functions. All of those references are from UIKit . Check to make sure only one version of UIKit is referenced in your project (check the frameworks), and make sure any libraries you have included are linking the same UIKit version as the rest of the app.

    Steps to fix from here:

    • Clean the project
    • Delete everything inside ‘

    Создан 06 июл. 15 2015-07-06 04:42:35 Jason

    Adding more information to Jason’s answer.

    The error message makes me think you have two declarations of the same library functions. All of those references are from UIKit

    mostly this can be occurring because of the header files. As you can see all the errors indicates that it is quoting the enum values. Enum values will always be in the .h files. Normally the reference headers(.h files) will be present inside the frameworks. It is a common mistake that sometimes these header files will be buried some where in our code by any third party frameworks. So kindly check your third party libraries.

    I did face this issue once and after searching everywhere i could not able to find the solution. The only thing solved my issue was

    Opening a fresh project and importing my files into that project. Actually it really took me less than 10 minutes to move to a new project and immediately my xcode was happy. This is definitely worth a try.

    Создан 06 июл. 15 2015-07-06 05:40:55 iPrabu

    Why is this bug and your solution related to namespaces? – Amin Negm-Awad 08 июл. 15 2015-07-08 05:33:38

    Clean your project and rebuild again.If it don’t work then create a new project

    Создан 07 июл. 15 2015-07-07 04:05:14 haritha

    Set value of Enable Module (C and objective-c) to No

    Создан 20 янв. 17 2017-01-20 13:53:34 Mohit tomar

    This doesn’t solve the problem. – Aanchal Chaurasia 27 окт. 17 2017-10-27 11:55:51

    Как исправить ошибку «cout не является однозначным»?

    country::country(char* aname, double at_winter, double at_spring, double at_summer, double at_autumn) :
    name(new char[strlen(aname) + 1])
    strcpy_s(name, strlen(aname) + 1, aname);
    t_winter = at_winter;
    t_spring = at_spring;
    t_summer = at_summer;
    t_autumn = at_autumn;
    >;

    country::country(const country& COUNTRY) :
    name(new char[strlen(COUNTRY.name) + 1])
    strcpy_s(name, strlen(COUNTRY.name) + 1, COUNTRY.name);
    t_winter = COUNTRY.t_winter;
    t_spring = COUNTRY.t_spring;
    t_summer = COUNTRY.t_summer;
    t_autumn = COUNTRY.t_autumn;
    >;

    ostream& operator<<(ostream& Out, const country& COUNTRY)
    Out << «nСТРАНА: » << COUNTRY.name << «nТЕМПЕРАТУРА ЗИМОЙ» << COUNTRY.t_winter << «nТЕМПЕРАТУРА ВЕСНОЙ» << COUNTRY.t_spring << «nТЕМПЕРАТУРА ЛЕТОМ» << COUNTRY.t_summer << «nТЕМПЕРАТУРА ОСЕНЬЮ » << COUNTRY.t_autumn;

    istream& operator>>(istream& In, country& COUNTRY)
    char TEMP[123];
    In >> TEMP >> COUNTRY.t_winter >> COUNTRY.t_spring >> COUNTRY.t_summer >> COUNTRY.t_autumn;
    delete[] COUNTRY.name;
    COUNTRY.name = new char[strlen(TEMP) + 1];
    strcpy_s(COUNTRY.name, strlen(TEMP) + 1, TEMP);
    return In;
    >;

    country& country::operator=(const country& COUNTRY) if (this == &COUNTRY) return *this;
    delete[] name;
    name = new char[strlen(COUNTRY.name) + 1];
    strcpy_s(name, strlen(COUNTRY.name) + 1, COUNTRY.name);
    name = COUNTRY.name;
    t_winter = COUNTRY.t_winter;
    t_spring = COUNTRY.t_spring;
    t_summer = COUNTRY.t_summer;
    t_autumn = COUNTRY.t_autumn;
    return *this;
    >;

    NewCountry::NewCountry() :
    country()
    polusharie = NULL;
    >;

    NewCountry::NewCountry(char* aname, double at_winter, double at_spring, double at_summer, double at_autumn, int apolusharie) :
    country(aname,at_winter, at_spring, at_summer, at_autumn)
    polusharie = apolusharie;
    >;

    NewCountry::NewCountry(const NewCountry& COUNTRY) :
    country(COUNTRY)
    polusharie = COUNTRY.polusharie;
    >;

    string NewCountry::sReturnpolusharie() if (polusharie == 1) return «северное»;
    if (polusharie == 2) return «южное»;
    if (polusharie == 3) return «по обе стороны экватора»;
    return «. ОШИБКА:данные отсутствуют. «;
    >;

    ostream& operator<<(ostream& Out, const NewCountry& COUNTRY)
    Out << «nСТРАНА: » << COUNTRY.name << «nТЕМПЕРАТУРА ЗИМОЙ» << COUNTRY.t_winter << «nТЕМПЕРАТУРА ВЕСНОЙ» << COUNTRY.t_spring << «nТЕМПЕРАТУРА ЛЕТОМ» << COUNTRY.t_summer << «nТЕМПЕРАТУРА ОСЕНЬЮ » << COUNTRY.t_autumn;
    Out << «nРАСПОЛОЖЕНИЕ ОТНОСИТЕЛЬНО ЭКВАТОРА: «;
    if (COUNTRY.polusharie == 1) Out << «СЕВЕРНОЕ»;
    if (COUNTRY.polusharie == 2) Out << «ЮЖНОЕ»;
    if (COUNTRY.polusharie == 3) Out << «ПО ОБЕ СТОРОНЫ ЭКВАТОРА»;
    return Out;
    >;

    istream& operator>>(istream& In, NewCountry& COUNTRY)
    char TEMP[123];
    In >> TEMP >> COUNTRY.t_winter >> COUNTRY.t_spring >> COUNTRY.t_summer >> COUNTRY.t_autumn >> COUNTRY.polusharie;
    delete[] COUNTRY.name;
    COUNTRY.name = new char[strlen(TEMP) + 1];
    strcpy_s(COUNTRY.name, strlen(TEMP) + 1, TEMP);
    return In;
    >;

    NewCountry& NewCountry::operator=(const NewCountry& COUNTRY) if (this == &COUNTRY) return *this;
    delete[] name;
    name = new char[strlen(COUNTRY.name) + 1];
    strcpy_s(name, strlen(COUNTRY.name) + 1, COUNTRY.name);
    t_winter = COUNTRY.t_winter;
    t_spring = COUNTRY.t_spring;
    t_summer = COUNTRY.t_summer;
    t_autumn = COUNTRY.t_autumn;
    polusharie = COUNTRY.polusharie;
    return *this;
    >;

    void main() setlocale(LC_ALL, «Russian»);
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int N;
    double winter = lol[0].ReturnT_Winter;
    double summer = lol[0].ReturnT_Summer;
    NewCountry* lol;
    cout << «КОЛИЧЕСТВО СТРАН: «;
    cin >> N;
    lol = new NewCountry[N];
    cout << «Введите данныеnНазвание страны , температура зимой,весной и летом, в каком полушарии находится (1 — северное, 2 — южное, 3 — по обе стороны экватора ):nn»;
    for ( int i = 0; i < N; i++) cin >> lol[i];
    for ( int i = 0; i < N; i++)
    if (winter < lol[i].ReturnT_Winter())
    winter = lol[i].ReturnT_Winter();
    if (summer > lol[i].ReturnT_Summer ())
    summer = lol[i].ReturnT_Summer();
    >
    >;
    cout << «nПроверка оператора =n»;
    lol[0] = lol[1];
    cout << lol[0] << endl;
    cout << lol[1] << endl;
    cout << «nПроверка конструктора копированияn»;
    NewCountry Copy(lol[2]);
    cout << Copy << endl;
    cout << lol[2] << endl;
    delete[] lol;
    system(«pause»);
    >;

    Позвольте мне предвосхитить это, сказав, что я включил (также относится к string, endl, и буквально все не работает); моя IDE не показывает ошибок, насколько синтаксис идет; и я не могу понять, почему эта проблема происходит? Он отлично работает в одном из моих других примеров кода C ++, которые я написал.

    Поэтому я пытаюсь сделать небольшую игру, быков и коров. Мой основной код выглядит следующим образом:

    Наконец, мой файл BullsAndCows.cpp:

    Ошибки, которые я получаю, так как «cout не является членом std», символ cout не может использоваться в объявлении использования. До этого я использовал «использование пространства имен std», и это возвращало бы ошибки, такие как «BullsAndCows» не является пространством имен или классом (если это не класс, то я должен быть марсианином). Также кое-что о пропавшем «;» перед userInput, например, в моем коде main.cpp; что не имеет смысла, так как нет ничего, что не хватает этого. Я использую VS2017. Почему C ++ такой раздражающий язык для работы?

    Решение

    прежде чем любые другие включают директивы.

    Автор Јляп Шляпович задал вопрос в разделе Другие языки и технологии

    Помогите пожалуйста исправить ошибку в коде программы (C++). Был бы благодарен. и получил лучший ответ

    Ответ от Valrand()[гуру]
    Причина: здесь, возможно, компилятором делается попытка интерпретировать «cout

    Двоичное дерево поиска
    Задание. Построение и обработка двоичных деревьев поиска. Реализовать программу, выполняющую следующий набор операций с деревьями поиска:

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

    Выдает (в VS 2012) следующие ошибки:

    Т. Е. он утв-ет что count не является однозначным и не определен

    Дополнительные сведения о: Ошибка компилятора C2065

    Решение

    Поместите директиву

    #include “stdafx.h”

    прежде чем любые другие включают директивы.

    7

    Решение

    прежде чем любые другие включают директивы.

    Я только начал разбираться с плюсами. И тут же воткнулся в какой-то непонятный для меня косяк.

    Вроде все верно. Но при компиляции ошибка:

    Я почитал у вас тут похожие темы. Пишут, что область имен надо объявить, она есть. Вроде вообще все как надо. Я использую VS 2017 для написания кода. Объясните, пожалуйста, что не так.

    Двоичное дерево поиска
    Задание. Построение и обработка двоичных деревьев поиска. Реализовать программу, выполняющую следующий набор операций с деревьями поиска:

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

    Выдает (в VS 2012) следующие ошибки:

    ca7debe68da19d4d9be8f77ae809d608_i-99.jpg

    Т. Е. он утв-ет что count не является однозначным и не определен

    Идентификатор не объявленThe identifier is undeclared

    Если идентификатор является переменной или именем функции, его необходимо объявить перед тем, как его можно будет использовать.If the identifier is a variable or a function name, you must declare it before it can be used. Перед использованием функции в объявлении функции также должны быть включены типы его параметров.A function declaration must also include the types of its parameters before the function can be used. Если переменная объявлена с помощью auto , компилятор должен иметь возможность определить тип из его инициализатора.If the variable is declared using auto, the compiler must be able to infer the type from its initializer.

    Если идентификатор является членом класса или структуры или объявлен в пространстве имен, он должен уточняться именем класса или структуры или именем пространства имен при использовании вне структуры, класса или области пространства имен.If the identifier is a member of a class or struct, or declared in a namespace, it must be qualified by the class or struct name, or the namespace name, when used outside the struct, class, or namespace scope. Кроме того, пространство имен должно быть помещено в область с помощью using директивы, такой как using namespace std; , или имя члена должно быть помещено в область с помощью using объявления, такого как using std::string; .Alternatively, the namespace must be brought into scope by a using directive such as using namespace std;, or the member name must be brought into scope by a using declaration, such as using std::string;. В противном случае неполное имя считается необъявленным идентификатором в текущей области.Otherwise, the unqualified name is considered to be an undeclared identifier in the current scope.

    Если идентификатор является тегом для определяемого пользователем типа, например, class или struct , тип тега должен быть объявлен до его использования.If the identifier is the tag for a user-defined type, for example, a class or struct, the type of the tag must be declared before it can be used. Например, объявление struct SomeStruct { /*…*/ }; должно существовать, прежде чем можно будет объявить переменную SomeStruct myStruct; в коде.For example, the declaration struct SomeStruct { /*…*/ }; must exist before you can declare a variable SomeStruct myStruct; in your code.

    Если идентификатор является псевдонимом типа, тип должен быть объявлен с помощью using объявления или typedef перед тем, как его можно будет использовать.If the identifier is a type alias, the type must be declared by using a using declaration or typedef before it can be used. Например, необходимо объявить, using my_flags = std::ios_base::fmtflags; прежде чем можно будет использовать my_flags в качестве псевдонима типа для std::ios_base::fmtflags .For example, you must declare using my_flags = std::ios_base::fmtflags; before you can use my_flags as a type alias for std::ios_base::fmtflags.

    1. Статическая инициализация

    При создании статической переменной, возникает вопрос, когда эта переменная будет инициализирована, сколько времени она проживёт и когда будет уничтожена? Статическая инициализация позволяет нам создать переменную, которая будет инициализирована до запуска программы со временем жизни в течение всей программы и уничтожении после завершения. Такие константные переменные не зависят от исполнения — они всегда существуют, создаются во время компиляции и располагаются в исполнимом файле (в бинарнике). Как результат: нулевые накладные расходы, ранняя диагностика проблем и безопасность. Вопрос об использовании статической инициализации напрямую зависит от предметной области разрабатываемого проекта — чем ниже уровень, тем соблазн использования выше, а иногда и критичен, тут скорость решает всё.

    Как пример:

    const std :: size_t tabsize = 64 ;int tab [ tabsize ] ;

    Логические операторы

    В то время как операторы сравнения используются для проверки конкретного условия: ложное оно или истинное, они могут проверить только одно условие за определенный промежуток времени. Но бывают ситуации, когда нужно протестировать сразу несколько условий. Например, чтобы узнать, выиграли ли мы в лотерею, нам нужно сравнить все цифры купленного билета с выигрышными. Если в лотерее 6 цифр, то нужно выполнить 6 сравнений, все из которых должны быть true.

    Также иногда нам нужно знать, является ли хоть одно из нескольких условий истинным. Например, мы не пойдем сегодня на работу, если больны или слишком устали, или если выиграли в лотерею. Нам нужно проверить, является ли хоть одно из этих 3-х условий истинным. Как это сделать? С помощью логических операторов! Они позволяют проверить сразу несколько условий за раз.

    В языке C++ есть 3 логических оператора:

    Оператор Символ Пример Операция
    Логическое НЕ ! !x true, если x — false и false, если x — true
    Логическое И && x && y true, если x и y — true, в противном случае — false
    Логическое ИЛИ || x || y true, если x или y — true, в противном случае — false

    Короткий цикл вычислений

    Для того, чтобы логическое И возвращало true, оба операнда должны быть истинными. Если первый операнд вычисляется как false, то оператор И должен сразу возвращать false независимо от результата второго операнда (даже без его обработки). Это называется коротким циклом вычисления (англ. «short circuit evaluation») и выполняется он, в первую очередь, в целях оптимизации.

    Аналогично, если первый операнд логического ИЛИ является true, то и всё условие будет true (даже без обработки второго операнда).

    Как и в случае с оператором ИЛИ, новички иногда путают логическое И (&&) с побитовым И (&).

    Пример: сбой выведения типа C++/CLIExample: C++/CLI type deduction failure

    Эта ошибка может возникать при вызове универсальной функции, если аргумент предполагаемого типа не может быть выведен из используемых параметров.This error can occur when calling a generic function, if the intended type argument cannot be deduced from the parameters used. Дополнительные сведения см. в разделе универсальные функции (C++/CLI).For more information, see Generic Functions (C++/CLI).

    // C2065_b.cpp// compile with: cl /clr C2065_b.cppgeneric <typename ItemType>void G(int i) {}int main() { // global generic function call G<T>(10); // C2065 G<int>(10); // OK – fix with a specific type argument}

    А где же побитовое исключающее ИЛИ (XOR)?

    Побитовое исключающее ИЛИ (XOR) — это логический оператор, который используется в некоторых языках программирования для проверки на истинность нечётного количества условий.

    Побитовое исключающее ИЛИ (XOR)
    Левый операнд Правый операнд Результат
    false false false
    false true true
    true false true
    true true false

    В языке C++ нет такого оператора. В отличии от логических И/ИЛИ, к XOR не применяется короткий цикл вычислений. Однако его легко можно сымитировать, используя оператор неравенства (!=):

    if(a!=b)...// a XOR b (предполагается, что a и b имеют тип bool)

    Можно также расширить количество операндов:

    if(a!=b!=c!=d)...// a XOR b XOR c XOR d (предполагается, что a, b, c и d имеют тип bool)

    Следует отметить, что вышеприведенные шаблоны XOR работают только, если операнды имеют логический (а не целочисленный) тип данных. Если вы хотите, чтобы это работало и с целыми числами, то используйте оператор static_cast.

    Форма XOR, которая работает и с другими типами данных (с помощью оператора static_cast мы можем конвертировать любой тип данных в тип bool):

    if(static_cast<bool>(a)!=static_cast<bool>(b)!=static_cast<bool>(c)!=static_cast<bool>(d))...// a XOR b XOR c XOR d, для любого типа, который может быть конвертирован в тип bool

    Понравилась статья? Поделить с друзьями:
  • Cisco anyconnect secure mobility client error 1722
  • Cifs vfs send error in read 11
  • Cifs vfs send error in close 512
  • Cifs vfs error connecting to socket aborting operation
  • Cifs mount error 127 key has expired