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

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

Marsh Posté le 28-03-2005 à 10:45:27    

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
Reply

Marsh Posté le 28-03-2005 à 10:45:27   

Reply

Marsh Posté le 28-03-2005 à 11:05:56    

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 ?

Reply

Marsh Posté le 28-03-2005 à 11:35:34    

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

Reply

Marsh Posté le 28-03-2005 à 11:38:39    

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

Reply

Marsh Posté le 28-03-2005 à 12:34:03    

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:

Reply

Marsh Posté le 28-03-2005 à 13:27:28    

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/
Reply

Marsh Posté le 28-03-2005 à 13:42:01    

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
{
...
};
 
 
 

Reply

Marsh Posté le 28-03-2005 à 13:50:59    

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/
Reply

Marsh Posté le 28-03-2005 à 13:54:23    

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.
Reply

Marsh Posté le 28-03-2005 à 14:00:11    

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

Reply

Marsh Posté le 28-03-2005 à 14:00:11   

Reply

Marsh Posté le 28-03-2005 à 14:04:41    


[: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.
Reply

Marsh Posté le 28-03-2005 à 14:04:53    

annadivx a écrit :

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


 
:jap:

Reply

Marsh Posté le 28-03-2005 à 14:11:58    

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 ?

Reply

Marsh Posté le 28-03-2005 à 14:18:09    


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/
Reply

Marsh Posté le 28-03-2005 à 14:28:12    

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/
Reply

Marsh Posté le 28-03-2005 à 15:18:49    

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:

Reply

Marsh Posté le 28-03-2005 à 15:39:24    

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"

Reply

Marsh Posté le 28-03-2005 à 15:40:19    

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.
Reply

Marsh Posté le 28-03-2005 à 15:49:35    

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 :/

Reply

Marsh Posté le 28-03-2005 à 15:54:59    

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/
Reply

Marsh Posté le 28-03-2005 à 15:57:08    

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/
Reply

Marsh Posté le 28-03-2005 à 16:06:19    

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
Reply

Marsh Posté le 28-03-2005 à 16:17:57    

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é ;)

Reply

Marsh Posté le 28-03-2005 à 16:52:15    

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.
Reply

Marsh Posté le 28-03-2005 à 17:05:23    

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/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed