Je travaille sur une application qui fonctionne avec différentes versions de systèmes d'exploitation Unix et Windows 32 bits et 64 bits.
J'utilise le type de données long double
. Lorsque je fais sprintf()
et que j'utilise long double
avec %lf
, cela fonctionne correctement avec Windows ne donne aucun type d'erreur, mais sur la plate-forme Solaris, il crée un vidage mémoire.
Voici un exemple de code pour le même problème.
void main(){
string size = "16622";
string sizeFact = "20";
long long sizeLongLong = strtoll(size);
int factInt = atoi(sizeFact);
long double sizeLongDouble = (long double) sizeLongLong/pow(2, factInt);
char buf[512];
sprintf(buf, "%.3lf %s", sizeLongDouble, "str");
}
Comme mentionné ci-dessus, le code fonctionne bien sous Windows 32 bits et 64 bits, mais pour Sprintf, il me donne le cœur sous Solaris.
J'ai essayé le casting avec sprintf, cela a bien fonctionné.
sprintf(buf, "%.3lf %s", (double) sizeLongDouble, "str");
Quel est le spécificateur de format pour long double
?
Quelle est l'erreur que je fais ici, est-ce que j'utilise un spécificateur de format incorrect à cause duquel il donne un noyau?
Pourquoi dois-je taper cast une fois de plus dans sprintf ()?
Pour long double
, vous devez utiliser le format "%Lf"
. Le formatage avec un petit L (c.-à-d. "%lf"
) n’a aucun effet sur les systèmes POSIX (voir la spécification ).
La documentation rend ceci assez clair:
L
Une conversion suivante a, A, e, E, f, F, g ou G correspond à un double argument long. (C99> autorise% LF, mais pas SUSv2.)
Donc, vous devriez utiliser %Lf
.
J'ajouterais ceci comme commentaire mais je ne peux pas le faire pour le moment. Il est également important de noter que vous pouvez également utiliser la notation exponentielle 'p' pour long double
de cette manière:
%Lf
%Le
%La
En fonction du compilateur, j'ai vu %Lf
et %llf
essayer les deux et voir lequel fonctionne. Le %lf
que vous utilisez est le spécificateur de format pour double
pas pour long double
. Je crois que sur g++
, vous devriez utiliser %llf
, tandis que sur Visual Studio, il s'agit de %Lf
.