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 :

copier et incrémenter ?


Sujet :

C++

  1. #1
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut copier et incrémenter ?
    Salut à toutes et à tous,

    Cela fait plusieurs fois que je suis confronté au cas où je souhaite utiliser conjointement une variable et son incrément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int previous = 0;
    int next = previous;
    ++next;
    some_function(previous, next);
    Il y a un moyen de copier+incrémenter en une seule étape ? Je n'arrive pas à trouver la réponse sur internet.
    Cordialement,

    [EDIT]
    Oups, mon exemple est nul, l'idée était plutôt d'utiliser un type template, et je voulais que quoiqu'il arrive previous ne soit pas modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    T previous;
    T next = previous;
    ++next;
    some_function(previous, next);

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Attention, haute technologie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int next = previous + 1;

  3. #3
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 713
    Points : 2 361
    Points
    2 361
    Par défaut
    Bonjour.

    En passant par la pré incrémentation ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int previous = 0;
    some_function(previous, ++previous); //previous est incrémenté de 1, puis fourni en paramètre à la fonction
    PS: Merci Matt pour la correction.

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Mais l'ordre d'évaluation des paramètres d'appel de fonction n'étant pas défini, some_function(previous, ++previous) peut tout aussi bien valoir some_function(0, 1) que some_function(1, 1).

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 580
    Points : 7 712
    Points
    7 712
    Par défaut
    Je ne vois pas bien l'intérêt, à moins que l'objet ne soit de taille importante.
    On peut pour éviter les copies faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template<class T> struct PrevNext {
    	T  prev;   // copie de la valeur précédente
    	T& next;   // référence sur la nouvelle valeur mise à jour
    	PrevNext(T& x) : prev(x), next(++x) {} // ici l'ordre d'interprétation est garanti
    };
    void some_function( PrevNext<int> z ) {
       ... cout << z.prev;
       ... cout << z.next;
    }
    int main() {
       int x = 0;
       some_function( x );  // => "0 1" et x vaut 1
       some_function( x );  // => "1 2" et x vaut 2
    }

  6. #6
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    Au temps pour moi, l'exemple était présenté avec un int, mais le but était d'effectuer le traitement avec un type template supportant l'opérateur d'incrémentation. L'intérêt était jute de m'assurer qu'il n'existait pas une syntaxe classique qui remplisse ce job (copier l'objet -> incrémenter la copie -> l'assigner). Apparemment non, ce qui répond à ma question.

    La structure de Dalfab est ce qui ressemble le plus à ce que je cherchais, mais vu la lourdeur le jeu n'en vaut peut être effectivement pas la chandelle.

    Merci à tous !

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    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 195
    Points : 17 163
    Points
    17 163
    Par défaut
    il y a bien une possibilité, d'un point de vue syntaxique, si on ce n'est pas une déclaration.
    x = y étant une expression retournant, pour les types normalement constitués, une référence sur l'assigné, il suffit donc d'incrémenter cette référence:
    L'instruction "magique" est ++(x = y);. Cela dit, c'est assez particulier.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Y a-t-il un point de séquencement dans cette expression? Sinon, il s'agira d'un comportement indéterminé, car x sera modifiée deux fois...

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 053
    Points
    33 053
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Y a-t-il un point de séquencement dans cette expression? Sinon, il s'agira d'un comportement indéterminé, car x sera modifiée deux fois...
    ?
    x=y assigne la valeur de y à x, puis retourne x
    ensuite on incrémente le tout, soit x

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    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 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Il y a un défaut de séquencement potentiel entre les sous expressions x et y, mais x=y est évaluée avant ++, ce dernier s'applique non pas à l'expression x, mais à la valeur de la parenthèse, qui s'avère être une référence sur x.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Copier et incrémenter le nom d'une feuille
    Par familledacp dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 04/07/2018, 16h40
  2. Copier et incrémenter le nom d'une feuille
    Par remondii dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/12/2014, 23h05
  3. Utiliser le VBA pour copier et incrémenter une feuille
    Par theyang dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 19/10/2014, 21h20
  4. copier/incrémenter les feuilles d'Excel
    Par Biker-Robby dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 22/02/2009, 15h57
  5. Copier coller sans incrémenter
    Par chrichnou051 dans le forum Excel
    Réponses: 2
    Dernier message: 23/04/2008, 16h06

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