Pages : 1
#1 Le 08/11/2007, à 09:36
- abdelilah
des long en c récalcitrant
Bonjour tout le monde
je suis un débutant en c et je voulais tester un petit peu printf avec ceci :
#include <stdio.h>
#include <stdlib.h>
main()
{
double soldeBanque = 6500000000 ;
printf("vous avez %ld dirhams en banque", soldeBanque);
return 0;
}
il me sort une erreur comme quoi long n'est pas assez long pour contenir ce chiffre ???
abdel@ubuntu:~/dev-c$ gcc -o variables2 variables2.c
variables2.c: In function ‘main’:
variables2.c:6: warning: integer constant is too large for ‘long’ type
aidez moi svp ça commence vraiment à m'enerver car sur le cour on nous enseigne un truc alors que la pratique
nous autre chose merci d'avance.
<< قال الله تعالى << ما عندكم ينÙØ° Ùˆ ما عند الله باق
A quoi nous sert notre cerveau si on échoue à découvrir le but de notre vie sur terre
Hors ligne
#2 Le 08/11/2007, à 10:02
- maskott
Re : des long en c récalcitrant
je le fais de mémoire... mais tu peux faire
printf("tailles : %i, %i, %i \n",sizeof(char), sizeof(double),sizeof(long double));
pour verifier
char -> 1 octet (8 bits)
int -> 4 octets
double -> 8 octets
long c'est pas plus long en bits, c'est juste que le bit de poid fort (le plus a gauche) ne sers plus à marquer le signe, mais sers "normalement" su coup au lieu d'etre de
-x à x, c'est de 0 à 2x (en gros)
Backups are for wimps. Real men upload their work to an ftp server and have everybody mirror it. - Linus Torvalds
[RESOLU] dans les posts qui le sont, merci
(Et si vous y arrivez tout seul, indiquez aussi la solution, remerci)
Hors ligne
#3 Le 08/11/2007, à 10:04
- maskott
Re : des long en c récalcitrant
mais le double c'est un peu spécial...par ce qu'il prend en compte les virgules (je crois)
pour ton nombre déclare le en long long int
ça doit aller
Backups are for wimps. Real men upload their work to an ftp server and have everybody mirror it. - Linus Torvalds
[RESOLU] dans les posts qui le sont, merci
(Et si vous y arrivez tout seul, indiquez aussi la solution, remerci)
Hors ligne
#4 Le 08/11/2007, à 10:06
- maskott
Re : des long en c récalcitrant
et puis c'est juste un warning, ça compile quand mm, enfin c'est pas propre
Backups are for wimps. Real men upload their work to an ftp server and have everybody mirror it. - Linus Torvalds
[RESOLU] dans les posts qui le sont, merci
(Et si vous y arrivez tout seul, indiquez aussi la solution, remerci)
Hors ligne
#5 Le 08/11/2007, à 11:22
- aganim07
Re : des long en c récalcitrant
Remplace %ld dans ton printf par %f mon poulet des îles
Dernière modification par aganim07 (Le 08/11/2007, à 11:37)
Hors ligne
#6 Le 08/11/2007, à 17:45
- Pierre Maurette
Re : des long en c récalcitrant
double soldeBanque = 6500000000;
Là, vous avez la constante littérale 6500000000 qui va être lue comme un entier puis convertie en double pour être affectée à soldeBanque. Je ne sais pas si c'est normal ou plutôt dû au fait que le long long est mal reconnu par gcc 4.1, toujours est-il que le compilateur n'essaie de le lire que comme un int ou un long au maximum.
Il se trouve que cette valeur est trop grande pour un long sur plateforme 32bits (valeur maxi 2147483647). C'est donc un long long qu'il aurait fallu pour la contenir.
Mais ça va fonctionner si vous précisez le format de la constante:
double soldeBanque = 6500000000LL;
Mais ça n'a pas grand sens d'utiliser une constante entière pour nourrir un double (type à virgule flottante). Autant faire directement:
double soldeBanque = 6500000000.0;
Maintenant que vous avez votre double, vous voudrez l'afficher avec deux chiffres après la virgule:
printf("vous aviez %1.2f dirhams en banque\n", soldeBanque);
printf("vous avez maintenant %.2f dirhams en banque\n", 0.0);
A coté de cet exercice, il y a le problème plus épineux du choix d'un type pour repésenter des valeurs monétaires. Mais ça dépasse le cadre de ce fil. Et en plus, c'est chiant comme la comptabilité. J'imagine, parce que je ne connais pas la comptabilité.
Bon courage
Pierre
Hors ligne
#7 Le 08/11/2007, à 17:59
- Pierre Maurette
Re : des long en c récalcitrant
printf("tailles : %i, %i, %i \n",sizeof(char), sizeof(double),sizeof(long double));
Si vous vous posez souvent ce genre de question (changement de plateforme, de compilo, utilisation de bibliothèques 'alakon', etc.) vous pouvez faire un fichier texte, types.items par exemple:
TYPE(int)
TYPE(long)
TYPE(long long)
TYPE(size_t)
TYPE(void*)
TYPE(float)
TYPE(double)
TYPE(long double)
TYPE(intmax_t)
éditable à la demande. Et dans un .c:
#define TYPE(T) printf("sizeof %-20s = %d\n", #T, sizeof (T));
#include "types.items"
#undef ITEM
C'est magique
Attention, vous ne pouvez pas utiliser le sizeof à la compilation (par le préprocesseur). Raison de plus pour utiliser les innombrables macros mises à votre disposition. Ici, ce pourrait être LONG_MAX, ULONG_MAX, LLONG_MAX, ULLONG_MAX ainsi que le type intmax_t. Malheureusement sur ma version de gcc, en 32bit, LLONG_MAX et ULLONG_MAX ne sont pas implémentées. Et intmax_t renvoie le type long. Alors que long long et unsigned long long (64bit) existent, et fonctionnent bien. On peut tenter un truc comme ça (incomplet et non vérifié):
#ifndef LLONG_MAX
#define ULLONG_MAX ((unsigned long long)ULONG_MAX + 2) * ULONG_MAX
#define LLONG_MAX (long long)(ULLONG_MAX >> 1)
#endif
A+
Pierre
Hors ligne
#8 Le 09/11/2007, à 02:29
- maskott
Re : des long en c récalcitrant
c'est vrai que j'ai déjà eu des problèmes avec les LL et ULL, pas à la compilation, mais en débuggant j'ai vu qu'il faisait sauter les bits de poids fort, je crois que pour le contourner j'avais utilisé des entiers dur 32bits, et redéfinit les opérations dont j'avais besoin, enfin c'était il y a un moment qd mm...
Backups are for wimps. Real men upload their work to an ftp server and have everybody mirror it. - Linus Torvalds
[RESOLU] dans les posts qui le sont, merci
(Et si vous y arrivez tout seul, indiquez aussi la solution, remerci)
Hors ligne
#9 Le 09/11/2007, à 13:37
- _SamSoft_
Re : des long en c récalcitrant
J'arrive un peu trop tard mais je veux absolument corriger un truc
main()
Ce n'est plus valide (même si ca compile [je crois que ca compile encore] )
On écrit aujourd'hui :
int main()
ou
int main(void)
ou en utilisant argc et argv (si besoin seulement)
De plus tu retournes un 0
Bonne prog !
PS: Ne jamais laisser passer des warning aussi importants Certe de temps en temps c'est pas d'une grande utilité style : "unused variable nbr" mais ca peut aider si il met : "[warning] char message[1] est trop petit pour contenir "salut tout le monde !"" par exemple !
Petit conseil que j'ai trouvé sur un super site :
"Par défaut, le niveau d'avertissement (Warnings) est très laxiste. Il est fortement recommandé d'utiliser la configuration minimale suivante :"
-Wall -Wextra -O -Wwrite-strings -Wstrict-prototypes -Wuninitialized
-Wunreachable-code
Le site se trouve à l'adresse : http://mapage.noos.fr/emdel/
Dernière modification par _SamSoft_ (Le 09/11/2007, à 13:42)
if(!physics)
/* nothing */
else
/* everything */
Hors ligne
#10 Le 09/11/2007, à 13:59
- Pierre Maurette
Re : des long en c récalcitrant
en c:
int main(void) { /* ... */ }
ou
int main(int argc, char *argv[]) { /* ... */ } (ou équivalent)
en C++:
int main() { /* ... */ }
ou
int main(int argc, char* argv[]) { /* ... */ }
Dernière modification par Pierre Maurette (Le 09/11/2007, à 14:00)
Hors ligne
#11 Le 09/11/2007, à 14:03
- _SamSoft_
Re : des long en c récalcitrant
Merci à toi pour cette petite modification mais
int main() et int main(void) sont normalisés aussi pour le C
if(!physics)
/* nothing */
else
/* everything */
Hors ligne
#12 Le 09/11/2007, à 14:36
- Pierre Maurette
Re : des long en c récalcitrant
Un compilateur compile les fonctions qu'on lui donne à compiler. Ensuite, le lieur et le chargeur peuvent décider que le point d'entrée, c'est zorglub(), ou plus pragmatiquement WinMain(). D'un autre coté, main(), sans rien d'autre, va généralement fonctionner. int main() fonctionnera je pense toujours en C.
A partir de là, soit on sodomise la drosophyle, soit on laisse uriner le mouton espagnol. Si on choisit le stupre, il n'y a qu'une référence, c'est la norme. Sur celle de C99, c'est au §5.1.2.2.1 Program startup, et il n'y figure aucune allusion à int main().
Rappelons que int foo() se lit en C++ "foo est une fonction qui renvoie un int et ne prend aucun paramètre", et en C "foo est une fonction qui renvoie un int, sans indication des paramètres".
Pierre
Hors ligne
#13 Le 09/11/2007, à 19:10
- _SamSoft_
Re : des long en c récalcitrant
Bien sûr que ca va fonctionner mais ca peut générer des comportements indéfinis car on retourne une valeur à une fonctionne qui n'est pas typée comment voulez vous que ce soit correct c'est comme outrepasser la norme et écrire 1+1+0 = 3 car il y a 3 caracteres !
C'est du délire la norme est fait pour que tout soit harmonieux et fonctionnel il faut donc la suivre !
if(!physics)
/* nothing */
else
/* everything */
Hors ligne
#14 Le 11/11/2007, à 00:20
- abdelilah
Re : des long en c récalcitrant
bonsoir
j'ai posté ce même message sur ce forum :
http://www.developpez.net/forums/showth … ost2638008
peut être que ça pourrait vous enrichir.
merci.
<< قال الله تعالى << ما عندكم ينÙØ° Ùˆ ما عند الله باق
A quoi nous sert notre cerveau si on échoue à découvrir le but de notre vie sur terre
Hors ligne
#15 Le 11/11/2007, à 08:36
- abdelilah
Re : des long en c récalcitrant
Bonjour les gars
enfin j'ai un petit moment pour lire vos réponses merci tout le monde vous êtes vraiment pédagogue,ça m'a beaucoup
avancé je peut tirer un trait sur ce sujet et avancez de l'avant,en tout je ne me suis pas trompé en choisissant linux
comme plateforme d'apprentissage de programmation,étant ouvert bon nombre de personnes nous aide
vive le libre vive le partage.:)
<< قال الله تعالى << ما عندكم ينÙØ° Ùˆ ما عند الله باق
A quoi nous sert notre cerveau si on échoue à découvrir le but de notre vie sur terre
Hors ligne
Pages : 1