LINUX.ORG.RU

C++: перенос программы в Astra Linux

 ,


0

1

Попробовал скомпилировать программу на C++, вычисляющую сумму двух чисел:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
int main()
{
char d;
do
{
double a, b, c;
system("clear");
cout << "Введите первое число: ";
cin >> a;
if(!cin)
{
cout << "Ошибка ввода!" << endl;
cin.clear();
fflush(stdin);
}
else
{
cout << "Введите второе число: ";
cin >> b;
if(!cin)
{
cout << "Ошибка ввода!" << endl;
cin.clear();
fflush(stdin);
}
else
{
c = a + b;
cout << "Сумма чисел равна: ";
cout << c << endl << endl;
}
}
cout << "Выйти из программы?" << endl;
cout << "Для выхода из программы введите 'д'," << endl;
cout << "для продолжения работы введите 'н': ";
cin >> d;
}
while(d != 'д');
return 0;
}
При компиляции было выдано сообщение:

summa.cpp:42:12: error: character too large for enclosing character literal type
while(d != 'д');

1 error generated.

Под MS Windows данная программа компилировалась с помощью Dev-C++ без проблем. Почему в linux'е возникло затруднение?

ты про отступы слышал?

#include <stdio.h>
#include <stdlib.h>

#include <iostream>
using namespace std;
int main() {
    char d;
    do {
        double a, b, c;
        system("clear");
        cout << "Введите первое число: ";
        cin >> a;
        if (!cin) {
            cout << "Ошибка ввода!" << endl;
            cin.clear();
            fflush(stdin);
        } else {
            cout << "Введите второе число: ";
            cin >> b;
            if (!cin) {
                cout << "Ошибка ввода!" << endl;
                cin.clear();
                fflush(stdin);
            } else {
                c = a + b;
                cout << "Сумма чисел равна: ";
                cout << c << endl << endl;
            }
        }
        cout << "Выйти из программы?" << endl;
        cout << "Для выхода из программы введите 'д'," << endl;
        cout << "для продолжения работы введите 'н': ";
        cin >> d;
    } while (d != 'д');
    return 0;
}
fsb4000 ★★★★★ ()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000
  .
  .
  .
  .
  .

У тебя Enter сломался, поэтому я дарю тебе пригоршню переводов каретки.

Usruser ()
Последнее исправление: Usruser (всего исправлений: 1)
6c6
<   char d;
---
>   std::string d;
33c33
<   } while (d != 'д');
---
>   } while (not d.compare("д"));

/thread

thunar ★★★★★ ()
Последнее исправление: thunar (всего исправлений: 5)

while(d != ‘д’);

char d - это один байт, а ‘д’ - больше чем один байт в юникоде.

Kroz ★★★★★ ()

В QtCreator тоже так можно, но нужно будет в настройки сходить.

pon4ik ★★★★★ ()

Почему в linux’е возникло затруднение?

потому что линукс всё ещё не готов для десктопа

yoghurt ★★★★★ ()

Ух ты, какой хороший пример. Надо будет его юникодо-агитаторам показывать.

firkax ★★ ()

В UTF-8 у тебя всё, что больше Latin-1 уже в два байта и больше лезет. На винде у тебя это локальная cp1251 8 битная. Кстати как так? Внутре всё unicode (пусть и самобытный, строго (?) двухбайтный).

hatred ★★ ()
Ответ на: комментарий от fsb4000

Тут ещё нужно смотреть какой софт как и чем собран: до недавнего времени при наличии cp1251, терминал нужно было из cp866 переводить. Я могу путать, конечно, с виндой, как пользователь, не работаю плотно где-то с 2001 года :)

Ну и собственно, как и в чём сохраняет редактор Dev-C++. К примеру, этот же код пересохранивт в том же QtC в koi8-r (https://i.imgur.com/Z8vmGzX.png) или чём-то похожем, будет «нормально»… компилироваться. Но не работать.

По поводу как и чем собран… мы драйвер только недавно перестали собрать VS 2005 (или даже древнее, не хочу туда лезть). Работает, HLK проходит - не трожь :)

hatred ★★ ()
Ответ на: комментарий от fsb4000

здесь вот всё.

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

А потом будет «ой-ой, нас заставили на этот мерзкий линукс переходить, сатрапы царские!»

max_lapshin ★★★★ ()
Ответ на: комментарий от max_lapshin

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

Автора темы никто не заставляет переходить на Linux. У него не практическая программа, а простейший учебный пример, который сразу не получился, потому что он только что приступил к изучению C++.

Partisan ★★★★ ()
Ответ на: комментарий от Partisan

Впрочем, поискал в Giogle - есть рекомендации по форматированию и для C++,а также отдельные программы форматирования. Но следует приучиться пользоваться IDE .

Partisan ★★★★ ()
Ответ на: комментарий от max_lapshin

это просто демонстрация виндовс-культуры

Да, видимо ты прав, среди вопросов связанных с виндовс я встречаю гораздо чаще неоформленный код и прочее, хотя clang-format работает на Windows точно также как и на Linux…

fsb4000 ★★★★★ ()
Ответ на: комментарий от hatred

... до недавнего времени при наличии cp1251, терминал нужно было из cp866 переводить.

Для GCC можно указать, в какой кодировке написан исходник и какую кодировку использовать для бинарника,: -finput-charset=CP1251 -fexec-charset=CP866

Mischutka ★★★ ()
Ответ на: комментарий от Mischutka

Для GCC можно указать, в какой кодировке написан исходник и какую кодировку использовать для бинарника,: -finput-charset=CP1251 -fexec-charset=CP866

Для Visual C++ тоже (https://docs.microsoft.com/en-us/cpp/build/reference/execution-charset-set-execution-character-set?view=msvc-170):

/source-charset:utf-8 /execution-charset:utf-8

или

/source-charset:utf-8 /execution-charset:.866

Пример:

$ cl /source-charset:utf-8 /execution-charset:.866 /EHsc /nologo main.cpp 

$ main.exe
Привет

$ chcp
Текущая кодовая страница: 866

$ type main.cpp
#include <iostream>

using namespace std;

int main() {
    cout << "╨Я╤А╨╕╨▓╨╡╤В\n"; // "Привет" в UTF-8
}
fsb4000 ★★★★★ ()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от Mischutka

Не нужно ничего указывать, если у тебя системная кодировка UTF-8:

~ 
➜ g++ /tmp/govno.cpp -o govno

~ 
➜ ./govno                    
Привет, куколд!

~ 
➜ cat /tmp/govno.cpp                                                      
#include <iostream>
using namespace std;
int main()
{
  cout << "Привет, куколд!\n";
}

~ 
➜ cat /etc/locale.conf
LANG=en_US.UTF-8

~ 
➜ grep -vE '^#' /etc/locale.gen                                                                      
ru_RU.UTF-8 UTF-8  
en_US.UTF-8 UTF-8

~ 
➜ echo $LANG                                              
en_US.UTF-8
tz4678_2 ()

while(d != ‘д’);

man кодировки

Zhbert ★★★★★ ()
Ответ на: комментарий от fsb4000

неоформленный код, вопиющая отсталость в современном инструментарии (я знаю виндовс-команду, которую несчастный техдир пытается сегодня затащить в git, лишь надеясь в будущем на какой-нибудь CI) и т.п.

max_lapshin ★★★★ ()

При компиляции было выдано сообщение:

измени свою жизнь, приходи работать в макдоналдс?

vvviperrr ★★★★★ ()
Ответ на: комментарий от Mischutka

Ну и небольшой совет, стоит всё же в С++ использовать библиотеки для него, а не сишные.

LND ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.