C++: преобразование градусов Цельсия в градусы Фаренгейта

Модератор: Модераторы разделов

Аватара пользователя
ArkanJR
Сообщения: 1164
Статус: Профан

C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение ArkanJR »

Имеется программа с содержимым:

Код: Выделить всё

// Программа для преобразования градусов Цельсия в градусы Фаренгейта:
// Fahrenheit = NCelsius * (212 - 32)/100 + 32
//
#include <iostream>
using namespace std;
int main(int nNumberofArgs, char* pszArgs[])
{
//Очистка консоли
system("clear");
// Введите температуру в градусах Цельсия
int nNCelsius;
cout << "Введите температуру по Цельсию: ";
cin >> nNCelsius;
// для приведенной формулы преобразования вычислим преобразующий множитель
int nNFactor;
nNFactor = 212 - 32;
// используем вычисленный множитель для преобразования градусов Цельсия в градусы Фаренгейта
int nFahrenheit;
nFahrenheit = nNFactor * nNCelsius/100 + 32;
// вывод результатов
cout << "Температура по Фаренгейту: ";
cout << nFahrenheit;
return 0;
}

В Geany 0.19.1 компиляция и выполнение производятся без проблем. При компиляции в vim 6.3.71 выдаётся сообщение:
:!make conversion 2>&1| tee /home/officer/.tmp/0-0/0-0/v733550/5
g++ -c -o conversion.o conversion.cpp
cc conversion.o -o conversion
conversion.o: In function `__static_initialization_and_destruction_0(int, int)':
conversion.cpp:(.text+0x24): undefined reference to `std::ios_base::Init::Init()'
conversion.o: In function `__tcf_0':
conversion.cpp:(.text+0x6b): undefined reference to `std::ios_base::Init::~Init()'
conversion.o: In function `main':
conversion.cpp:(.text+0x9e): undefined reference to `std::cout'
conversion.cpp:(.text+0xa3): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::o
perator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
conversion.cpp:(.text+0xb2): undefined reference to `std::cin'
conversion.cpp:(.text+0xb7): undefined reference to `std::basic_istream<char, std::char_traits<char> >::operat
or>>(int&)'
conversion.cpp:(.text+0xf7): undefined reference to `std::cout'
conversion.cpp:(.text+0xfc): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::o
perator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
conversion.cpp:(.text+0x10a): undefined reference to `std::cout'
conversion.cpp:(.text+0x10f): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::opera
tor<<(int)'
conversion.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: выполнение ld завершилось с кодом возврата 1
make: *** [conversion] Ошибка 1
(1 из 18): g++ -c -o conversion.o conversion.cpp
:cw

Подскажите, пожалуйста, в чём тут дело?
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение Bizdelnick »

ArkanJR писал(а):
13.03.2014 19:53
В Geany 0.19.1 компиляция и выполнение производятся без проблем. При компиляции в vim 6.3.71

Компилируйте компилятором, а не редактором, тогда проблем не будет.

У Вас там Makefile какой-то имеется?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ArkanJR
Сообщения: 1164
Статус: Профан

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение ArkanJR »

Bizdelnick писал(а):
13.03.2014 21:16
Компилируйте компилятором, а не редактором, тогда проблем не будет.

У Вас там Makefile какой-то имеется?

Так компилятор в обоих случаях вроде один и тот же задействован. )

Makefile отсутствует.
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение Женя Подсыпальников »

Не смог найти ясности о ключе :)

g++ conversion.cpp -o conversion.o

(то верно макрос какой-то от vim творит ?)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение Bizdelnick »

Не знаю, у меня всё работает, в том числе и из vim. За тем исключением, что пришлось добавить

Код: Выделить всё

#include <cstdlib>
для актуальной версии gcc.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ArkanJR
Сообщения: 1164
Статус: Профан

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение ArkanJR »

Женя Подсыпальников писал(а):
13.03.2014 21:25
Не смог найти ясности о ключе :)

g++ conversion.cpp -o conversion.o

(то верно макрос какой-то от vim творит ?)

Все настройки прописаны в .vimrc, макросы не задействованы. Относительно кнопки F5, на которую "повешена" компиляция, в данном файле прописано следующее:

Код: Выделить всё

"Компиляция по F5
function! BindF5_C()
if filereadable("Makefile")
set makeprg=make
map <F5> :w<CR>:make<CR>:cw<CR>
imap <F5> <ESC>:w<CR>:make<CR>:cw<CR>
else
map <F5> :w<CR>:make %:r<CR>:cw<CR>
imap <F5> <ESC>:w<CR>:make %:r<CR>:cw<CR>
endif
endfunction
au FileType c,cc,cpp,h,hpp,s call BindF5_C()
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение Женя Подсыпальников »

Вот тут , где 4 человека руку подняло -
есть пример участка .vimrc :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение drBatty »

ArkanJR писал(а):
13.03.2014 21:25
Makefile отсутствует.

ну дык исправьте.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ArkanJR
Сообщения: 1164
Статус: Профан

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение ArkanJR »

Вопрос по поводу предупреждений:

имеется почти та же программа:

Код: Выделить всё

#include <iostream>
using namespace std;
main()
{
system("clear");
int nNCelsius;
cout << "\x1B[32;1mВведите температуру по Цельсию:\x1B[0m ";
cout << "\x1B[33;1m";
cin >> nNCelsius;
cout << "\x1B[0m";
double nFahrenheit;
nFahrenheit = 1.8 * nNCelsius + 32;
cout << "\x1B[32;1mТемпература по Фаренгейту:\x1B[0m ";
cout << "\x1B[33;1m";
cout << nFahrenheit;
cout << "\x1B[0m";
return 0;
}


При её компиляции в Geany 0.19.1 выводится сообщение:
предупреждение: ISO C++ запрещает декларации 'main' без типа


Но при компиляции с помощью команды g++ conversion02.cpp -o conversion02 предупреждение не выдаётся. С чем это связано?
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
FlySnake
Сообщения: 992
ОС: openSUSE
Контактная информация:

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение FlySnake »

Видимом Geany вызывает g++ с опцией -Wall, включающей все предупреждения.
Спасибо сказали:
Аватара пользователя
ArkanJR
Сообщения: 1164
Статус: Профан

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение ArkanJR »

FlySnake писал(а):
12.05.2014 20:11
Видимом Geany вызывает g++ с опцией -Wall, включающей все предупреждения.

Действительно! Залез сейчас в Сборка/Установить команды сборки, там в опции "Скомпилировать" по умолчанию записано g++ -Wall -c "%f"
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение drBatty »

ArkanJR писал(а):
12.05.2014 20:25
Залез сейчас в Сборка/Установить команды сборки, там в опции "Скомпилировать" по умолчанию записано g++ -Wall -c "%f"

у меня тоже записано.

warning == опасная ошибка

потому что когда тебя не поняли -- плохо. Но стократ хуже, когда поняли неправильно.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ArkanJR
Сообщения: 1164
Статус: Профан

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение ArkanJR »

drBatty писал(а):
12.05.2014 22:40
warning == опасная ошибка

Разве? В англо-русском словаре по программированию и информатике А.Б. Борковского warning переводится несколько иначе:
Вложения
warning.png
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение drBatty »

ArkanJR писал(а):
12.05.2014 22:52
В англо-русском словаре по программированию и информатике А.Б. Борковского warning переводится несколько иначе:

в камин. Нет, я серьёзно, сожгите это дерьмо для дебилов.

Warning выдаётся компилятором тогда, когда _возможна_ ошибка. По мнению компилятора. Т.е. такой код, который _обычно_ понимается не так, как работает.

Типичный пример:

Код: Выделить всё

·   int a = 7;
·   if((a = 5))
·   ·   return 7;

если сделать одиночные скобки в if(), то будет предупреждение -Wparentheses, ибо очень просто опечататься, и очень сложно это найти. Представьте сами, каково это, искать, где переменная ВНЕЗАПНО становится равной 5и? Двойные скобки затыкают компилятор, и зрительно выделяют особую форму if(()), если это _действительно_ то, что вы хотите.

Да, формально, диванные аналитики могут считать это "допустимым". Просто потому, что эти дебилы не сидели ночами, и не искали ошибку в своём быдлокоде. А вместо этого писали словари за деньги на тему, в которой понимают не больше чем я в балете.

Ещё один каноничный пример:

Код: Выделить всё

предупреждение: операция над «a» может дать неопределенный результат [-Wsequence-point]
  a = a-- - --a;
    ^

да, это просто, и заметно. А если это сложное выражение, в котором вы два раза сделали декремент просто по ошибке? Найти такой косяк будет практически невозможно. Особенно учитывая, что выполняться данный код может четырьмя(sic!) принципиально разными способами, в зависимости от опций компилятора, платформы, и погоды на Марсе.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ArkanJR
Сообщения: 1164
Статус: Профан

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение ArkanJR »

А чём заключается опасность декларации 'main' без типа?
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение drBatty »

ArkanJR писал(а):
13.05.2014 18:09
А чём заключается опасность декларации 'main' без типа?

строго говоря, объявление функции без типа -- не имеет смысла, как деление на ноль. Т.е. у функции синтаксически должен быть тип перед именем. Даже если функция ничего не возвращает, то у неё есть тип — void.

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

А то, что написали вы, использовалось 30..40 лет назад, когда стандарта просто не было. Какое-то время это поддерживалось для совместимости, но потом решили отменить, да бы упростить поддержку разных ОС и компиляторов(что-бы не плодить разные исключения из правил).

также сейчас запрещено объявлять переменные без типа, например:

Код: Выделить всё

type defaults to «int» in declaration of «s» [-Wimplicit-int]
  static s = 7;
хотя раньше это было вполне себе нормальной практикой, опускать int везде, где только можно. Сейчас можно только при указании (без)знаковости, например вот так можно:

Код: Выделить всё

unsigned c;// unsigned int
signed s;// int

хотя это только в gcc, может в других компиляторах можно до сих пор, я не знаю.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение NickLion »

ArkanJR писал(а):
13.05.2014 18:09
А чём заключается опасность декларации 'main' без типа?

Тем, что в C++ такого нет. Это в Си по умолчанию считался int. GCC просто распространяет такое поведение и на C++, что в общем случае неверно. Если Вы попробуете использовать clang++, то будет ошибка. Даже при смене версии GCC это может стать ошибкой.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение drBatty »

NickLion писал(а):
14.05.2014 12:39
Это в Си по умолчанию считался int.

точнее считалось 40 лет назад.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ArkanJR
Сообщения: 1164
Статус: Профан

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение ArkanJR »

При попытке скомпилировать программу в CentOS 6 (компилятор gcc версия 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)) было выдано сообщение:
ошибка: нет декларации ‘system’ в этой области видимости
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение Bizdelnick »

ArkanJR писал(а):
16.05.2014 20:14
нет декларации ‘system’ в этой области видимости

man system
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ArkanJR
Сообщения: 1164
Статус: Профан

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение ArkanJR »

Bizdelnick писал(а):
16.05.2014 20:21
man system

Всё равно не понял, почему в МСВС компилируется нормально и нормально работает (консоль очищается), а в CentOS выдаётся сообщение об ошибке?
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение Bizdelnick »

Код: Выделить всё

#include <stdlib.h>
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение NickLion »

drBatty писал(а):
14.05.2014 13:02
NickLion писал(а):
14.05.2014 12:39
Это в Си по умолчанию считался int.

точнее считалось 40 лет назад.

У меня там прошедшее время стоит. Я к тому, что в Си это хотя бы было, а в C++ никогда такого не было.
Спасибо сказали:
Аватара пользователя
ArkanJR
Сообщения: 1164
Статус: Профан

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение ArkanJR »

Bizdelnick писал(а):
16.05.2014 20:54

Код: Выделить всё

#include <stdlib.h>

Заработало. Но остался вопрос: почему в МСВС для system("clear"); не требуется подключение заголовочного файла stdlib.h в отличие от CentOS 6?
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение NickLion »

Потому что <iostream> может включать <stdlib.h>. А может и не включать. Это зависит заголовочных файлов. В данном случае, от версии GCC.
Спасибо сказали:
Аватара пользователя
ArkanJR
Сообщения: 1164
Статус: Профан

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение ArkanJR »

NickLion писал(а):
17.05.2014 09:57
Потому что <iostream> может включать <stdlib.h>. А может и не включать. Это зависит заголовочных файлов. В данном случае, от версии GCC.

Так в обоих случаях использовалась 4-я версия.
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение NickLion »

С точностью до минорной версии? Допустим, 4.4 и 4.9 — очень сильно различаются. Но даже на уровне 4.4.1 и 4.4.2 могут быть отличия.

Если совпадает и минорная версия, то возможно, кто-то свои патчи накладывал.
Спасибо сказали:
Аватара пользователя
ArkanJR
Сообщения: 1164
Статус: Профан

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение ArkanJR »

NickLion писал(а):
17.05.2014 11:16
С точностью до минорной версии? Допустим, 4.4 и 4.9 — очень сильно различаются. Но даже на уровне 4.4.1 и 4.4.2 могут быть отличия.

Если совпадает и минорная версия, то возможно, кто-то свои патчи накладывал.

Нет: МСВС - gcc 4.1.3; CentOS - gcc 4.4.7.
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
Аватара пользователя
ArkanJR
Сообщения: 1164
Статус: Профан

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение ArkanJR »

При запуске программы через Geany открывается окно xterm, в котором данная программа корректно выполняется. Нельзя ли организовать подобное в vim? А то, когда запускаешь в нём программу по F9, получается следующее:
Вложения
gvim_cpp.png
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C++: преобразование градусов Цельсия в градусы Фаренгейта

Сообщение NickLion »

ArkanJR писал(а):
17.05.2014 11:26
Нет: МСВС - gcc 4.1.3; CentOS - gcc 4.4.7.

4.1.3 — это официальная версия? Не вижу такой.
4.1.2 — несусветное старьё.
4.4.7 тоже не новенькое, но всё же 2009 (обновление 2012) год, а не 2006 (обновление 2007).

ArkanJR писал(а):
17.05.2014 13:38
При запуске программы через Geany открывается окно xterm, в котором данная программа корректно выполняется. Нельзя ли организовать подобное в vim? А то, когда запускаешь в нём программу по F9, получается следующее:

Это, видимо, особенность gvim. В vim, запущенном в konsole всё выглядит норм.
Ну, а запустить из (g)vim можно и отдельным xterm:
:!xterm -e 'executable-file-name; sleep 10'
Спасибо сказали:
Ответить