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 :

Plusieurs int dans un seul


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 64
    Par défaut Plusieurs int dans un seul
    Bonjour,

    Je cherche à faire quelque chose qui me semble simple mais malgré toutes mes recherches, je ne trouve rien. Je ne dois pas utiliser les bon mots.

    J'ai un int, et dans ce int j'aimerais en mettre plusieurs à la suite

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int c;
    int a=1;
    int b=2;
    Je voudrais avoir c=12
    Comment puis-je faire ?

    Merci de votre aide

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Avec des maths, si c'est ce qui correspond, par exemple, c = 10*a + b.

    Sinon, en gérant une chaine de caractère, en écrivant et lisant les bonnes choses.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 64
    Par défaut
    Merci beaucoup !

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    attention, les maths se compliquent selon le résultat souhaité de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int a = 2;
    int b = 12;
    int c = ?;

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 828
    Billets dans le blog
    1
    Par défaut
    Salut
    On utilise parfois les opérateurs bits à bits pour mettre plusieurs flags vrai/faux dans un int. Chaque flag étant écrit sous forme de puissance de 2
    Exemple: flag "x" = 1 ; flag "w" = 2; flag "r" = 4
    Imaginons que l'on veuille stocker l'info "flag x ET flag r" dans i on écrira i=1|4.
    1 = 0001
    4 = 0100
    1|4 = 0101 => on voit que les positions "0" et "2" (en numérotant à partir de la droite) représentant les flags "x" et "r" et aussi les différentes puissances de 2 (2^0 et 2^2) sont à 1 donc on sait que le flag x et le flag r sont présents.

    Ensuite, si on veut savoir si le flag r est présent, on utilise le "&" => if ((i & 4) == 4). Cela isolera de i la 2° position et renverra 4 ou 0 selon que cette position est à 1 ou pas.

    Si en plus on utilise l'astuce d'écrire en hexa on peut voir alors une certaine homogénéité dans les valeurs des flags
    flag1 =0x0001
    flag2 =0x0002
    flag3 =0x0004
    flag4 =0x0008
    flag5 =0x0010
    flag6 =0x0020
    flag7 =0x0040
    flag8 =0x0080
    flag9 =0x0100
    flag10=0x0200
    flag11=0x0400
    flag12=0x0800
    etc... (ce qui est plus visuel que 2; 4; 8; 16; 32; 64; 128; 256; 512; 1024; etc...)

    MAIS ça ne marche bien qu'avec des puissances parfaites de 2. On ne peut pas indiquer à la valeur 3 car la méthode laissera penser que ce 3 représente les flags 1 et 2.

    Donc si tu peux te cantonner à des puissances de 2 tu pourras utiliser cette méthode sans soucis (et monter jusqu'à 32 nombres stockés en même temps sur un seul long). Sinon tu te heurteras au problème évoqué par leternel.

    Maintenant on peut aussi adapter la méthode de leternel selon les contraintes. Si par exemple tu veux stocker des valeurs inférieures à 100, tu peux utiliser i=a*100+b pour stocker a et b dans i...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    à ce propos, quand je parlais de chaines de caractères, j'imaginais un code voisin de celui ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* creates an integer by concatenating the decimal values of two integers.*/
    int concatenate(int a, unsigned int b) {
        int result;
        int size = sprintf(null, "%d%d", a, b);
        char* string = malloc(size * sizeof char);
        if(string == 0) return 0;
        snprintf(string, size, "%d%d", a, b);
        sscanf(string, "%d", &result);
        free(string);
        return result;
    }
    Merci Médinoc d'avoir signalé le free(). Je crois que je fais trop de Java ces temps-ci

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Attention, à l'heure où je poste ceci qu as oublié le free(). Aussi, ce code nécessite C99.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    Bonjour,

    Voila ça marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    int a = 11;
    int b = 2000;
    int c = 1;
     
    while ((b/c) > 10)
       c *= 10;
    c = a * 10 * c + b; // 112000

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 828
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jouana Voir le message
    Bonjour,

    Voila ça marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    int a = 11;
    int b = 2000;
    int c = 1;
     
    while ((b/c) > 10)
       c *= 10;
    c = a * 10 * c + b; // 112000

    Mouais. Déjà en mettant > 1 et non >10 tu évite le "*10" final (redondance de code identique) mais même avec ça, si tu as a=1 et b=12000 cela donne aussi c=112000...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    oui après ça reste une bonne solution.

    Elle fait ce qui est demandé, le coup des champ de bits c'était un peu hors sujets.
    Et c'est plus opti que transformer les 2 chiffres en chaîne de caractère puis de concaténer le tous.

    Et ma solution repond au pb soulevé par leternel plus haut

  11. #11
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Je ne suis pas sûr, à cause de la division entière.
    Et il faudrait aussi vérifier pour les cas où l'un ou les deux nombres soient négatifs

  12. #12
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    Oui après la solution rempli la demande initial qui est de concaténer des unsigned int enfin moi je vois ça comme ça.

Discussions similaires

  1. Plusieur reqs dans un seul etat de sortie ???
    Par beta1721 dans le forum Bases de données
    Réponses: 3
    Dernier message: 29/05/2006, 01h43
  2. Plusieurs formulaires dans une seule servlet
    Par bf83 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 27/03/2006, 15h21
  3. plusieurs tables dans une seule table
    Par scully2501 dans le forum Access
    Réponses: 1
    Dernier message: 10/10/2005, 09h19
  4. regrouper plusieurs champ dans un seul en requete
    Par Nicko29 dans le forum Access
    Réponses: 12
    Dernier message: 07/09/2005, 18h29
  5. plusieurs enregistrements dans une seul ligne
    Par Celelibi dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/01/2005, 15h55

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