Re: [Vala] printf question
- From: Al Thomas <astavale yahoo co uk>
- To: wolfgang mauer kabelmail de, vala-list gnome org
- Subject: Re: [Vala] printf question
- Date: Tue, 9 Oct 2018 16:57:40 +0000 (UTC)
> On Tuesday, 9 October 2018, 16:16:44 BST, wolfgang mauer kabelmail de <wolfgang mauer kabelmail de>
wrote: > Is this a Bug?
cellRendererText.text = ("%"+int64.FORMAT).printf((int64)obj); <<---- int64.FORMAT = "li"
this works, but when i try this, witch is the same
cellRendererText.text = ("%li").printf((int64)obj);
i get thiss error
application.vala:192.45-192.54: error: Argument 1: Cannot convert from `int64' to `long'
I think it should be %lli. Try:
void main () {
int64 a = 1234567890123456789LL;
print ("%li\n".printf ((int32)a));
print ("%lli\n".printf (a));
}
A 'long' is at least 32 bits, a 'long long' is at least 64 bits. A good summary is
https://en.wikipedia.org/wiki/C_data_types
I think that was the conclusion I came to when I wrote that up in the Genie docs:
https://wiki.gnome.org/Projects/Genie#Numbers
int64.FORMAT in Vala is bound to GLib's G_GINT64_FORMAT. See the Vala binding:
https://gitlab.gnome.org/GNOME/vala/blob/master/vapi/glib-2.0.vapi#L687
The GLib documentation advises 'This is the platform dependent conversion specifier for scanningand printing
values of type gint64' See https://developer.gnome.org/glib/2.56/glib-Basic-Types.html#G-GINT64-FORMAT:CAPS
To my mind that is wrong in GLib. Now there may be some platform reason for doing this, but I suggest you
raise an issue with GLib at https://gitlab.gnome.org/GNOME/vala/issues then we can take it from there.
Note how the use of just %li in my code example truncates the number. The Vala compiler is recognising this
in your second example and giving an error. If you cast to int32 it should compile. The Vala compiler has not
been set up to recognise the creation of %li using string concatenation. So it is passed through to the
output C and the C compiler does its thing with a resulting potential loss of data. Is this a bug in the Vala
compiler? May be, but there may also be a limit to how much checking can be coded in to the compiler. Of
course if someone submitted a patch that made it just work then that would be a different story :) BTW to
read the generated C code use the --ccode switch with valac.
Hope that helps,
Al
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]