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

  FORUM HardWare.fr
  Programmation
  C

  probleme de pure débutant

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

probleme de pure débutant

n°1378191
woard
la tête lunaire
Posté le 31-05-2006 à 15:23:26  profilanswer
 

je suis vraiment un pur débutant et je voudrais savoir pourquoi mon programme ne se compile pas entierement  il s'arrete a  
1-  addition 2-soustraction 3-division 4-multiplication 5- modulo
voici mon programme
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{
  long resultat = 0, nombre1 = 0, nombre2 = 0, choix = 0;
   
  printf("choississez les nombre" );
  scanf(" %d %d",&nombre1,&nombre2);
  printf("choississez l'operation a faire \n" );
  printf("1-  addition 2-soustraction 3-division 4-multiplication 5- modulo" );
  scanf("entrer votre choix %d",&choix);
                if(choix==1)
    {
    printf ("%ld + %ld = %ld\n", nombre1, nombre2, resultat);
    }
                 else if (choix==2)
    {
    printf ("%ld - %ld = %ld\n", nombre1, nombre2, resultat);
    }
 
                 else if (choix==3)
    {
    printf ("%ld / %ld = %ld\n", nombre1, nombre2, resultat);  
    }  
                 else if (choix==4)
    {
    printf ("%ld * %ld = %ld\n", nombre1, nombre2, resultat);  
    }  
                else if (choix==5)
    {
    printf ("%ld % %ld = %ld\n", nombre1, nombre2, resultat);  
    }  
  system("PAUSE" );  
  return 0;
}

mood
Publicité
Posté le 31-05-2006 à 15:23:26  profilanswer
 

n°1378209
Sebou77
French Tech powaa :-)
Posté le 31-05-2006 à 15:48:31  profilanswer
 

heu tu fais un scanf alors il attend que tu lui donne une valeur :heink:
Au lieux de recopier bêtement du code commence par lire un tutorial sur le C ;)

n°1378216
antho1983
Posté le 31-05-2006 à 15:51:17  profilanswer
 

fais un printf ("entrez votre code\n" );
puis scanf("%d",&choix);

n°1378296
woard
la tête lunaire
Posté le 31-05-2006 à 17:28:17  profilanswer
 

sebou je suis en train de lire un tuto sur le C mais j'ai du mal c'est pourquoi je demande de l'aide or si je recopirai je ne vous demanderai pas de l'aide maintenant je vous demande une autre aide (merci antho j'ai réparer mon erreur mm si ce n'était pas tout a fait sa (bien que ce que tu mai di etait vrai)) la je vous demande pourquoi dans mon code les resultat sont toujour = a 0  si j'enleve le resultat = 0 c'est faut et si je met tout simplement resultat sa me fais des calcule faut du genre 45+5=2
merci de l'aide que vous m'apporter ^^

n°1378299
woard
la tête lunaire
Posté le 31-05-2006 à 17:31:01  profilanswer
 

je voulais aussi savoir c'est normal que le C soit vachement dur pour moi (eleve de 1ere S) le C c'est dur pour tout le monde je suis trop jeune ou c'est que je suis pas fait pour l'informatique ^^?

n°1378310
nabbo
Posté le 31-05-2006 à 17:45:47  profilanswer
 

resultat fait toujours zéro car tu ne fais pas l'opération
il faut mettre resultat=nombre1+nombre2;
(par exemple pour l'addition)

n°1378311
0x90
Posté le 31-05-2006 à 17:46:12  profilanswer
 

Si t'arrive pas à comprendre ca intuitivement t'es ptêtre pas "né" pour l'informatique, mais ca exclut pas qu'en bossant tu arrive à de bonnes choses. Mais faudra bosser un peu...


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1378331
franceso
Posté le 31-05-2006 à 18:00:39  profilanswer
 

normal que resultat soit toujours égal à 0 : tu ne remplis jamais sa valeur.
il faut mettre des instructions du genre "resultat = nombre1 + nombre2;" avant tes printf.
 
Par ailleurs
1) tu devrais gérer les cas où l'utilisateur rentre une opération qui n'existe pas
2) il existe en C une structure switch qui t'aiderait sans doute à faire quelque chose de plus propre et plus lisible  

