Как делить числа и возвращать число с плавающей запятой в #!/bin/sh

Все ошибки компиляции в журнале сборки имеют вид:

error: narrowing conversion of ‘ddd’ from ‘int’ to ‘char’ inside { } [-Wnarrowing]

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

Ошибки возникают из-за того, чтоwxGTK2-2.8.12-выпущен в марте 2011 г. -был написан для компиляции по более раннему стандарту C++ (C++98, то есть C++ 1998 )чем стандарт, который используется по умолчанию для вашего компилятора g++,сейчас в июле 2017. Я предполагаю, что у вас есть компилятор g++6 или более поздней версии, который по умолчанию использует C++14 (C++ 2014 ). Начиная со стандарта C++11, сужающее преобразование, которое нарушает вашу сборку был признан плохо -сформированным, чего раньше не было.

Вы можете указать g++компилировать в соответствии со стандартом C++ по вашему выбору, передав ему опцию -std={c++98|c++03|c++11|c++14|c++17}, и вы можете передайте свой выбор скрипту wxGTK2-2.8.12configure, включив его в значение параметра CXXFLAGSдля ./configure. Любой из -std=c++98или -std=c++03удалит ошибки преобразования сужения, например.

../configure CXXFLAGS=-std=c++03 --prefix=/opt/wx/2.8 --enable-xrc --enable-monolithic --enable-unicode

В качестве альтернативы вы можете просто дать указание g++подавить диагностику, обозначенную-Wnarrowing:

../configure CXXFLAGS=-Wno-narrowing --prefix=/opt/wx/2.8 --enable-xrc --enable-monolithic --enable-unicode

Скрипт ./configureлюбого пакета GNU autotools (, такой как вы пытаетесь сборка )будет иметь параметры, включая:

CC          C compiler command
CFLAGS      C compiler flags
LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
          nonstandard directory <lib dir>
CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
          headers in a nonstandard directory <include dir>
CPP         C preprocessor
CXX         C++ compiler command
CXXFLAGS    C++ compiler flags

, которые помогут вам скорректировать отклонения между вашей цепочкой инструментов и значения по умолчанию, которые ожидались сопровождающими пакета при выпуске упаковка. См. ./configure --help.

0
27.08.2019, 11:30
2 ответа

Вы можете использоватьawk:

#! /bin/sh -
x=5678 y=1000
awk -- 'BEGIN{printf "%.3f\n", ARGV[1]/ARGV[2]}' "$x" "$y"

Будете ли вы получать 5.678или 5,678, будет зависеть от локали ($LC_ALL, $LC_NUMERIC, $LANGпеременных )и реализации awk(, некоторые из которых будут использовать .независимо от региона ).

В реализации GNU awkвам необходимо передать переменную POSIXLY_CORRECTв ее окружение, чтобы она учитывала локаль для десятичного символа системы счисления.

Это также относится к входным числам:

$ LC_ALL=fr_FR.UTF-8 POSIXLY_CORRECT=1 gawk -- 'BEGIN{
   printf "%.3f\n", ARGV[1]/ARGV[2]}' 1,2 10
0,120
$ LC_ALL=fr_FR.UTF-8 POSIXLY_CORRECT=1 gawk -- 'BEGIN{
   printf "%.3f\n", ARGV[1]/ARGV[2]}' 1.2 10
0,100

(в этом последнем случае 1.2интерпретировалось как 1, потому что при явном преобразовании строки в число (, как при использовании арифметического оператора /здесь ), awkанализирует как можно большую часть строки, если она составляет допустимое число, а остальное игнорирует. Это .2не понимается в этой французской локали, поскольку десятичная система счисления там ,, а не.).

--, чтобы отметить конец опций, необходим в реализации busybox awk, которую вы, кажется, используете, поскольку она принимает опции после аргументов опций, отличных от -, что делает ее не -POSIX. совместимый. Без него вышеуказанное не сработало бы, если бы $xили $yбыли отрицательными числами.

В качестве альтернативы, вы можете снова установить $POSIXLY_CORRECT, что заставит его анализировать свои параметры стандартным способом. Отметим, что в любом случаеbusybox awkвсегда использует .в качестве десятичного символа системы счисления независимо от локали и независимо от $POSIXLY_CORRECT.

3
28.01.2020, 02:17

вы можете использовать следующий dcфрагмент, чтобы получить результат:

$ dc -e "3k $x 1000/p"
1
28.01.2020, 02:17

Теги

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