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 d'un entretien


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut question d'un entretien
    Bonjour
    j'ai passé un entretien, et j'avais comme question:
    quelle est la différence entre ces deux fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     void f(char tab[]){....}
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void f(char *tab){....}
    1) la disclocation des données (j'avoue je n'ai jamais entendu parlé de ça).
    2) aucune
    3) tab ne sont pas du tout la même chose dans les deux cas.


    moi, j'ai répondu la 2.
    est-ce juste?

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par deubelte Voir le message
    moi, j'ai répondu la 2.
    est-ce juste?
    En tout cas, si tu as faux, j'aurais eu faux aussi mais je pense que tu as juste.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    3) tab ne sont pas du tout la même chose dans les deux cas.

    Le 1er est un pointeur sur un tableau de char,
    le second est un pointeur sur un char.

    (Enfin, d'un point de vue documentation, parce que pour le compilateur c'est la même chose)

  4. #4
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    d'ailleurs, pendant qu'on y ait, quelle est la différence d'un point de vue de la documentation et du compilateur entre ces deux déclarations:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char a[]="efg";
    	 char e[4]="abc";
    D'un pt de vue de la mémoire, cela semble être totalement identique.
    merci

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Dans le 1er cas, c'est le compilateur qui calcule la taille exacte du tableau de caractères.

    Dans le 2eme cas, c'est toi qui fournit cette taille au compilateur et si tu te trompes, c'est tant pis pour toi.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    J'ai eu une autre question (pendant qu'on y est...).

    Considérons le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template<class r1, int r2>class T
     {
     
     };
     
    T<double ,2> C1;
    T<int ,3> C1;
    T<int ,4> C1;
    (Il me semble que c'était qqch comme cela, un template avec une spécialisation, mais je ne sais même pas si le code que j'ai écrit à un sens).

    Il y avait en fait trois déclarations de ce style, et on me demandait combien d'instances de type T étaient créées.
    Alors moi, j'ai dit 2, l'une pour le paramètre double, l'autre pour l'int.
    Il ne fallait pas tomber dans le piège et répondre 3.

    Autre question:
    on avait une classe dans laquelle on avait que des fonctions virtuelles pures.
    La question était de savoir si l'on ne pouvait pas créer d'instance de la classe parce que :
    1)il y avait au moins une fonction virtuelle pure
    2)il y avait que des fonctions virtuelles pures

    moi, j'ai répondu 1.

  7. #7
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    Citation Envoyé par deubelte Voir le message
    J'ai eu une autre question (pendant qu'on y est...).
    Autre question:
    on avait une classe dans laquelle on avait que des fonctions virtuelles pures.
    La question était de savoir si l'on ne pouvait pas créer d'instance de la classe parce que :
    1)il y avait au moins une fonction virtuelle pure
    2)il y avait que des fonctions virtuelles pures

    moi, j'ai répondu 1.
    Pour moi, tu as raison.

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 131
    Billets dans le blog
    150
    Par défaut
    Wouhou, j'aurais eu juste
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    la bonne réponse c'est qu'en C++ on utilise des std::string et des références

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 195
    Par défaut
    moi, j'ai répondu la 2.
    est-ce juste?
    Salut .
    Malheuresement tu as repondu faux a cette question.

    tab[] specifie un tableau de char
    tab* est un pointeur sur un char.

    lorsque tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char p[] = "abcdefgh";
    tab[i];
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *p = "abcdefgh";
    tab[i];
    le comportement est different selon les deux cas.
    imaginons que la chaine est a l'addresse 5000

    Dans le premier cas on recupere l' addresse de la chaine ( 5000 ) on ajoute 5 (5005) et on regarde ce qui se trouve a l'addresse 5005 ( 'f' )

    Dans le deuxieme cas on regarde ce qui se trouve dans p. il y a l'addresse de la chaine (5000) on ajoute 5 (5005) et enfin on regarde a l'addresse 5005 ( 'f' ).

    1) le compilateur connait l addresse de la chaine il procede aux calculs
    2) Le compilateur connait l addresse de p , il regarde dedans pour connaitre l'addresse de la chaine et il procede aux calcul.

    En gros il fais une operation de + dans le deuxieme cas.

    Ne pas confondre un tableau d'elements avec un pointeur sur un element.
    Pour t'en convaincre :

    Fichier1.c
    Fichier2.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    extern int* test;
     
    int main()
    {
        test[2] = 3;
    }
    Je te laisse compiler et executer.
    Pour corriger le probleme :
    ps : sorry pour les accents....


    Pour info :
    Ici tab est un pointeur sur un tableau de char .

    Voila

  11. #11
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Dans une signature de fonction, on perd la tablitude.
    D'ailleurs g(int tab []) peut très bien recevoir un int*.
    Pour garder la tablitude, il faut prendre une référence sur un tableau, et ne pas se tromper sur la taille.
    Code c++ : 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
    void f(int *tab) {
        std::cout << "f" << std::endl;
    }
     
    void g(int tab[]) {
        std::cout << "g" << std::endl;
    }
     
    void h(int (&tab)[2]) {
         std::cout << "h" << std::endl;
    }
     
    int main (int argc, char **argv)
    {
        int t[] = {1, 2};
        int *p = t;
     
        f(t);
        g(t);
        h(t);
        f(p);
        g(p);
        //h(p);
    }
    Décommenter h(p) produit un joli " Error: Formal argument tab of type int(&)[2] in call to h(int(&)[2]) is being passed int*."


    Quant à T<int,1>, T<double,2> et T<int, 3>, il s'agit de trois types différents pour le compilo. Je soupçonne que tu as oublié les énoncés exacts pour pouvoir répondre autre chose (vu que même "int c1; int c2; int c3;" produit 3 variables distinctes)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 195
    Par défaut
    Tout à fait d'accord !

    Pour les personnes qui se demande comment cela est possible si on considère un tableau différent d'un pointeur pour le passage en paramètre de fonction je repondrais que les compilateurs se chargent de faire la conversion tableau pointeur lors du passage de celui ci en paramètre.

    C'est justement à cause de cela que beaucoup de personne considère tableau et pointeur comme un seul et même concept.

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

Discussions similaires

  1. question dans l'entretien
    Par Invité dans le forum Emploi
    Réponses: 15
    Dernier message: 27/12/2011, 15h34
  2. Question excel pour entretien
    Par withinaz dans le forum Excel
    Réponses: 8
    Dernier message: 12/08/2010, 18h13
  3. question d'un entretien
    Par deubelte dans le forum C++
    Réponses: 22
    Dernier message: 01/04/2010, 11h23
  4. Puis je rappeler pour des questions sur un entretien ?
    Par alex_m94 dans le forum Entretien
    Réponses: 9
    Dernier message: 02/10/2009, 11h55
  5. Questions pour un entretien d'embauche
    Par CSharper dans le forum Entretien
    Réponses: 14
    Dernier message: 27/03/2008, 21h35

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