Code :
  1. char op;
  2. switch( choix )
  3. {
  4.   case 1:
  5.     op = '+';
  6.     resultat = nombre1 + nombre2;
  7.     break;
  8.   case 2:
  9.     op = '-';
  10.     resultat = nombre1 - nombre2;
  11.     break;
  12.   /* ... */
  13.    default:   /* l'utilisateur a entré une mauvaise opération */
  14.     op = 0;
  15.     printf( "Opération invalide\n" );
  16. }
  17. if( op != 0 )  /* si l'opération est valide, on affiche le résultat */
  18. {
  19.   printf ("%ld %c %ld = %ld\n", nombre1, op, nombre2, resultat);
  20. }


 
 
 
EDIT: GRILLAID (et d'1/4 d'heure en plus...)

Message cité 1 fois
Message édité par franceso le 31-05-2006 à 18:01:57

---------------
TriScale innov
n°1378391
simple_stu​pid
Keep It Simple Stupid
Posté le 31-05-2006 à 19:59:28  profilanswer
 

woard a écrit :

je voulais aussi savoir c'est normal que le C soit vachement dur pour moi (eleve de 1ere S) le C c'est dur pour tout le monde je suis trop jeune ou c'est que je suis pas fait pour l'informatique ^^?


 
Le C te donne assez de corde pour te pendre.
Si tu étudies ça par plaisir, il n'y a aucune raison pour que tu n'y arrives pas.
Si tu parles anglais, un tuto sympa:
 
http://beej.us/guide/bgc/output/html/index.html
 
Sinon,
 
http://www-clips.imag.fr/commun/be [...] NSI_C.html
 
Mais c'est plus formel.
 

n°1378394
simple_stu​pid
Keep It Simple Stupid
Posté le 31-05-2006 à 20:04:32  profilanswer
 

franceso a écrit :

normal que resultat soit toujours égal à 0 : tu ne remplis jamais sa valeur.
il faut mettre des instructions du genre "resultat = nombre1 + nombre2;" avant tes printf.
 
Par ailleurs
1) tu devrais gérer les cas où l'utilisateur rentre une opération qui n'existe pas
2) il existe en C une structure switch qui t'aiderait sans doute à faire quelque chose de plus propre et plus lisible  

Code :
  1. char op;
  2. switch( choix )
  3. {
  4.   case 1:
  5.     op = '+';
  6.     resultat = nombre1 + nombre2;
  7.     break;
  8.   case 2:
  9.     op = '-';
  10.     resultat = nombre1 - nombre2;
  11.     break;
  12.   /* ... */
  13.    default:   /* l'utilisateur a entré une mauvaise opération */
  14.     op = 0;
  15.     printf( "Opération invalide\n" );
  16. }
  17. if( op != 0 )  /* si l'opération est valide, on affiche le résultat */
  18. {
  19.   printf ("%ld %c %ld = %ld\n", nombre1, op, nombre2, resultat);
  20. }


 
 
 
EDIT: GRILLAID (et d'1/4 d'heure en plus...)


 
 
char c
 
Ne jamais utiliser de char ailleurs que dans une chaîne. C'est un coup à faire des conneries.

mood
Publicité
Posté le 31-05-2006 à 20:04:32  profilanswer
 

n°1378405
Sve@r
Posté le 31-05-2006 à 20:21:09  profilanswer
 

woard a écrit :

le C c'est dur pour tout le monde je suis trop jeune ou c'est que je suis pas fait pour l'informatique ^^?


 
L'âge n'a rien à voir. Et, en général, les élèves de S sont "généralement" cablés pour savoir facilement transformer la solution d'un pb en algorithme informatique.
Si tu veux savoir si t'es fait pour l'informatique, est-ce que t'as une calculatrice progammable ? Est-ce que tu prends plaisir à la programmer ?
 
Sinon, est-ce que tu fais un blocage sue le C pur ? Trop tôt pour le dire. Quand tu réussiras tout seul à faire des programmes fonctionnels et que tu les verras tourner, c'est là que tu verras si t'es fait pour ça (si tu as envie de continuer, etc)
 
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1378559
franceso
Posté le 01-06-2006 à 08:55:16  profilanswer
 

simple_stupid a écrit :

Ne jamais utiliser de char ailleurs que dans une chaîne. C'est un coup à faire des conneries.

Pourquoi :??:
 
Si tu fais gaffe, il n'y a aucune raison de faire des conneries...


---------------
TriScale innov
n°1378733
simple_stu​pid
Keep It Simple Stupid
Posté le 01-06-2006 à 12:24:38  profilanswer
 

franceso a écrit :

Pourquoi :??:
 
Si tu fais gaffe, il n'y a aucune raison de faire des conneries...


 
Parce qu'aucune fonction ne prend ni ne renvoie de char.
On ne travaille pas avec des char: tu ne t'es pas demandé pourquoi les fonctions du style getchar() renvoient des int?

n°1378741
skelter
Posté le 01-06-2006 à 12:31:07  profilanswer
 

n'importe quoi, tu utilises char quand tu veux du moment que tu fais attention a la concordance des types.
c'est sur que faut pas faire char c = getchar() mais ca suffit de lire la doc (comme pour toute les fonctions), getchar renvoi EOF en cas d'erreur et le type de EOF est int
 
dans l'exemple de francesco je vois pas en quoi l'utilisation de char est dangereuse

n°1378750
simple_stu​pid
Keep It Simple Stupid
Posté le 01-06-2006 à 12:42:16  profilanswer
 

skelter a écrit :

n'importe quoi, tu utilises char quand tu veux du moment que tu fais attention a la concordance des types.
c'est sur que faut pas faire char c = getchar() mais ca suffit de lire la doc (comme pour toute les fonctions), getchar renvoi EOF en cas d'erreur et le type de EOF est int
 
dans l'exemple de francesco je vois pas en quoi l'utilisation de char est dangereuse


 
Non.
Si les fonctions comme getchar retournent des int, c'est parce qu'ils doivent signaler une erreur possible, qui doit donc être distincte de toutes les valeurs de char possible. Donc si tu l'affectes à un char, tu te retrouves avec un overflow ou une troncature, et ça te donne de la merde.
 
En parlant de getchar, regarde le prototype de putchar: comme toutes ses soeurs, elle accepte un type int. Pourtant tu ne lui balances pas EOF là?
Les fonctions qui travaillent sur des caractères acceptent et renvoient des int, on travaille donc avec des int: elles les convertissent en unsigned char (et oui, le fait que char soit signed dépend de l'implémentation).
En plus, tu risques d'avoir plein de problèmes si tu les manipules (extension de signe, overflow, etc). Enfin, int est la taille d'un mot naturel de la machine (taille de ses registres), les calculs sont plus rapides, et demandent moins de boulot du compilateur.
 
Un dernier exemple: les constantes caractère sont de type int (essaie un sizeof('a') pour t'en convaincre).
 
Alors je ne vois vraiment aucune raison d'utiliser un char. A part pour se vautrer...

Message cité 2 fois
Message édité par simple_stupid le 01-06-2006 à 13:15:15
n°1378831
franceso
Posté le 01-06-2006 à 13:54:40  profilanswer
 

simple_stupid a écrit :

Non.
Si les fonctions comme getchar retournent des int, c'est parce qu'ils doivent signaler une erreur possible, qui doit donc être distincte de toutes les valeurs de char possible. Donc si tu l'affectes à un char, tu te retrouves avec un overflow ou une troncature, et ça te donne de la merde.
 
En parlant de getchar, regarde le prototype de putchar: comme toutes ses soeurs, elle accepte un type int. Pourtant tu ne lui balances pas EOF là?
Les fonctions qui travaillent sur des caractères acceptent et renvoient des int, on travaille donc avec des int: elles les convertissent en unsigned char (et oui, le fait que char soit signed dépend de l'implémentation).
En plus, tu risques d'avoir plein de problèmes si tu les manipules (extension de signe, overflow, etc). Enfin, int est la taille d'un mot naturel de la machine (taille de ses registres), les calculs sont plus rapides, et demandent moins de boulot du compilateur.
 
Un dernier exemple: les constantes caractère sont de type int (essaie un sizeof('a') pour t'en convaincre).
 
Alors je ne vois vraiment aucune raison d'utiliser un char. A part pour se vautrer...


D'accord pour ce qui concerne l'alignement de la mémoire et la taille des registres : il est vrai qu'utiliser un int est plus efficace que d'utiliser un char.
 
Par contre, je vois toujours pas pourquoi on se vautrerait en utilisant des char. Mon exemple ne fait appel à aucune fonction du type getchar() / putchar(), ne fait aucune manipulation sur le caractère et je ne vois pas où il pourrait y avoir un risque de plantage.


---------------
TriScale innov
n°1378856
simple_stu​pid
Keep It Simple Stupid
Posté le 01-06-2006 à 14:09:42  profilanswer
 

franceso a écrit :

D'accord pour ce qui concerne l'alignement de la mémoire et la taille des registres : il est vrai qu'utiliser un int est plus efficace que d'utiliser un char.
 
Par contre, je vois toujours pas pourquoi on se vautrerait en utilisant des char. Mon exemple ne fait appel à aucune fonction du type getchar() / putchar(), ne fait aucune manipulation sur le caractère et je ne vois pas où il pourrait y avoir un risque de plantage.


 
Dans ton exemple, y'a rien à dire.
Mais c'est juste pour prendre de bonnes habitudes ;-)

n°1378871
skelter
Posté le 01-06-2006 à 14:17:01  profilanswer
 

Citation :

Non.
Si les fonctions comme getchar retournent des int, c'est parce qu'ils doivent signaler une erreur possible, qui doit donc être distincte de toutes les valeurs de char possible. Donc si tu l'affectes à un char, tu te retrouves avec un overflow ou une troncature, et ça te donne de la merde.


 
c'est ce que j'ai dit
 

Citation :

Un dernier exemple: les constantes caractère sont de type int (essaie un sizeof('a') pour t'en convaincre).


 
je sais et je vois pas ce que ca vient faire la
 

Citation :

En plus, tu risques d'avoir plein de problèmes si tu les manipules (extension de signe, overflow, etc).


 
si on considere un char comme un caractere je vois pas le probleme, et l'overflow arithmetique concerne tout les types entiers.
 

Citation :


Enfin, int est la taille d'un mot naturel de la machine (taille de ses registres), les calculs sont plus rapides, et demandent moins de boulot du compilateur.


 
je vois toujours pas ce que ca vient faire la, si on considere un char comme un caractere je vois mal comment on peut se retrouver a faire du calcul en masse sur des vecteurs de char ??
 

Citation :

En parlant de getchar, regarde le prototype de putchar: comme toutes ses soeurs, elle accepte un type int. Pourtant tu ne lui balances pas EOF là?


 
et alors ? expliques moi en quoi ce code serait faux
 
char c = 'a';
putchar(c);
 

n°1379151
simple_stu​pid
Keep It Simple Stupid
Posté le 01-06-2006 à 17:25:37  profilanswer
 

Citation :


c'est ce que j'ai dit


 
C'est bien.  

Citation :


je sais et je vois pas ce que ca vient faire la


 
Ah vraiment?
 

Citation :


si on considere un char comme un caractere je vois pas le probleme, et l'overflow arithmetique concerne tout les types entiers.


 
Et? T'as donc pas compris pourquoi il faut utiliser un int pour stocker la valeur de retour de getchar().
 

Citation :


je vois toujours pas ce que ca vient faire la, si on considere un char comme un caractere je vois mal comment on peut se retrouver a faire du calcul en masse sur des vecteurs de char ??


 
idem.
 

Citation :


et alors ? expliques moi en quoi ce code serait faux
 
char c = 'a';
putchar(c);


 
Ca te gènes pas d'affecter un int à un char (signed ou unsigned), pour qu'il soit passé à une fonction qui accepte un int, et qui le reconvertit en unsigned char?  
 
Après si ça t'amuses d'utiliser des chars pour recevoir/passer des valeurs à des fonctions qui reçoivent des ints, c'est ton problème.
Le fait est que les constantes caractère sont des int, et toutes les fonctions qui manipulent des caractères attendent/renvoient des int.
Alors je ne vois vraiment pas la logique qui peut pousser à utiliser des char.

n°1379196
skelter
Posté le 01-06-2006 à 18:08:39  profilanswer
 


 

Citation :

Ca te gènes pas d'affecter un int à un char (signed ou unsigned), pour qu'il soit passé à une fonction qui accepte un int, et qui le reconvertit en unsigned char?  
 


 
je demandais juste de m'expliquer en quoi ce code peux poser des problemes, ce que tu n'as pas fais
 

Citation :

Après si ça t'amuses d'utiliser des chars pour recevoir/passer des valeurs


 
je vois pas ou est le probleme de passer un char à une fonction prenant un int, surtout si il est convertit en 'unsigned char' derriere
pour le retour je n'ai jamais dit que je récupere dans un char un int, comme tu n'arrete pas de le repeter
 

Citation :

Et? T'as donc pas compris pourquoi il faut utiliser un int pour stocker la valeur de retour de getchar().


 
ya rien a comprendre, getchar retourne un int, tu recuperes la valeur retour dans un int, apres si t'es heureux d'avoir compris que EOF converti en char peut etre confondu avec un autre char (sans blague) tant mieux pour toi
 

Citation :

Alors je ne vois vraiment pas la logique qui peut pousser à utiliser des char.


 
avoir un code plus cloisonner (donc plus robuste) et surtout plus proche de la sémantique (je l'ai dit 100x, un caractere est un caractere), mais cherches pas a comprendre, ca a pas l'air d'etre ce qui compte pour toi

Message cité 1 fois
Message édité par skelter le 01-06-2006 à 18:09:13
n°1379207
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-06-2006 à 18:16:32  profilanswer
 

simple_stupid a écrit :

Si les fonctions comme getchar retournent des int, c'est parce qu'ils doivent signaler une erreur possible, qui doit donc être distincte de toutes les valeurs de char possible. Donc si tu l'affectes à un char, tu te retrouves avec un overflow ou une troncature, et ça te donne de la merde.
 
En parlant de getchar, regarde le prototype de putchar: comme toutes ses soeurs, elle accepte un type int. Pourtant tu ne lui balances pas EOF là?
Les fonctions qui travaillent sur des caractères acceptent et renvoient des int, on travaille donc avec des int: elles les convertissent en unsigned char (et oui, le fait que char soit signed dépend de l'implémentation).
En plus, tu risques d'avoir plein de problèmes si tu les manipules (extension de signe, overflow, etc). Enfin, int est la taille d'un mot naturel de la machine (taille de ses registres), les calculs sont plus rapides, et demandent moins de boulot du compilateur.
 
Un dernier exemple: les constantes caractère sont de type int (essaie un sizeof('a') pour t'en convaincre).
 
Alors je ne vois vraiment aucune raison d'utiliser un char. A part pour se vautrer...


En fait, la vraie raison, c'est que char n'est pas un type 'naturel'. Il n'y a pas de paramètres de type char. Il est automatiquement converti en int . Je confirme que char n'est utilise que pour les tableaux de char servant à faire des chaines.
 


---------------
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°1379215
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-06-2006 à 18:22:23  profilanswer
 

skelter a écrit :


et alors ? expliques moi en quoi ce code serait faux

Code :
  1. char c = 'a';
  2. putchar(c);



Moi, je dis pas que c'est faux, mais que c'est moins efficace que :  

Code :
  1. int c = 'a';
  2. putchar(c);


---------------
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°1379244
0x90
Posté le 01-06-2006 à 19:01:30  profilanswer
 

Code :
  1. #define char int


Lisible et efficace [:petrus75]

Message cité 1 fois
Message édité par 0x90 le 01-06-2006 à 19:01:49

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1379245
simple_stu​pid
Keep It Simple Stupid
Posté le 01-06-2006 à 19:01:49  profilanswer
 

skelter a écrit :

Citation :

Ca te gènes pas d'affecter un int à un char (signed ou unsigned), pour qu'il soit passé à une fonction qui accepte un int, et qui le reconvertit en unsigned char?  
 


 
je demandais juste de m'expliquer en quoi ce code peux poser des problemes, ce que tu n'as pas fais
 

Citation :

Après si ça t'amuses d'utiliser des chars pour recevoir/passer des valeurs


 
je vois pas ou est le probleme de passer un char à une fonction prenant un int, surtout si il est convertit en 'unsigned char' derriere
pour le retour je n'ai jamais dit que je récupere dans un char un int, comme tu n'arrete pas de le repeter
 

Citation :

Et? T'as donc pas compris pourquoi il faut utiliser un int pour stocker la valeur de retour de getchar().


 
ya rien a comprendre, getchar retourne un int, tu recuperes la valeur retour dans un int, apres si t'es heureux d'avoir compris que EOF converti en char peut etre confondu avec un autre char (sans blague) tant mieux pour toi
 

Citation :

Alors je ne vois vraiment pas la logique qui peut pousser à utiliser des char.


 
avoir un code plus cloisonner (donc plus robuste) et surtout plus proche de la sémantique (je l'ai dit 100x, un caractere est un caractere), mais cherches pas a comprendre, ca a pas l'air d'etre ce qui compte pour toi


 
 
Bon, je n'ai envie ni de me fâcher avec toi, ni de perdre mon temps.
Je pense que c'est une mauvaise idée, et je ne crois pas être le seul (Emmanuel aussi apparemment). Après, chacun est libre de faire ce qu'il veut.
 
On arrête ici.


Message édité par simple_stupid le 02-06-2006 à 13:40:58
n°1379249
Sve@r
Posté le 01-06-2006 à 19:15:59  profilanswer
 

0x90 a écrit :

Code :
  1. #define char int


Lisible et efficace [:petrus75]


 
Pfff...

Code :
  1. typedef int char;


 
Là, c'est tiptop !!! :sol:  


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1379269
0x90
Posté le 01-06-2006 à 20:05:24  profilanswer
 

Sve@r a écrit :

Pfff...

Code :
  1. typedef int char;


 
Là, c'est tiptop !!! :sol:


 
Sauf que ca marche pas :o


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1379282
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 01-06-2006 à 20:45:29  profilanswer
 

chrisbk avait raison : le C est une émanation de Satan ! [:petrus75]


---------------
J'ai un string dans l'array (Paris Hilton)
n°1380272
++fab
victime du syndrome IH
Posté le 02-06-2006 à 23:14:30  profilanswer
 

Emmanuel Delahaye a écrit :

Moi, je dis pas que c'est faux, mais que c'est moins efficace que :  

Code :
  1. int c = 'a';
  2. putchar(c);



 
Efficace en temps ? en espace ?
 
Je me permet une petite digression :
Ce problème est voisin de celui des calculs en float. Doit-on les utiliser sachant qu'il y a conversion en double ?
Je répond oui. Si on veut être efficace en espace -- voir dans certains cas en temps.
(sachant que ma réflexion n'inclu volontairement pas les problèmes de précision numérique).

n°1380277
Emmanuel D​elahaye
C is a sharp tool
Posté le 02-06-2006 à 23:27:39  profilanswer
 

++fab a écrit :

Efficace en temps ? en espace ?


En temps et en taille de code. Pas d'extension de signe, pas de troncature...

Citation :


Ce problème est voisin de celui des calculs en float. Doit-on les utiliser sachant qu'il y a conversion en double ?
Je répond oui. Si on veut être efficace en espace -- voir dans certains cas en temps.
(sachant que ma réflexion n'inclu volontairement pas les problèmes de précision numérique).


Ceci n'est pas un scoop :  

  • Le calculs sont faits en double. Toujours.
  • Le stockage de masse est fait en double, ou en float si on accepte la réduction de précision (au profit du volume d'information).



---------------
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°1380280
++fab
victime du syndrome IH
Posté le 02-06-2006 à 23:34:35  profilanswer
 

Emmanuel Delahaye a écrit :

En temps et en taille de code. Pas d'extension de signe, pas de troncature...


Tu pourrais clarifier, en ce qui concerne l'extension de signe et la troncature ?
 

Citation :

Le calculs sont faits en double. Toujours.


Toujours ? Et en cas de vectorisation ?

Message cité 1 fois
Message édité par ++fab le 02-06-2006 à 23:34:54
n°1380297
Emmanuel D​elahaye
C is a sharp tool
Posté le 02-06-2006 à 23:58:35  profilanswer
 

++fab a écrit :

Tu pourrais clarifier, en ce qui concerne l'extension de signe et la troncature ?


Le type char n'est pas natif pour les calculs. Il est converti en int pour faire les calculs et reconvertit en char après le calcul.
 
char -> int : extension de signe : 0x82 -> 0xFF82
int -> char : troncature : 0xFF82 -> 0x80 : & 0xFF...
 

Citation :

Le calculs sont faits en double. Toujours.


Toujours ? Et en cas de vectorisation ?
Vectorisation ? Pas de ça en C.

Message cité 1 fois
Message édité par Emmanuel Delahaye le 02-06-2006 à 23:59:20

---------------
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°1380308
++fab
victime du syndrome IH
Posté le 03-06-2006 à 00:11:59  profilanswer
 

Emmanuel Delahaye a écrit :


char -> int : extension de signe : 0x82 -> 0xFF82
int -> char : troncature : 0xFF82 -> 0x80 : & 0xFF...


Merci.
 

Citation :

Vectorisation ? Pas de ça en C.


Pas de vectorisation, mais un support direct pour la favoriser : restrict.
C'est au bon gré du compilateur selon le processeur ciblé. Et s'il y a un support harware pour effectuer des operations paralèlles sur des float, je serais étonné d'une conversion en double.  

n°1380314
Emmanuel D​elahaye
C is a sharp tool
Posté le 03-06-2006 à 00:32:05  profilanswer
 

++fab a écrit :

Pas de vectorisation, mais un support direct pour la favoriser : restrict.
C'est au bon gré du compilateur selon le processeur ciblé. Et s'il y a un support harware pour effectuer des operations paralèlles sur des float, je serais étonné d'une conversion en double.


C'est possible, car C99 a des fonctions de calcul en float et en long double...


---------------
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°1380500
skelter
Posté le 03-06-2006 à 17:17:51  profilanswer
 

Citation :

Le calculs sont faits en double. Toujours.


 
tu veux dire que les operandes float sont toujours promues au moins en double (voir long double) ? mais les operations sur nombres reels au sein du cpu sont toujours faites avec le type reels le plus large (long double) ?

n°1380573
Emmanuel D​elahaye
C is a sharp tool
Posté le 03-06-2006 à 20:52:27  profilanswer
 

skelter a écrit :

Citation :

Le calculs sont faits en double. Toujours.


 
tu veux dire que les operandes float sont toujours promues au moins en double (voir long double) ? mais les operations sur nombres reels au sein du cpu sont toujours faites avec le type reels le plus large (long double) ?


Je rephrase.
 
En C90, les calculs en internes sont faits avec la meilleure précision possible (double).
Les fonctions standard ont une interface de type double.
 
Il est donc souhaitable que les types des données soient 'double', ça évite des conversions inutiles et coûteuses
 
En C99, il existe des de fonctions de calculs spécialisées pour float et long double.

Message cité 1 fois
Message édité par Emmanuel Delahaye le 03-06-2006 à 20:59:20

---------------
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°1382513
++fab
victime du syndrome IH
Posté le 07-06-2006 à 00:40:26  profilanswer
 

Citation :

tu veux dire que les operandes float sont toujours promues au moins en double (voir long double) ?


Emmanuel à déjà répondu :

Citation :

En C90, les calculs en internes sont faits avec la meilleure précision possible (double).
Les fonctions standard ont une interface de type double.


 
à cause des fonctions standards C90, donc. Je ne sais pas ce qu'Emmanuel veux dire par "calculs en interne".
 

Citation :

mais les operations sur nombres reels au sein du cpu sont toujours faites avec le type reels le plus large (long double) ?[/quotemsg]


ça non, c'est le cas sur pentium, ou les flottants sont convertis sur 80 bits, mais ce n'est pas vrai en général.

n°1382516
++fab
victime du syndrome IH
Posté le 07-06-2006 à 00:53:34  profilanswer
 

Emmanuel Delahaye a écrit :

En C90, les calculs en internes sont faits avec la meilleure précision possible (double).
Les fonctions standard ont une interface de type double.


(voir mon interrogation ci-dessus)
 

Citation :

Il est donc souhaitable que les types des données soient 'double', ça évite des conversions inutiles et coûteuses


J'ai bien conscience d'être en contradiction avec la FAQ de fclc, mais si l'on ne fait pas appel aux fonctions standards C90 ?
Si on a l'intention de compiler ce code C avec un compilateur C++ pour profiter de la surcharge et éviter les conversions ?
Si on est dans le multimédia et qu'on veut profiter des instructions SIMD tel que SSE (éventuellement au lieu de SSE2) ?
Dans ces cas, ça me semble avoir un sens -- et ça ne me semble pas si rare, notament les 2 premiers points.
 

Citation :

En C99, il existe des de fonctions de calculs spécialisées pour float et long double.


Qui ne sont plus compatible C++, c'est pénible :/

n°1382518
skelter
Posté le 07-06-2006 à 01:03:52  profilanswer
 

Citation :

ça non, c'est le cas sur pentium, ou les flottants sont convertis sur 80 bits, mais ce n'est pas vrai en général.


 
possible, je ne sais meme plus ou j'ai vu ca  :jap:  
 

Code :
  1. Qui ne sont plus compatible C++, c'est pénible :/


 
a quoi bon, le C n'est de toute facon pas compatible avec le C++, et t'u l'a dit, en C++ on as des surcharges

n°1383359
++fab
victime du syndrome IH
Posté le 08-06-2006 à 00:29:16  profilanswer
 

skelter a écrit :

a quoi bon, le C n'est de toute facon pas compatible avec le C++, et t'u l'a dit, en C++ on as des surcharges


On peut dire ce qu'on veut, il y a quand même un sous ensemble C compatible C++ pas si restreint que ça.
Vu qu'on a des surcharges en C++, on peut parfois améliorer le binaire d'un code C en le compilant en C++, en évitant donc les conversions.
C99 introduit la solution du pauvre avec cosf et cie, et au mieux oblige le compilateur C++ à utiliser la compatibilité C99. Au pire à ce que ça ne soit pas compilable en C++.

mood
Publicité
Posté le   profilanswer
 


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

  probleme de pure débutant

 

Sujets relatifs
problème formulaire php[Réglé] [java débutant] afficher correctement des jpanels
probleme d'accent avec formulaire mailProblème d'identification avec htaccess
Probleme génération tableau après parsing XMLProblème d'animation avec une transition tween
macro excel pour copier et trier des colonnes : aide débutantProbleme de condition dans mes requetes, :'( help [RESOLU] !!
Probleme CSS avec IE : boite à bords arrondisProbleme de compilation
Plus de sujets relatifs à : probleme de pure débutant


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