Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1414 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Problème avec les types de variables en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Problème avec les types de variables en C

n°1027143
bottedumal
open the Doors
Posté le 28-03-2005 à 10:45:27  profilanswer
 

Hello !
 
Voilà je suis vraiment débutant en c mais j'ai un petit problème que je n'arrives pas à résoudre :(
 
Donc j'ai fait un programme qui est censé appliquer une formule mathématique pour un nombre n donné, le problème étant qu'il doivent fonctionner pour un nombre n très grand.
 
Donc j'avais d'abord fait le programme avec des int et float, et il saturait quand n dépassait les 36000 environ.
 
Ensuite, j'ai demandé conseil à un prof de c, et on a obtenu le programme suivant, qui marche impecc sur des stations sun : (quasiment le même que le mien, mais avec des long int, des long double etc...)
 
 

Code :
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <windows.h>
  4. #define PI 3.14159265358979323
  5. main()
  6. {
  7.    
  8.         /*définition des variables*/ 
  9.          unsigned long k,n;
  10.          double somme,densite;
  11.        
  12.                 char texte1[20] = "densité";
  13.          char texte2[20] = "à";
  14.          char texte3[20] = "carrée";
  15.          char texte4[20] = "sphères";
  16.          char texte5[20] = "arrête";
  17.          char texte6[20] = "Réalisé";
  18.          CharToOem(texte1,texte1);
  19.          CharToOem(texte2,texte2);
  20.          CharToOem(texte3,texte3);
  21.          CharToOem(texte4,texte4);
  22.          CharToOem(texte5,texte5);
  23.          CharToOem(texte6,texte6);
  24.    
  25.         debut:
  26.        
  27.         /*demande de la valeur de n*/
  28.          printf ("Veuillez entrer le nombre de %s que comporte une %s de la base: ",texte4,texte5);
  29.          scanf ("%lu", &n);
  30.         /*calcul de la somme*/
  31.          somme=0.0;
  32.          for(k=0;k<=n;k++)
  33.          somme+=(double)k*k;
  34.         /*calcul de la densité*/
  35.          densite=(somme*4*PI)/((2*n+sqrt(2))*(2*n+sqrt(2))*(n*sqrt(2)+1));
  36.        /*affichage du résultat*/
  37.          printf("\nLa %s de l'empilement est   %.12Lf\n",texte1,densite);
  38.          printf("A l'infini, la %s serait de 0.740480489693\n\n",texte1);
  39.          goto debut;
  40. }


 
On en arrive à mon problème : ce programme marche impecc quand je le compile sur station sun (avec gcc), et il foire (le résultat que le programme donne est débile) quand je le compile sous windows avec dev c++ (qui utilise pourtant gcc aussi [:airforceone]).
 
Après avoir cherché un peu, je pense que le problème vient de la déclaration des variable (peut être ne faut il pas mettre de long double?) ou de l'affichage des variables (les %.10Lf sont peut être pas reconnus avec dev c++? Pourtant la compilation se passe nickel)
 
Voilà, en vous remerciant d'avance :jap:


Message édité par bottedumal le 28-03-2005 à 19:03:39
mood
Publicité
Posté le 28-03-2005 à 10:45:27  profilanswer
 

n°1027157
bottedumal
open the Doors
Posté le 28-03-2005 à 11:05:56  profilanswer
 

annadivx a écrit :

En effet,
 
long double prends 8 octets (soit 64 bits),
c'est donc (intuitivement) dépendant du système.
C'est ce que me dit le gcc/MacOSX.
 
 

Code :
  1. [root] ~/Desktop/test $ cc uutest.c -o uutest && ./uutest
  2. uutest.c: In function `main':
  3. uutest.c:17: warning: use of `long double' type; its size may change in a future release
  4. uutest.c:17: warning: (Long double usage is reported only once for each file.
  5. uutest.c:17: warning: To disable this warning, use -Wno-long-double.)
  6. entrer une valeur de l'arete de la base: 67
  7. la densite est: 0.7336658973
  8. sizeof(long double) = 8
  9. [root] ~/Desktop/test $



 
 
Merci de cette réponse rapide :jap:
 
Apperement le programme marche chez toi car la densité est censée tendre vers 0.74 et quelque (normalement avec des très gros nombres la valeur est à peu près stable).
 
Pour l'histoire du long double, que devrais je mettre à la place ?

n°1027175
bottedumal
open the Doors
Posté le 28-03-2005 à 11:35:34  profilanswer
 

Super, en double ca marche pas mal du tout :)
Merci beaucoup.
 
En fait, le long double ne peut fonctionner que sur des machines 64 bits ? Et les stations sun sont donc en 64 bits ?
 
J'aurais appris un truc sympa en tout cas grace à ce problème :d

n°1027178
bottedumal
open the Doors
Posté le 28-03-2005 à 11:38:39  profilanswer
 

Et une autre petite question, j'en profite :)
 
Peut-on afficher des caractères accentués dans printf ?

n°1027216
bottedumal
open the Doors
Posté le 28-03-2005 à 12:34:03  profilanswer
 

J'ai trouvé pour les caractères accentués, il faut utiliser la fonction chartooem afin de convertir le texte en un format utilisable dans printf :)
 
Mon programme ressemble enfin à quelque chose, merci beaucoup annadivx :jap:

n°1027261
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-03-2005 à 13:27:28  profilanswer
 

bottedumal a écrit :


Ensuite, j'ai demandé conseil à un prof de c, et on a obtenu le programme suivant, qui marche impecc sur des stations sun : (quasiment le même que le mien, mais avec des long int, des long double etc...)


Et il t'a dit de faire ça:


unsigned long k,n;
scanf ("%d", &n);


Change d'école... "%d" attend l'adresse d'un int, pas d'un long. Pour un long, il faut mettre "%ld". Pour un unsigned long, c'est "%lu".

"déclaration des variables


C'est pas comme ça qu'on défini un commentaire en C... Et il vaut mieux éviter les accents...

/* declaration des variables */


D'autre part, c'est pas déclaration mais definition, et en plus, une définition de variable, c'est évident et ça peut se faire au début de n'importe quel bloc. Ce commentaire est donc inutile...


Message édité par Emmanuel Delahaye le 28-03-2005 à 14:21:13

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1027284
cricri_
Posté le 28-03-2005 à 13:42:01  profilanswer
 

Ah ouaih .. je dois avoir un pb de vocabulaire moi ...
Pour moi la déclaration c'est ça : int nToto;
c'est à dire que quand il y a déclaration il y a allocation.
 
alors que lorsqu'on definit un truc, il n'y a pas allocation.
genre : typedef toto int
ou bien :
 
class CToto
{
...
};
 
 
 

n°1027295
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-03-2005 à 13:50:59  profilanswer
 

cricri_ a écrit :

Ah ouaih .. je dois avoir un pb de vocabulaire moi ...
Pour moi la déclaration c'est ça : int nToto;
c'est à dire que quand il y a déclaration il y a allocation.
 
alors que lorsqu'on definit un truc, il n'y a pas allocation.
genre : typedef toto int
ou bien :
 
class CToto
{
...
};


Pas du C...
 
Définition d'un objet

int x;


Déclaration d'un objet

extern int x;


Définition d'une fonction

int f(void)
{
}


Déclaration d'une fonction

int f();


Déclaration d'une fonction (prototype)

int f(void);



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1027297
Sve@r
Posté le 28-03-2005 à 13:54:23  profilanswer
 

cricri_ a écrit :

Ah ouaih .. je dois avoir un pb de vocabulaire moi ...
Pour moi la déclaration c'est ça : int nToto;
c'est à dire que quand il y a déclaration il y a allocation.
 
alors que lorsqu'on definit un truc, il n'y a pas allocation.
genre : typedef toto int
ou bien :
 
class CToto
{
...
};


 
La déclaration, c'est indiquer au compilo tout ce que tu utilises, même si la mémoire associée est définie ailleurs.


extern int nToto;
int func(void);
class cToto;


Ca ce sont des déclarations, pas des définitions
 
La définition, c'est créer la variable ou le code de tes fonctions ou de tes objets (c++)

