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 :

Question sur un point de syntaxe


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut Question sur un point de syntaxe
    Bonsoir,

    Quelqu'un pourrait-il m'expliquer pourquoi ces deux lignes ne sont pas équivalentes ?

    Voici les deux exemples :

    N.B : data est tableau de type char contenant 8 caractères, soit de taille 8+1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                for (b = 0; b < COMPTER_CH(data); b++)
                {
                    printf("B = %d\n", b);
                    tableau[b] = data[b];
                    printf("tableau[%d] = %c\n", b, tableau[b]);
                }
                tableau[b] = '\0';
                printf("tableau[%d] = %c\n", b, tableau[b]);
                tableau[b+1] = '\0';
                printf("tableau[%d] = %c\n", b, tableau[b]);
    Avec ce code, j'obtiens bien tableau[9] == '\0'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                for (b = 0; b < COMPTER_CH(data); b++)
                {
                    printf("B = %d\n", b);
                    tableau[b] = data[b];
                    printf("tableau[%d] = %c\n", b, tableau[b]);
                }
                tableau[b] = '\0';
                printf("tableau[%d] = %c\n", b, tableau[b]);
                tableau[b++] = '\0';
                printf("tableau[%d] = %c\n", b, tableau[b]);
    Avec celui-là, j'obtiens n'importe quoi : tableau[9] est égal à tout sauf la valeur que je souhaite lui donner, ici la valeur nulle.

    Je pensais que les deux expressions b++ et b+1 était équivalente, mais j'ai dû me tromper...

    Merci de m'éclairer.


  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Si nous prenons b = 8;


    tableau[b+1] = '\0';

    Ceci va mettre a l'indice b+1 (donc 9) un '\n' et b serai toujours equivalent a 8.


    tableau[b++] = '\0';

    Ici, c'est plus special. l'operateur ++ est un operateur post incrematoire (je crois que mon prof disait ca). En fait, le ++ va s'effectuer apres tout. C'est a dire que on va mettre '\0' a l'indice b qui est egale a 8 (car le ++ n'est pas encore fait), puis on va increment b. apres passage, b vaudra 9, et non 8 comme dans le cas precedent.

    Une autre maniere d'ecrire :

    tableau[b++] = '\0';

    revient à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tableau[b] = '\0';
    b++;

    Si tu veux que b s'incremente avant tout, il faut faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tableau[++b] = '\0';
    Ce qui revient a ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    b++;
    tableau[b] = '\0';

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Ah bah je viens enfin de comprendre la différence entre ++b et b++... moi qui croyais que b++, ça incrémentait d'abord b avant de faire les opérations...

    Sacrée erreur... Je comprends mieux certains bugs incompréhensibles que j'ai rencontrés...

    Je te remercie de ta réponse, la différence entre ++b et b++ est très claire avec cet exemple.

    Ceci va mettre a l'indice b+1 (donc 9) un '\n' et b serai toujours equivalent a 8.
    Donc dans ce cas de figure, la valeur de b de change pas.

    Dès lors, ce genre de boucle peut être simplifiée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     int save_d = 0;
                    for (d = 0; d < COMPTER_CH(pathKey); d++)
                    {
                        if (pathKey[d] == '\\')
                        {
                            save_d = d;
                            d++;
                            if (pathKey[d] == '|')
                            {
                                d++;
                                if(pathKey[d] == '*')
                                {
                                d++;
                                    if(pathKey[d] == '|')
                                    {
                                        if ((buffer = copier_ch(pathKey)) != NULL)
                                        {
                                            pathKey[save_d] = '\0';
                                            if((endKey = malloc(COMPTER_CH(buffer)+1-save_d-5)) != NULL)
                                            {
                                                c = 0;
                                                for (a = save_d+5; a < COMPTER_CH(buffer); a++)
                                                {
                                                    endKey[c] = buffer[a];
                                                    c++;
                                                }
                                                endKey[c] = '\0';
                                                break;
                                            }
                                        }
                                    }
                                }
                            }
                            else
                            {
                                d = save_d;
                            }
                        }
                    }
                    d = 0;a = 0;c = 0;save_d = 0;
    Quelque chose comme ça serait-il juste ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                   if (pathKey[d] == '\\' && pathKey[d+1] == '|' && pathKey[d+2] == '*' etc. )

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Je n'ai pas encore verifier ta proposition, mais pour ton premier code, pourquoi ne pas inverser le role de save_d et d ??
    Tu verra, c'est beaucoup mieux


    EDIT :


    Bon, sans trop m'avancer, voici comment on pourrait reduire sans trop obfusquer le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
        for (d = 0; d<COMPTER_CH(pathKey) ; d++)
            if ((pathKey[d] == '\\')&&(pathKey[d+1] == '|')&&(pathKey[d+2] == '*')&&(pathKey[d+3] == '|')&&((buffer = copier_ch(pathKey)) != NULL))
            {
                pathKey[d] = '\0';
                if((endKey = malloc(COMPTER_CH(buffer)+1-d-5)) != NULL)
                {
                    c = 0;
                    for (a=d+5 ; a<COMPTER_CH(buffer) ; a++)
                    {
                        endKey[c] = buffer[a];
                        c++;
                    }
                    endKey[c] = '\0';
                    break;
                }
            }
    Finalement, save_d ne servait pas. La condition que tu m'as dit correspond effectivement a celle que j'ai mis, elle est longue mais bon, desfois on peut pas faire mieux.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Finalement, save_d ne servait pas. La condition que tu m'as dit correspond effectivement a celle que j'ai mis, elle est longue mais bon, desfois on peut pas faire mieux.
    Marche nickel

    Ici, difficile de faire mieux, c'est pour récupérer en faite argv[2] passée en ligne de commande : je la parse pour récupérer ce qui m'intéresse, ici le but est de pouvoir implanter un joker afin de pouvoir lister des clés de registre sans connaître l'intégralité du chemin. Je dois donc récupérer ce qu'il y a avant le joker et ce qu'il y a après.

    Je suis content, je viens de vraiment comprendre quelque chose d'important aujourd'hui qui était flou jusqu'à présent, ce qui explique bien des choses maintenant

    Merci

Discussions similaires

  1. [C#] quelques questions sur la syntaxe de base en C#
    Par DonJR dans le forum Windows Forms
    Réponses: 14
    Dernier message: 06/12/2006, 14h01
  2. [Tableaux] QUestion sur la syntaxe
    Par clementphp dans le forum Langage
    Réponses: 8
    Dernier message: 21/09/2006, 02h37
  3. question sur syntaxe d'une requete
    Par sparis dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 29/09/2005, 11h58

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