Discussion:
[OpenIndiana-discuss] Compiling KeepassXC on Hipster
b***@chez.com
2018-12-03 03:07:34 UTC
Permalink
Hello,

I'm trying to compile KeepassXC from source using gcc-7 but I fall onto
the following issue :

[ 53%] Building CXX object
src/CMakeFiles/keepassx_core.dir/totp/totp.cpp.o
/home/ben/tmp/keepassxc-2.3.4/src/totp/totp.cpp: In static member
function 'static QString Totp::generateTotp(QByteArray, quint64, quint8,
quint8)':
/home/ben/tmp/keepassxc-2.3.4/src/totp/totp.cpp:167:62: error: call of
overloaded 'pow(int, quint8&)' is ambiguous
quint32 digitsPower = pow(encoder.alphabet.size(), digits);
^
In file included from /usr/include/math.h:32:0,
from /usr/gcc/7/include/c++/7.3.0/bits/std_abs.h:40,
from /usr/gcc/7/include/c++/7.3.0/cstdlib:77,
from /usr/gcc/7/include/c++/7.3.0/bits/stl_algo.h:59,
from /usr/gcc/7/include/c++/7.3.0/algorithm:62,
from /usr/lib/qt/5.8/include/QtCore/qglobal.h:108,
from /home/ben/tmp/keepassxc-2.3.4/src/totp/totp.h:22,
from
/home/ben/tmp/keepassxc-2.3.4/src/totp/totp.cpp:19:
/usr/include/iso/math_iso.h:84:15: note: candidate: double
std::pow(double, double)
extern double pow __P((double, double));
^~~
/usr/include/iso/math_iso.h:161:16: note: candidate: double
std::pow(double, int)
inline double pow(double __X, int __Y) { return
^~~
/usr/include/iso/math_iso.h:181:15: note: candidate: float
std::pow(float, float)
inline float pow(float __X, float __Y) { return __powf(__X, __Y); }
^~~
/usr/include/iso/math_iso.h:182:15: note: candidate: float
std::pow(float, int)
inline float pow(float __X, int __Y) { return
^~~
/usr/include/iso/math_iso.h:212:21: note: candidate: long double
std::pow(long double, long double)
inline long double pow(long double __X, long double __Y) { return
^~~
/usr/include/iso/math_iso.h:214:21: note: candidate: long double
std::pow(long double, int)
inline long double pow(long double __X, int __Y) { return
^~~
gmake[2]: *** [src/CMakeFiles/keepassx_core.dir/build.make:1545:
src/CMakeFiles/keepassx_core.dir/totp/totp.cpp.o] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:230:
src/CMakeFiles/keepassx_core.dir/all] Error 2
gmake: *** [Makefile:141: all] Error 2

I think KeepassXC code expect pow coming from
/usr/gcc/7/include/c++/7.3.0/complex.h rather than
/usr/include/iso/math_iso.h

I tried to shuffle around the -I on the compiler command line but it
doesn't seem to have any impact

Compile command is :

cd /home/franck/tmp/keepassxc-2.3.4/build/src && /usr/bin/g++-7
-DKEEPASSX_BUILDING_CORE -DQT_CONCURRENT_LIB -DQT_CORE_LIB -DQT_DBUS_LIB
-DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG
-DQT_NO_EXCEPTIONS -DQT_STRICT_ITERATORS -DQT_WIDGETS_LIB
-I/home/franck/tmp/keepassxc-2.3.4/build/src/keepassx_core_autogen/include
-I/home/franck/tmp/keepassxc-2.3.4/src
-I/home/franck/tmp/keepassxc-2.3.4/build/src
-I/home/franck/tmp/keepassxc-2.3.4/src/zxcvbn -isystem
/usr/lib/qt/5.8/include -isystem /usr/lib/qt/5.8/include/QtCore -isystem
/usr/lib/qt/5.8/./mkspecs/solaris-g++ -isystem
/usr/lib/qt/5.8/include/QtWidgets -isystem /usr/lib/qt/5.8/include/QtGui
-isystem /usr/lib/qt/5.8/include/QtNetwork -isystem
/usr/lib/qt/5.8/include/QtConcurrent -isystem
/usr/lib/qt/5.8/include/QtDBus -fno-common -Wall -Wextra -Wundef
-Wpointer-arith -Wno-long-long -Wformat=2 -Wmissing-format-attribute
-fvisibility=hidden -fvisibility-inlines-hidden -fstack-protector-strong
-fno-exceptions -fno-rtti -Wnon-virtual-dtor -Wold-style-cast
-Woverloaded-virtual -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
-Werror=format-security -Wcast-align -std=c++11 -O3 -DNDEBUG -fPIC
-std=gnu++11 -o CMakeFiles/keepassx_core.dir/totp/totp.cpp.o -c
/home/franck/tmp/keepassxc-2.3.4/src/totp/totp.cppEPASSX_BUILDING_CORE
-DQT_CONCURRENT_LIB -DQT_CORE_LIB -DQT_DBUS_LIB -DQT_GUI_LIB
-DQT_NETWORK_LIB -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_NO_EXCEPTIONS
-DQT_STRICT_ITERATORS -DQT_WIDGETS_LIB -I/usr/gcc/7/include/c++/7.3.0
-I/home/franck/tmp/keepassxc-2.3.4/build/src/keepassx_core_autogen/include
-I/home/franck/tmp/keepassxc-2.3.4/src
-I/home/franck/tmp/keepassxc-2.3.4/build/src
-I/home/franck/tmp/keepassxc-2.3.4/src/zxcvbn -isystem
/usr/lib/qt/5.8/include -isystem /usr/lib/qt/5.8/include/QtCore -isystem
/usr/lib/qt/5.8/./mkspecs/solaris-g++ -isystem
/usr/lib/qt/5.8/include/QtWidgets -isystem /usr/lib/qt/5.8/include/QtGui
-isystem /usr/lib/qt/5.8/include/QtNetwork -isystem
/usr/lib/qt/5.8/include/QtConcurrent -isystem
/usr/lib/qt/5.8/include/QtDBus -fno-common -Wall -Wextra -Wundef
-Wpointer-arith -Wno-long-long -Wformat=2 -Wmissing-format-attribute
-fvisibility=hidden -fvisibility-inlines-hidden -fstack-protector-strong
-fno-exceptions -fno-rtti -Wnon-virtual-dtor -Wold-style-cast
-Woverloaded-virtual -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
-Werror=format-security -Wcast-align -std=c++11 -O3 -DNDEBUG -fPIC


Best regards.
ben
Alexander Pyhalov via openindiana-discuss
2018-12-03 04:23:12 UTC
Permalink
Hi.

Code likely needs some casts, like in https://github.com/OpenIndiana/oi-userland/blob/oi/hipster/components/library/webkitgtk/patches/03-functions-ambiguity.patch

С уважением,
Александр Пыхалов,
программист отдела телекоммуникационной инфраструктуры
управления информационно-коммуникационной инфраструктуры ЮФУ


________________________________________
От: ***@chez.com <***@chez.com>
Отправлено: 3 декабря 2018 г. 6:07:34
Кому: openindiana-***@openindiana.org
Тема: [OpenIndiana-discuss] Compiling KeepassXC on Hipster

Hello,

I'm trying to compile KeepassXC from source using gcc-7 but I fall onto
the following issue :

[ 53%] Building CXX object
src/CMakeFiles/keepassx_core.dir/totp/totp.cpp.o
/home/ben/tmp/keepassxc-2.3.4/src/totp/totp.cpp: In static member
function 'static QString Totp::generateTotp(QByteArray, quint64, quint8,
quint8)':
/home/ben/tmp/keepassxc-2.3.4/src/totp/totp.cpp:167:62: error: call of
overloaded 'pow(int, quint8&)' is ambiguous
quint32 digitsPower = pow(encoder.alphabet.size(), digits);
^
In file included from /usr/include/math.h:32:0,
from /usr/gcc/7/include/c++/7.3.0/bits/std_abs.h:40,
from /usr/gcc/7/include/c++/7.3.0/cstdlib:77,
from /usr/gcc/7/include/c++/7.3.0/bits/stl_algo.h:59,
from /usr/gcc/7/include/c++/7.3.0/algorithm:62,
from /usr/lib/qt/5.8/include/QtCore/qglobal.h:108,
from /home/ben/tmp/keepassxc-2.3.4/src/totp/totp.h:22,
from
/home/ben/tmp/keepassxc-2.3.4/src/totp/totp.cpp:19:
/usr/include/iso/math_iso.h:84:15: note: candidate: double
std::pow(double, double)
extern double pow __P((double, double));
^~~
/usr/include/iso/math_iso.h:161:16: note: candidate: double
std::pow(double, int)
inline double pow(double __X, int __Y) { return
^~~
/usr/include/iso/math_iso.h:181:15: note: candidate: float
std::pow(float, float)
inline float pow(float __X, float __Y) { return __powf(__X, __Y); }
^~~
/usr/include/iso/math_iso.h:182:15: note: candidate: float
std::pow(float, int)
inline float pow(float __X, int __Y) { return
^~~
/usr/include/iso/math_iso.h:212:21: note: candidate: long double
std::pow(long double, long double)
inline long double pow(long double __X, long double __Y) { return
^~~
/usr/include/iso/math_iso.h:214:21: note: candidate: long double
std::pow(long double, int)
inline long double pow(long double __X, int __Y) { return
^~~
gmake[2]: *** [src/CMakeFiles/keepassx_core.dir/build.make:1545:
src/CMakeFiles/keepassx_core.dir/totp/totp.cpp.o] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:230:
src/CMakeFiles/keepassx_core.dir/all] Error 2
gmake: *** [Makefile:141: all] Error 2

I think KeepassXC code expect pow coming from
/usr/gcc/7/include/c++/7.3.0/complex.h rather than
/usr/include/iso/math_iso.h

I tried to shuffle around the -I on the compiler command line but it
doesn't seem to have any impact

Compile command is :

cd /home/franck/tmp/keepassxc-2.3.4/build/src && /usr/bin/g++-7
-DKEEPASSX_BUILDING_CORE -DQT_CONCURRENT_LIB -DQT_CORE_LIB -DQT_DBUS_LIB
-DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG
-DQT_NO_EXCEPTIONS -DQT_STRICT_ITERATORS -DQT_WIDGETS_LIB
-I/home/franck/tmp/keepassxc-2.3.4/build/src/keepassx_core_autogen/include
-I/home/franck/tmp/keepassxc-2.3.4/src
-I/home/franck/tmp/keepassxc-2.3.4/build/src
-I/home/franck/tmp/keepassxc-2.3.4/src/zxcvbn -isystem
/usr/lib/qt/5.8/include -isystem /usr/lib/qt/5.8/include/QtCore -isystem
/usr/lib/qt/5.8/./mkspecs/solaris-g++ -isystem
/usr/lib/qt/5.8/include/QtWidgets -isystem /usr/lib/qt/5.8/include/QtGui
-isystem /usr/lib/qt/5.8/include/QtNetwork -isystem
/usr/lib/qt/5.8/include/QtConcurrent -isystem
/usr/lib/qt/5.8/include/QtDBus -fno-common -Wall -Wextra -Wundef
-Wpointer-arith -Wno-long-long -Wformat=2 -Wmissing-format-attribute
-fvisibility=hidden -fvisibility-inlines-hidden -fstack-protector-strong
-fno-exceptions -fno-rtti -Wnon-virtual-dtor -Wold-style-cast
-Woverloaded-virtual -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
-Werror=format-security -Wcast-align -std=c++11 -O3 -DNDEBUG -fPIC
-std=gnu++11 -o CMakeFiles/keepassx_core.dir/totp/totp.cpp.o -c
/home/franck/tmp/keepassxc-2.3.4/src/totp/totp.cppEPASSX_BUILDING_CORE
-DQT_CONCURRENT_LIB -DQT_CORE_LIB -DQT_DBUS_LIB -DQT_GUI_LIB
-DQT_NETWORK_LIB -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_NO_EXCEPTIONS
-DQT_STRICT_ITERATORS -DQT_WIDGETS_LIB -I/usr/gcc/7/include/c++/7.3.0
-I/home/franck/tmp/keepassxc-2.3.4/build/src/keepassx_core_autogen/include
-I/home/franck/tmp/keepassxc-2.3.4/src
-I/home/franck/tmp/keepassxc-2.3.4/build/src
-I/home/franck/tmp/keepassxc-2.3.4/src/zxcvbn -isystem
/usr/lib/qt/5.8/include -isystem /usr/lib/qt/5.8/include/QtCore -isystem
/usr/lib/qt/5.8/./mkspecs/solaris-g++ -isystem
/usr/lib/qt/5.8/include/QtWidgets -isystem /usr/lib/qt/5.8/include/QtGui
-isystem /usr/lib/qt/5.8/include/QtNetwork -isystem
/usr/lib/qt/5.8/include/QtConcurrent -isystem
/usr/lib/qt/5.8/include/QtDBus -fno-common -Wall -Wextra -Wundef
-Wpointer-arith -Wno-long-long -Wformat=2 -Wmissing-format-attribute
-fvisibility=hidden -fvisibility-inlines-hidden -fstack-protector-strong
-fno-exceptions -fno-rtti -Wnon-virtual-dtor -Wold-style-cast
-Woverloaded-virtual -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
-Werror=format-security -Wcast-align -std=c++11 -O3 -DNDEBUG -fPIC


Best regards.
ben
Bob Friesenhahn
2018-12-03 14:21:09 UTC
Permalink
Post by b***@chez.com
Hello,
/home/ben/tmp/keepassxc-2.3.4/src/totp/totp.cpp:167:62: error: call of
overloaded 'pow(int, quint8&)' is ambiguous
quint32 digitsPower = pow(encoder.alphabet.size(), digits);
What is the declared storage type of the 'digits' argument? From
reading the header, it appears that it must be of type 'int', 'float',
or 'double'. Any other type would require a type transformation which
might be ambiguous.

Bob
--
Bob Friesenhahn
***@simple.dallas.tx.us, http://www.simplesystems.org/users/bfriesen/
GraphicsMagick Maintainer, http://www.GraphicsMagick.org/
Public Key, http://www.simplesystems.org/users/bfriesen/public-key.txt
b***@chez.com
2018-12-03 20:28:07 UTC
Permalink
Thanks Bob and Alexander, I think I start to understand.

grep digits ../../src/totp/totp.cpp
[...]
quint8 digits = encoder.digits == 0 ? numDigits : encoder.digits;
[...]

From my 30 years old rusty knowledge of C++, this mean that digits is
supposed to be a 'quint8' which is most probably QT version of the 'int'
and as Bob noticed the pow function expects 'int', 'float', or 'double'

From Alexander reference, I should have
quint32 digitsPower = pow(encoder.alphabet.size(), int(digits));

In that particular case it was 'encoder.alphabet.size()' which appeared
ambiguous, using 'double (encoder.alphabet.size())' made it. 'digits'
was ok so far

Bottom line is I could compile and execute it, it is nice to have it
native (works with wine).

Thanks both of you.
Best regards.
Ben
Post by Bob Friesenhahn
Post by b***@chez.com
Hello,
/home/ben/tmp/keepassxc-2.3.4/src/totp/totp.cpp:167:62: error: call of
overloaded 'pow(int, quint8&)' is ambiguous
quint32 digitsPower = pow(encoder.alphabet.size(), digits);
What is the declared storage type of the 'digits' argument? From
reading the header, it appears that it must be of type 'int', 'float',
or 'double'. Any other type would require a type transformation which
might be ambiguous.
Bob
Till Wegmüller
2018-12-03 20:29:44 UTC
Permalink
Nice work.

I would also be interested in it.

Could you Publish a patch or put a makefile into OI Userland?

Thanks and Greetings
Till
Post by b***@chez.com
Thanks Bob and Alexander, I think I start to understand.
grep digits ../../src/totp/totp.cpp
[...]
quint8 digits = encoder.digits == 0 ? numDigits : encoder.digits;
[...]
From my 30 years old rusty knowledge of C++, this mean that digits is
supposed to be a 'quint8' which is most probably QT version of the 'int'
and as Bob noticed the pow function expects 'int', 'float', or 'double'
From Alexander reference, I should have
quint32 digitsPower = pow(encoder.alphabet.size(), int(digits));
In that particular case it was 'encoder.alphabet.size()'  which appeared
ambiguous, using 'double (encoder.alphabet.size())' made it. 'digits'
was ok so far
Bottom line is I could compile and execute it, it is nice to have it
native (works with wine).
Thanks both of you.
Best regards.
Ben
Post by b***@chez.com
Hello,
/home/ben/tmp/keepassxc-2.3.4/src/totp/totp.cpp:167:62: error: call
of overloaded 'pow(int, quint8&)' is ambiguous
quint32 digitsPower = pow(encoder.alphabet.size(), digits);
What is the declared storage type of the 'digits' argument?  From
reading the header, it appears that it must be of type 'int', 'float',
or 'double'.  Any other type would require a type transformation which
might be ambiguous.
Bob
_______________________________________________
openindiana-discuss mailing list
https://openindiana.org/mailman/listinfo/openindiana-discuss
b***@chez.com
2018-12-03 21:38:37 UTC
Permalink
This is not perfect, this is what's left to do :
- 64bits keepassxc and libargon2
- autotype doesn't work, option (menu entries, shortcut) not present

libargon2 compiles out of the box
https://github.com/P-H-C/phc-winner-argon2

cmake :
- cmake linker flags -lsocket -lnsl -lrt -lresolv
- cmake didn't find QT5 config utilities, I had to point it to the
directory
- did compilation with GCC7 but I think default GCC6 should work as well
- due to GCC7, I added -I /usr/gcc/7/include/c++/7.3.0 to CXX_FLAGS

keepassxc patch :
==== cut here ====
--- src/totp/totp.cpp 2018-08-23 03:25:04.000000000 +0000
+++ src/totp/totp.cpp.mod 2018-12-04 09:09:32.413168641 +0000
@@ -164,7 +164,7 @@
direction = 1;
startpos = 0;

}
- quint32 digitsPower = pow(encoder.alphabet.size(), digits);
+ quint32 digitsPower = pow(double (encoder.alphabet.size()),
digits);

quint64 password = binary % digitsPower;
QString retval(int(digits), encoder.alphabet[0]);
==== cut here ====

Best regards.
Ben
Post by Till Wegmüller
Nice work.
I would also be interested in it.
Could you Publish a patch or put a makefile into OI Userland?
Thanks and Greetings
Till
Thanks Bob and Alexander, I think I start to understand.
grep digits ../../src/totp/totp.cpp
[...]
quint8 digits = encoder.digits == 0 ? numDigits : encoder.digits;
[...]
From my 30 years old rusty knowledge of C++, this mean that digits is
supposed to be a 'quint8' which is most probably QT version of the 'int'
and as Bob noticed the pow function expects 'int', 'float', or 'double'
From Alexander reference, I should have
quint32 digitsPower = pow(encoder.alphabet.size(), int(digits));
In that particular case it was 'encoder.alphabet.size()' which appeared
ambiguous, using 'double (encoder.alphabet.size())' made it. 'digits'
was ok so far
Bottom line is I could compile and execute it, it is nice to have it
native (works with wine).
Thanks both of you.
Best regards.
Ben
Hello,
/home/ben/tmp/keepassxc-2.3.4/src/totp/totp.cpp:167:62: error: call
of overloaded 'pow(int, quint8&)' is ambiguous
quint32 digitsPower = pow(encoder.alphabet.size(), digits);
What is the declared storage type of the 'digits' argument? From
reading the header, it appears that it must be of type 'int', 'float',
or 'double'. Any other type would require a type transformation which
might be ambiguous.
Bob
_______________________________________________
openindiana-discuss mailing list
openindiana-***@openindiana.org
https://openindiana.org/mailman/listinfo/openindiana-discuss

_______________________________________________
openindiana-discuss mailing list
openindiana-***@openindiana.org
https://openindiana.org/mailman/listinfo/openindiana-discuss
b***@chez.com
2018-12-04 21:43:53 UTC
Permalink
The issue on autotype is related to QT.
The plugin for autotype doesn't load at start :
$ LANG=en_US.UTF-8 LD_LIBRARY_PATH=/usr/lib/qt/5.8/lib:/usr/local/lib
/usr/local/bin/keepassxc
Qt: Session management error: Could not open network socket
Warning: using insecure memory!
Couldn't load translations.
Unable to load auto-type plugin:
Cannot resolve symbol "qt_plugin_instance" in
/usr/local/lib/keepassxc/libkeepassx-autotype-xcb.so: (ld.so.1:
keepassxc: fatal: qt_plugin_instance: can't find symbol)
QObject::startTimer: Timers cannot have negative interval

I have to add the LD_LIBRARY_PATH for QT, so I suspect I miss a few
other path, though :
/usr/lib/qt/5.8/lib$ LANG=en_US.UTF-8 grep -R qt_plugin_instance *
Binary file amd64/libQt5DesignerComponents.so.5.8.0 matches
Binary file amd64/libQt5DesignerComponents.so.5 matches
Binary file amd64/libQt5Core.so.5.8 matches
Binary file amd64/libQt5DesignerComponents.so matches
Binary file amd64/libQt5DesignerComponents.so.5.8 matches
Binary file amd64/libQt5Core.so.5 matches
Binary file amd64/libQt5Core.so.5.8.0 matches
Binary file amd64/libQt5Core.so matches
Binary file libQt5Core.so matches
Binary file libQt5Core.so.5 matches
Binary file libQt5Core.so.5.8 matches
Binary file libQt5Core.so.5.8.0 matches
Binary file libQt5DesignerComponents.so matches
Binary file libQt5DesignerComponents.so.5 matches
Binary file libQt5DesignerComponents.so.5.8 matches
Binary file libQt5DesignerComponents.so.5.8.0 matches

I'm not sure why it doesn't find the symbol

Best regards.
Ben
Post by b***@chez.com
- 64bits keepassxc and libargon2
- autotype doesn't work, option (menu entries, shortcut) not present
libargon2 compiles out of the box
https://github.com/P-H-C/phc-winner-argon2
- cmake linker flags -lsocket -lnsl -lrt -lresolv
- cmake didn't find QT5 config utilities, I had to point it to the
directory
- did compilation with GCC7 but I think default GCC6 should work as well
- due to GCC7, I added -I /usr/gcc/7/include/c++/7.3.0 to CXX_FLAGS
==== cut here ====
--- src/totp/totp.cpp 2018-08-23 03:25:04.000000000 +0000
+++ src/totp/totp.cpp.mod 2018-12-04 09:09:32.413168641 +0000
@@ -164,7 +164,7 @@
direction = 1;
startpos = 0;
}
- quint32 digitsPower = pow(encoder.alphabet.size(), digits);
+ quint32 digitsPower = pow(double (encoder.alphabet.size()),
digits);
quint64 password = binary % digitsPower;
QString retval(int(digits), encoder.alphabet[0]);
==== cut here ====
Best regards.
Ben
Post by Till Wegmüller
Nice work.
I would also be interested in it.
Could you Publish a patch or put a makefile into OI Userland?
Thanks and Greetings
Till
Thanks Bob and Alexander, I think I start to understand.
grep digits ../../src/totp/totp.cpp
[...]
quint8 digits = encoder.digits == 0 ? numDigits : encoder.digits;
[...]
From my 30 years old rusty knowledge of C++, this mean that digits is
supposed to be a 'quint8' which is most probably QT version of the 'int'
and as Bob noticed the pow function expects 'int', 'float', or 'double'
From Alexander reference, I should have
quint32 digitsPower = pow(encoder.alphabet.size(), int(digits));
In that particular case it was 'encoder.alphabet.size()' which appeared
ambiguous, using 'double (encoder.alphabet.size())' made it. 'digits'
was ok so far
Bottom line is I could compile and execute it, it is nice to have it
native (works with wine).
Thanks both of you.
Best regards.
Ben
Hello,
/home/ben/tmp/keepassxc-2.3.4/src/totp/totp.cpp:167:62: error: call
of overloaded 'pow(int, quint8&)' is ambiguous
quint32 digitsPower = pow(encoder.alphabet.size(), digits);
What is the declared storage type of the 'digits' argument? From
reading the header, it appears that it must be of type 'int', 'float',
or 'double'. Any other type would require a type transformation which
might be ambiguous.
Bob
Loading...