class CToto
{
...
};
int nToto;
int func(void)
{
...
return(0);
}


 
Edited: Désolé Emmanuel, on a répondu en même temps...


Message édité par Sve@r le 28-03-2005 à 13:55:43

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1027301
Taz
bisounours-codeur
Posté le 28-03-2005 à 14:00:11  profilanswer
 

Emmanuel Delahaye a écrit :



unsigned long k,n;
scanf ("%d", &n);


Change d'école... "%d" attend l'adresse d'un int, pas d'un long. Pour un long, il faut mettre "%ld".


voire %lu

mood
Publicité
Posté le 28-03-2005 à 14:00:11  profilanswer
 

n°1027304
Sve@r
Posté le 28-03-2005 à 14:04:41  profilanswer
 


[:aloy]  :D


Message édité par Sve@r le 28-03-2005 à 14:05:05

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1027305
bottedumal
open the Doors
Posté le 28-03-2005 à 14:04:53  profilanswer
 

annadivx a écrit :

c'est moi qui te remercie pour ta confiance :)


 
:jap:

n°1027310
bottedumal
open the Doors
Posté le 28-03-2005 à 14:11:58  profilanswer
 

Emmanuel Delahaye a écrit :

[Merci d'apprendre à utiliser les balises pour le code. Séléctionner, puis boutons [Fixe] ou  [C/C++]. C'est expliqué dans les regles du forum que tu n'as pas lues...]
 
Et il t'a dit de faire ça:


unsigned long k,n;
scanf ("%d", &n);


Change d'école... "%d" attend l'adresse d'un int, pas d'un long. Pour un long, il faut mettre "%ld".

"déclaration des variables


C'est pas comme ça qu'on défini un commentaire en C... Et il vaut mieux éviter les accents...

/* declaration des variables */


D'autre part, c'est pas déclaration mais definition, et en plus, une définition de variable, c'est évident et ça peut se faire au début de n'importe quel bloc. Ce commentaire est donc inutile...


 
Désolé pour la balise, j'ai corrigé !
 
Au niveau du %d dans le scanf, je vais essayer avec le %ld, enfin ceci dit ca fonctionne avec le %d, même si c'est quelque part incorrect. Changer d'école ... C'est un peu radical :lol: Y'a pas beaucoup de MPSI qui propose d'apprendre le C, donc même si le prof est mauvais, je m'en contente largement :)  
 
Pour le commentaire, je les avaient mis sur le forum pour la compréhension du programme, mais je me suis en effet rendu compte quand j'ai voulu compiler que la syntaxe était mauvaise :/ Quand tu dit qu'il faut éviter les accents, c'est dans le programme, mais dans les commentaires il y a des risques à en mettre ?

n°1027318
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-03-2005 à 14:18:09  profilanswer
 


Exact, je complète.


Message édité par Emmanuel Delahaye le 28-03-2005 à 14:22:23

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1027325
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-03-2005 à 14:28:12  profilanswer
 

bottedumal a écrit :

Désolé pour la balise, j'ai corrigé !


mais pas dans ton post original...

Citation :


Au niveau du %d dans le scanf, je vais essayer avec le %ld, enfin ceci dit ca fonctionne avec le %d,  


Non. Comportement indéfini.

Citation :


Pour le commentaire, je les avaient mis sur le forum pour la compréhension du programme, mais je me suis en effet rendu compte quand j'ai voulu compiler que la syntaxe était mauvaise


What ? Tu postes du code que tu n'as pas compilé ? Tu te prends pour un génie ou quoi ? On fait tous des erreurs!

Citation :


 :/ Quand tu dit qu'il faut éviter les accents, c'est dans le programme, mais dans les commentaires il y a des risques à en mettre ?


Oui. Les caractères portables du C sont décrits ici :
 
http://mapage.noos.fr/emdel/codage.htm


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1027354
bottedumal
open the Doors
Posté le 28-03-2005 à 15:18:49  profilanswer
 

Emmanuel Delahaye a écrit :

mais pas dans ton post original...

Citation :


Au niveau du %d dans le scanf, je vais essayer avec le %ld, enfin ceci dit ca fonctionne avec le %d,  


