IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Equivalent a la surcharge d'opérateurq en C


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Par défaut Equivalent a la surcharge d'opérateurq en C
    Bonjour, j'ai un petit probleme. Dans l'application, il y a un type ANGLE qui est une signed int 16. Il est utilisée pour des angles de -180 a 180. Par contre, je viens de me rendre compte qu'avec le compilateur que j'utilise, 150+40 = 180 pour lui Il plafonne le resultat au lieu de donner -70 comme avec d'autre compilateur (et c'est le résultat désiré). Il y a vraiment vraiment beaucoup de variable de ce type et je cherchais un moyen de faire quelque chose d'équivalent a la surcharge d'opérateur mais ca doit être en C !

    Merci a l'avance !

  2. #2
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Je ne suis pas sûr de comprendre. Le type ANGLE est unsigned int 16 bits? Je ne vois pas pourquoi la limite serait 180 puisqu'avec 16 bits on peut aller jusqu'à 65535 en non signé.

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    L'opérateur '+' n'est définit qu'avec des entiers et des nombres flottants. La sémantique de cet opérateur est parfaitement définie. Si ANGLE est un alias (typedef) du type unsigned int, je ne vois aucune raison qui expliquerait le résultat que tu observes.

    Si ANGLE est un unsigned int, comment représentes-tu les valeurs entre 0 et -180?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Par défaut
    le principe est de que l'angle est storer avec une résolution de 180/2^15 et désolé, c'est un signé après vérification !
    Dans le fond, ma variable store le nombre de fois ( + ou - ) que j,ai de fois le ratio 180/(2^15). Soit de 0 a 180 pour a droite et de 0 a -180 pour a gauche.
    ex. ANGLE = 5 donc 5 * (180/(2^15)) = 0.0055 degree a droite

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par crazyguitarman Voir le message
    le principe est de que l'angle est storer avec une résolution de 180/2^15 et désolé, c'est un signé après vérification !
    Là, j'ai pas tout compris. Pourrais-tu reformuler?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Par défaut
    Je pourrais simplifier le probleme en disant :
    Tu as 2 signed int sur 8 bit( pour faire ca simple) A et B et tu veux t'assurer que le contenu est toujours bon. C'est a dire que peut importe le compilateur, tu veux être certain que si tu additionne 120 + 10 ca donne toujours -126.
    Soit -(2^7+(2^7-(120+10))) = -(128+(128-130) = -126

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    La norme assure qu'un entier de type signed int peut prendre une valeur entre -32767 et +32767. Je ne vois donc pas où est le problème, ni pourquoi tu parles d'un unsigned int de 8 bits. Cela n'a aucun sens...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Par défaut
    Merci pour l'aide Thierry mais j'crois que ca s'explique vraiment mal par ecrit. Je vais entreprendre la tache de tout verifier un a un. C'est plus sur comme travaille.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par crazyguitarman Voir le message
    Merci pour l'aide Thierry mais j'crois que ca s'explique vraiment mal par ecrit. Je vais entreprendre la tache de tout verifier un a un. C'est plus sur comme travaille.
    Je crois surtout que tu devrais commencer par expliquer clairement ce que tu veux faire, exemples à l'appui si nécessaire. On verra ensuite quelles sont les meilleures solutions pour y arriver.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Par défaut
    Citation Envoyé par crazyguitarman Voir le message
    Je pourrais simplifier le probleme en disant :
    Tu as 2 signed int sur 8 bit( pour faire ca simple) A et B et tu veux t'assurer que le contenu est toujours bon. C'est a dire que peut importe le compilateur, tu veux être certain que si tu additionne 120 + 10 ca donne toujours -126.
    Soit -(2^7+(2^7-(120+10))) = -(128+(128-130) = -126
    Ce n'est pas un exemple ca !?! Mais mon but simplement est de prendre un type signee et lorsque le resultat de l'addition est superieur a la valeur maximale, qu'il fasse un wrap around, c'est a dire obtenir la valeur maximale negative - le "surplus" de la valeur maximale positive :S C'est plus clair ^o) dumoins j'espere :S
    donc le type va de -127 a 128, je voudrait que 120 + 10 = -126

  11. #11
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par crazyguitarman Voir le message
    Ce n'est pas un exemple ca !?! Mais mon but simplement est de prendre un type signee et lorsque le resultat de l'addition est superieur a la valeur maximale, qu'il fasse un wrap around, c'est a dire obtenir la valeur maximale negative - le "surplus" de la valeur maximale positive :S C'est plus clair ^o) dumoins j'espere :S
    donc le type va de -127 a 128, je voudrait que 120 + 10 = -126
    C'est bien ce que j'avais compris. Tu veux donc savoir si, quelque soit le compilateur utilisé, le résultat que tu obtiendras suite à un débordement pour un entier signé sera toujours le même. La réponse est non! Tout d'abord, pour obtenir ce que tu veux, il faudrait pouvoir s'assurer qu'un entier de type signed char, par exemple, est toujours codé sur 8 bits ou qu'un signed int est toujours représenté sur 32 bits. Or, selon la norme, un char est codé sur au moins 8 bits (CHAR_BIT vaut au moins 8) et un signed int doit être en mesure de représenter des valeurs entre -32767 et +32767. Rien n'empêche que, sur certaines machines, un signed char soit représenté sur plus de 8 bits. Si tu veux être portable, il est risqué de baser ton code sur des suppositions quant à la taille d'un type donné.

    Par ailleurs, la norme n'impose aucune représentation pour les nombres négatifs. Ainsi, imaginons que tu utilises un entier de type signed char et qu'il soit représenté sur 8 bits, on aura:

    Avec une représentation en complément à 2:
    Avec une représentation en complément à 1:
    Avec une représentation basée sur un bit de signe
    Ces comportements sont tous valides du point de vue du langage C.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Réponses: 8
    Dernier message: 20/11/2002, 11h50
  2. equivalent à explode?
    Par djridou dans le forum Langage
    Réponses: 3
    Dernier message: 28/08/2002, 11h01
  3. [Kylix] Equivalent ShellExec en CLX
    Par Anonymous dans le forum EDI
    Réponses: 7
    Dernier message: 14/08/2002, 11h55
  4. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07
  5. [Kylix] equivalent winsock avec kylix
    Par Victor dans le forum EDI
    Réponses: 2
    Dernier message: 08/05/2002, 07h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo