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 :

Divers questions en C


Sujet :

C

Vue hybride

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Par défaut Divers questions en C
    Bonjour a tous

    Voila j'ai quelque questions ou je n'ai pas trouvé de réponse..


    1/ Peut on utiliser int pour mettre un caractère exemple A ?

    2/ Pourquoi dans ce code on met i-- au lieu de i-1, c'est pas pareil ?

    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
    int longueurChaine(const char* chaine)
    {
        int i = 0;
        char caractereActuel = 0;
     
        do
        {
            caractereActuel = chaine[i];
            i++;
        }
        while(caractereActuel != '\0');
     
        i--; 
     
        return i;
    }

    3/ Pourquoi dans la fonction strcat dans chaine1 il y a un espace entre le "t" de Salut et le "\0 ?

    L'image se trouve a cette adresse: http://www.hiboox.fr/go/images/diver...c6749.png.html

  2. #2
    Membre très actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Par défaut
    hello

    1/ Oui
    int lettre = 'a'; //entregristre le code ASCII

    ce n'est pas dramatique mais comme les int sont de 2 octets et le code ASCII sur 1 seul, tu 'perd' 1 octet.

    2/

    tu as mis 1 et pas i, mais tu as du t'en rendre compte.

    i-- correspond a i = i - 1
    i - 1 ne fera rien et sera signalé par le compilateur (no lvalue, ou autre)

    3/
    l'espace est un caractère comme un autre, il y aurai pu avoir n'importe quel caractère

  3. #3
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    1/ Oui. D'ailleurs, bien qu'on dise que 'A' est un "caractère", son type n'est même pas char, mais int ! Dans, la bonne question est plutôt "peut-on mettre un caractère, par exemple 'A', dans un char ?" . La réponse reste néanmoins oui quand même .

    2/ Dans ton code tu as plutôt presque tout le temps 1 au lieu de i ... mais bref. En effet, i--; et i = i - 1;, c'est la même chose (du point de vue du résultat numérique). Mais i-- c'est plus court non ? Et si ton compilateur n'est pas très intelligent, le code généré avec i-- est plus rapide que celui généré avec i = i - 1. Il faut connaître le langage machine pour comprendre pourquoi.

    3/ On a volontairement mis un espace après le t de Salut pour qu'après la concaténation, on obtient "Salut Mateo21" et non "SalutMateo21". On aurait pu aussi ne pas mettre d'espace après le t de Salut et mettre un espace avant le M de Mateo21 ...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Par défaut
    Citation Envoyé par Melem Voir le message
    3/ On a volontairement mis un espace après le t de Salut pour qu'après la concaténation, on obtient "Salut Mateo21" et non "SalutMateo21". On aurait pu aussi ne pas mettre d'espace après le t de Salut et mettre un espace avant le M de Mateo21 ...
    Donc c'est la fonction strcat qui a mis un espace pour que les 2 chaines soit séparé?

    c'est ça ?

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Tout d'abord, attention, dans le code tu utilises une variable nommé 1, ce qui est interdit.
    Je suppose qu'il s'agit en fait de la variable i ?

    Citation Envoyé par lassault1 Voir le message
    1/ Peut on utiliser int pour mettre un caractère exemple A ?
    Oui.

    D'ailleurs 'A' est de type int et les fonctions manipulant des caractères (getchar, toupper, etc.) utilise int.


    Citation Envoyé par lassault1 Voir le message
    2/ Pourquoi dans ce code on met i-- au lieu de i-1, c'est pas pareil ?
    Non, i-1 seul ne modifie pas la valeur de i contrairement à i--.
    i=i-1 serait dans le code présenté équivalent, mais plus long à écrire et moins idiomatique.

    Citation Envoyé par lassault1 Voir le message
    3/ Pourquoi dans la fonction strcat dans chaine1 il y a un espace entre le "t" de Salut et le "\0 ?
    De quoi parles-tu ? Je ne vois pas de strcat, de chaine1 ni de salut dans le code présenté.

    Par rapport à l'image que tu as fournie, c'est tout simplement que la première chaîne contient un espace ("salut " et non "salut").

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Par défaut
    Citation Envoyé par gl Voir le message
    Par rapport à l'image que tu as fournie, c'est tout simplement que la première chaîne contient un espace ("salut " et non "salut").
    Pour cette question c'est ok car j'ai pas vu l'espace ici : chaine1[100] = "Salut "

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Bonjour,

    Citation Envoyé par lassault1 Voir le message
    1/ Peut on utiliser int pour mettre un caractère exemple A ?
    Oui, parce qu'en informatique, un « caractère » est en fait représenté par sa position dans une table. C'est donc un nombre entier. Toutefois, ce n'est pas forcément recommandé, puisque le type « char », qui est un soi un nombre entier, est fait pour représenter des caractères.

    Cela dit, certaines fonctions comme fgetc(), pourtant élémentaire, renvoient justement un char au travers d'un int pour pouvoir renvoyer éventuellement d'autres valeurs, qui ne sont pas des caractères, comme le code EOF, qui vaut généralement « -1 », et qui sert à indiquer une erreur de lecture due à un problème en amont, ou à une fin de fichier.

    2/ Pourquoi dans ce code on met i-- au lieu de i-1, c'est pas pareil ?
    Non. « i - 1 » est une expression qui, une fois évaluée, te renvoie la valeur de i diminuée de 1. « i-- » te renvoie la valeur de i (intacte) puis décrémente la variable i de manière implicite. Les effets et les valeurs retournées ne sont pas les mêmes.

    Tu peux également utiliser l'opérateur de pré-décrémentation « --i », qui commence par décrémenter la variable, et renvoie sa valeur modifiée. Cela reste deux expressions différentes puisque dans le cas de « i - 1 », la variable i reste inchangée.

    Enfin, pourquoi utiliser l'opérateur « i-- » plutôt que « i = i - 1 » ? Il y a plusieurs raisons :

    • Cela a une signification sémantique : passer au rang suivant ou précédent ;
    • Cela correspond à une réalité électronique de la plupart des micro-processeurs, qui proposent des instructions pour le faire, comme ils proposent des registres à décalage (les « << » et « >> ») ;
    • C'est pratique pour parcourir un tableau en se souciant de la valeur des cellules indexées et pas celle du pointeur. Par exemple, dans l'expression « *tab++ », on récupère la valeur de ce qui est pointé par tab, et c'est cette valeur qui est renvoyée pendant que tab est incrémenté silencieusement pour passer à la cellule suivante ;
    • Une auto-incrémentation peut être effectuée de manière inhérente, sans avoir besoin d'une opérande et, par conséquent, sans faire d'accès au bus. Pour faire une comparaison avec le monde réel physique, une auto-incrémentation serait comparable à un compteur mécanique à cliquet, qui avance d'une position chaque fois que l'on appuie sur un bouton ou un levier (comme sur les urnes à voter, par exemple), et une addition arithmétique explicite à une machine de pascal dont on se servirait pour ajouter la valeur « 00001 » exactement et à chaque fois. Ce serait inutilement compliqué.


    3/ Pourquoi dans la fonction strcat dans chaine1 il y a un espace entre le "t" de Salut et le "\0 ?
    Pour aucune raison particulière, a priori. L'espace est un caractère comme un autre.

    ÉDIT : la vache ! Huit messages qui sont arrivés le temps que je valide le mien !

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    • Cela correspond à une réalité électronique de la plupart des micro-processeurs, qui proposent des instructions pour le faire, comme ils proposent des registres à décalage (les « << » et « >> ») ;
    • Une auto-incrémentation peut être effectuée de manière inhérente, sans avoir besoin d'une opérande et, par conséquent, sans faire d'accès au bus.
    Si ce n'est qu'un compilateur un minimum efficace devrait optimiser et générer le même code pour i++ et i=i+1 (lorsque ce n'est pas utilisé au sein d'une expression plus complexe) et profiter de ces avantages dans les deux cas.
    Sur un compilateur peu doué en optimisation (ou avec les réglages supprimant toute optimisation), c'est effectivement à prendre en compte. Mais ça ne représente pas le cas le plus fréquent.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Par défaut
    Merci .. c'est ok !!

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par gl Voir le message
    Si ce n'est qu'un compilateur un minimum efficace devrait optimiser et générer le même code pour i++ et i=i+1 (lorsque ce n'est pas utilisé au sein d'une expression plus complexe) et profiter de ces avantages dans les deux cas.
    Sur un compilateur peu doué en optimisation (ou avec les réglages supprimant toute optimisation), c'est effectivement à prendre en compte. Mais ça ne représente pas le cas le plus fréquent.
    Oui, mais dans le cas présent, cela ne change rien. Cela abonde même dans mon sens. Si optimisation il y a, c'est parce que ces variantes existent, en dessous du niveau du C, et que justement, le compilo réécrit ton code pour utiliser l'approche la plus efficace.

    Mais d'une manière plus générale, l'objet de la question n'était pas de savoir s'il vaut mieux utiliser l'un plutôt que l'autre dans son code (ce qui a déjà été longuement débattu sur ce forum), mais d'expliquer le fonctionnement de ces deux approches et de justifier leur raison d'être. Et c'est une bonne chose, je trouve, de se pencher sur le cas des auto-incrémentations et décrémentations en particulier. Les ramener systématiquement à « x = x + 1 » est beaucoup trop réducteur, voire fallacieux.

    L'assembleur Saturn (HP48), par exemple, était le seul à ma connaissance à ne pas utiliser de mnémoniques style « ADD » et « INC » mais « X=X+ » et « X=X+1 ». Je trouvais que c'était une hérésie. On ne savait jamais si le « 1 » était une opérande ou une opération implicite.

  11. #11
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Oui, mais dans le cas présent, cela ne change rien. Cela abonde même dans mon sens. Si optimisation il y a, c'est parce que ces variantes existent, en dessous du niveau du C, et que justement, le compilo réécrit ton code pour utiliser l'approche la plus efficace.

    Mais d'une manière plus générale, l'objet de la question n'était pas de savoir s'il vaut mieux utiliser l'un plutôt que l'autre dans son code (ce qui a déjà été longuement débattu sur ce forum), mais d'expliquer le fonctionnement de ces deux approches et de justifier leur raison d'être.
    Tout à fait d'accord. Mon but n'était que de rajouter une petite précision.

Discussions similaires

  1. C++, besoin d'aide sur divers questions
    Par mensoif dans le forum C++
    Réponses: 5
    Dernier message: 29/05/2008, 16h47
  2. [Divers] Question de méthodologie.
    Par zycomatic dans le forum SAP Crystal Reports
    Réponses: 10
    Dernier message: 18/03/2008, 17h08
  3. [XSLT] Divers Questions
    Par fanette dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 16/02/2007, 09h57
  4. Aide java script diver questions
    Par Argorate dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 05/08/2006, 03h32
  5. Divers questions
    Par Freakazoid dans le forum DirectX
    Réponses: 2
    Dernier message: 06/08/2002, 21h57

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