Non. Comportement indéfini.

Citation :


Pour le commentaire, je les avaient mis sur le forum pour la compréhension du programme, mais je me suis en effet rendu compte quand j'ai voulu compiler que la syntaxe était mauvaise


What ? Tu postes du code que tu n'as pas compilé ? Tu te prends pour un génie ou quoi ? On fait tous des erreurs!

Citation :


 :/ Quand tu dit qu'il faut éviter les accents, c'est dans le programme, mais dans les commentaires il y a des risques à en mettre ?


Oui. Les caractères portables du C sont décrits ici :
 
http://mapage.noos.fr/emdel/codage.htm


 
Heuresement que annadivx nous à laissé quelque post, sinon on pourrait se demander si l'aimabilité est interdite dans cette sous cat :ouch:  
 
- J'ai pourtant l'impression que la balise à été corrigée dans le post original, je voie pas quoi faire d'autre, désolé [:airforceone]  
 
- Si je viens sur un forum de programmation, poser une question qui n'a à priori rien d'excessivement difficile, même si je n'arrive pas à y trouver la réponse, c'est que je dois pas me prendre pour un génie... D'autre part, se tromper de syntaxe pour les commentaires, quelle erreur de programmation ... J'aurais du compiler avant pour vérifier en effet, je suis désolé si tu as mis beaucoup de temps avant de comprendre que les " précédaient des commentaires ...
 
-Merci pour le lien.
 
Bon, ceci dit j'ai résolu mon erreur, donc merci pour votre aide :jap:

n°1027367
Taz
bisounours-codeur
Posté le 28-03-2005 à 15:39:24  profilanswer
 

Emmanuel Delahaye a écrit :


Citation :


Au niveau du %d dans le scanf, je vais essayer avec le %ld, enfin ceci dit ca fonctionne avec le %d,  


Non. Comportement indéfini.


c'est marrant, moi j'aurais dit "bug grave"

n°1027368
Sve@r
Posté le 28-03-2005 à 15:40:19  profilanswer
 

bottedumal a écrit :

Heuresement que annadivx nous à laissé quelque post, sinon on pourrait se demander si l'aimabilité est interdite dans cette sous cat :ouch:  
 
- J'ai pourtant l'impression que la balise à été corrigée dans le post original, je voie pas quoi faire d'autre, désolé [:airforceone]


 
Tu as le droit, quand tu es auteur d'un post, de le reprendre pour le corriger (petit bouton "Editer le message" juste à droite de la phrase "posté le ..." ).
Donc Emmanuel t'a juste demandé de corriger ton premier post et mettre des commentaires type "C"
 
En ce qui concerne l'amabilité... ben t'as de la chance d'être tombé sur Emmanuel et, même si t'en n'a pas l'impression, ben ses posts étaient peut-être humoristiques mais quand-même gentils. Tu serais tombé sur le "Taz des mauvais jours" (je crois que la Lune y est pour qq chose) là t'aurais vraiment compris ta douleur... ;)


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1027373
bottedumal
open the Doors
Posté le 28-03-2005 à 15:49:35  profilanswer
 

Sve@r a écrit :

Tu as le droit, quand tu es auteur d'un post, de le reprendre pour le corriger (petit bouton "Editer le message" juste à droite de la phrase "posté le ..." ).
Donc Emmanuel t'a juste demandé de corriger ton premier post et mettre des commentaires type "C"
 
En ce qui concerne l'amabilité... ben t'as de la chance d'être tombé sur Emmanuel et, même si t'en n'a pas l'impression, ben ses posts étaient peut-être humoristiques mais quand-même gentils. Tu serais tombé sur le "Taz des mauvais jours" (je crois que la Lune y est pour qq chose) là t'aurais vraiment compris ta douleur... ;)


 
Bah écoutes je maintiens que j'ai édité mon message dès qu'il m'a fait la remarque, si vous voyez toujours l'ancien titre, bah je comprends pas pourquoi :/

n°1027375
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-03-2005 à 15:54:59  profilanswer
 

bottedumal a écrit :

Bah écoutes je maintiens que j'ai édité mon message dès qu'il m'a fait la remarque, si vous voyez toujours l'ancien titre, bah je comprends pas pourquoi :/


C'est pas un problème de titre. C'est un problème de présentation. Dans ton message, tu as mis du code 'en vrac'. Sur un forum de programmation, ça se fait pas (indentations non respectées etc.)
 
On te demande donc gentiment, aimablement et calmement de bien vouloir encadrer le code avec les balises 'fixed' ou 'cpp', comme indiqué dans les regles du forum que tu aurais du lire.
 
Pas de balise :  
 
#include <stdio.h>
int main (void)
{
   puts ("hello world" );
   return 0;
}
 
Balises 'fixed'


#include <stdio.h>
int main (void)
{
   puts ("hello world" );
   return 0;
}


Balises 'cpp' (j'aime pas)

Code :
  1. #include <stdio.h>
  2. int main (void)
  3. {
  4.    puts ("hello world" );
  5.    return 0;
  6. }



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1027377
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-03-2005 à 15:57:08  profilanswer
 

Taz a écrit :

c'est marrant, moi j'aurais dit "bug grave"


Un comportement indéfini est un bug grave. D'autant plus grave que son effet n'est pas toujours visible.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1027384
Taz
bisounours-codeur
Posté le 28-03-2005 à 16:06:19  profilanswer
 

je voulais juste souligner le fait que c'est un bug grave justement. Parce que pour beaucoup "comportement indéfini" ça veut dire "par chance ça marche sur mon système, donc c'est OK"


Message édité par Taz le 28-03-2005 à 16:07:13
n°1027394
bottedumal
open the Doors
Posté le 28-03-2005 à 16:17:57  profilanswer
 

Emmanuel Delahaye a écrit :

C'est pas un problème de titre. C'est un problème de présentation. Dans ton message, tu as mis du code 'en vrac'. Sur un forum de programmation, ça se fait pas (indentations non respectées etc.)
 
On te demande donc gentiment, aimablement et calmement de bien vouloir encadrer le code avec les balises 'fixed' ou 'cpp', comme indiqué dans les regles du forum que tu aurais du lire.
 
Pas de balise :  
 
#include <stdio.h>
int main (void)
{
   puts ("hello world" );
   return 0;
}
 
Balises 'fixed'


#include <stdio.h>
int main (void)
{
   puts ("hello world" );
   return 0;
}


Balises 'cpp' (j'aime pas)

Code :
  1. #include <stdio.h>
  2. int main (void)
  3. {
  4.    puts ("hello world" );
  5.    return 0;
  6. }



 
Ok, je pensais que tu parlais de la balise du titre "[C]" que j'avais oublié.
 
Je corrige ca tout de suite.
 
Désolé ;)

n°1027423
Sve@r
Posté le 28-03-2005 à 16:52:15  profilanswer
 

bottedumal a écrit :

Ok, je pensais que tu parlais de la balise du titre "[C]" que j'avais oublié.
 
Je corrige ca tout de suite.
 
Désolé ;)


 
Si, en plus, tu pouvais gentiment remplacer les commentaires

" Ceci est un commentaire

par des lignes de ce style

/* Ceci est un commentaire */

ou même

// Ceci est un commentaire

ce serait vraiment extra...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1027429
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-03-2005 à 17:05:23  profilanswer
 

Sve@r a écrit :

Si, en plus, tu pouvais gentiment remplacer les commentaires

" Ceci est un commentaire

par des lignes de ce style

/* Ceci est un commentaire */

ou même

// Ceci est un commentaire

ce serait vraiment extra...


et refaire l'indentation...
 
http://www.gnu.org/software/indent/indent.html
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Problème avec les types de variables en C

 

Sujets relatifs
[SQL] Je sais pas comment formuler mon probleme ! Problème pour trier une dataview
Fixer un menu (probleme en fonction de la resolution)probleme de saisie avec cin.getline()
Gros probleme format date, de l'aide !!![wxWidget] Problème avec EVT_CHAR
[PHP] Probleme tout simple.probleme de bbcode
Problème pour trier une dataviewProblème de \n
Plus de sujets relatifs à : [C] Problème avec les types de variables en C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR