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


Sujet :

C

  1. #1
    Membre éclairé
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Par défaut Question d'entretien d'embauche
    Salut,
    Je dispose du code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    main()
    {
    int a[2][2][2] = { {10,2,3,4}, {5,6,7,8}  };
    int *p,*q;
    p=&a[2][2][2];
    *q=***a;
    printf("%d----%d",*p,*q);
    }
    Que cela est il censé afficher?
    en faite la reponse doit etre:
    Answer:
    SomeGarbageValue---1
    Mais quand j'execute, j'ai une erreur par raport au pointeur q.
    Une idée?
    Merci

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 494
    Billets dans le blog
    1
    Par défaut
    Oui, il faut allouer une zone mémoire sur laquelle pointe le pointeur. Le warning dit bien que le pointeur est utilisé sans être initialisé. Tu essayes donc (en faisant *q = ... ;) d'écrire à un endroit inconnu, sûrement protégé, et cela génère une erreur de segmentation.

    Il faut faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(void)
    {
        int a[2][2][2] = { {10,2,3,4}, {5,6,7,8}  };
        int *p,*q;
        p=&a[2][2][2];
        q = malloc( sizeof(int) );
        *q=***a;
        printf("%d----%d",*p,*q);
        return 0;
    }
    Quant à la sortie :
    • p est l'adresse du dernier élément du tableau, sa valeur est "aléatoire". --> p est l'adresse d'un élément qui est hors du tableau.
    • *q à même valeur que le premier élément du tableau, soit 10 (et non 1).

  3. #3
    Membre éclairé
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Par défaut
    Je suis daccord avec toi, seulement ce nést pas ce quíl y a d'ecrit ici (2eme question).

    Autre chose,
    Peux tu méxpliquer ce resultat stp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    main()
    {
    int i=5;
    printf("%d%d%d%d%d",i++,i--,++i,--i,i);
    }
    Answer:
    45545
    Merci

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Par défaut
    Il faut voir "a" comme un tableau de 2*2*2 élements.
    Donc "a" est une adresse, voire même l'adresse du 1er élément.

    *a est le 1er éléments du tableau.
    **a et ***a pointe quelque part.

  5. #5
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par IsraGab Voir le message
    Je suis daccord avec toi, seulement ce nést pas ce quíl y a d'ecrit ici (2eme question).

    Autre chose,
    Peux tu méxpliquer ce resultat stp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    main()
    {
    int i=5;
    printf("%d%d%d%d%d",i++,i--,++i,--i,i);
    }
    Cela dépendra de l'implémentation faite par le compilateur, personnellement je ne sais pas dire ce qui sera affiché.
    La raison est que à ma connaissance la norme C ne définit pas l'ordre d'interprétation des arguments passé à une fonction.

    La seule chose que je peux dire c'est que les opérateurs post-incrément et pré-incrément ont le comportement suivant:
    • i++ retourne la valeur de i avant l'incrémentation (i = 4, i++ met 5 dans i et retourne 4)
    • ++i retourne la valeur de i après l'incrémentation (i = 4, ++i met 5 dans i et retourne 5)

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    Cela dépendra de l'implémentation faite par le compilateur.

    A ma connaissance la norme C ne définit pas l'ordre d'interprétation des arguments passé à une fonction.
    En effet avec Visual C++ j'ai : 45555
    Je ne comprends pas du tout la logique du résultat !
    qu'on parte de la gauche ou de la droite.

    Mais la réponse de IsraGab, c'est clairement une interprétation de la droite vers la gauche)

  7. #7
    Membre éclairé
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Par défaut
    Mais la réponse de IsraGab, c'est clairement une interprétation de la droite vers la gauche)
    Peux tu expliquer stp?
    Merci.
    PS: Au fait, j'utilise VS2012 et j'ai exactement le resultat donné.

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Qu'est-ce que c'est que ces questions? Il n'y a là que des comportements indéfinis (je suis même surpris que le premier code compile) ou définis par l'implémentation...
    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.

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 494
    Billets dans le blog
    1
    Par défaut
    Oups ! c'est le matin et ce n'avait pas fait attention qu'on affichait *p. Quel crédit accordes-tu à ce site ? Es-tu sûr que les réponses sont fiables ?

    p=&a[2][2][2] you declare only two 2D arrays, but you are trying to access the third 2D(which you are not declared) it will print garbage values.
    OMG, mais c'est tout bête : si ton tableau est de taille 2*2*2, et comme la numérotation commence a 0, tu ne peux pas aller plus loin que 1 dans les indices..... -__-

    *q=***a starting address of a is assigned integer pointer. Now q is pointing to starting address of a. If you print *q, it will print first element of 3D array.
    Je ne suis pas d'accord. q ne pointe pas vers le début du tableau, il pointe vers une adresse indéterminée. A cette adresse, on essaye de stocker la valeur a[0][0][0] soit 10.

    Citation Envoyé par mala92
    **a et ***a pointe quelque part.
    Euh.... Je m'avance peut-être mais a priori, je dirais que **a et ***a sont des éléments de ce tableau de tableaux de tableaux et que ***a est le premier élément de l'ensemble (10).

  10. #10
    Membre éclairé
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Par défaut
    Ca va, j'ai compris merci.

    en fait j'ai pose le tableau suivant:

    1 2 3 4 5
    i++ i-- ++i --i i
    resultats 4 5 5 4 5

    on execute les instructions en partant de la droite, donc
    i = 5
    ensuite
    on fait --i, donc = 4
    puis
    ++i ---> 5
    i-- ---> 5, et ensuite 4
    i++ ---->4, et ensuite 5....

    Je sais pas si j'ai ete clair, mais je me suis compris

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 494
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(void)
    {
        int i = 5;
        printf("%d%d%d%d%d", i++ ,i-- ,++i ,--i ,i);
        return 0;
    }
    Avec MinGW, j'obtiens 45555

    Il faut fouiller la norme pour connaitre les règles d'évaluation des arguments d'une fonction, mais il me semble me souvenir que c'est indéfini.

    EDIT : trouvé ! Dans la norme C99, au point 10, partie 6.5.2.2 Function calls:
    The order of evaluation of the function designator, the actual arguments, and subexpressions within the actual arguments is unspecified, but there is a sequence point before the actual call.
    L'ordre d'évaluation n'est pas spécifié donc le résultat d'un tel printf() est indéterminé.

  12. #12
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le site qui propose ces questions en fournissant de telles "réponses" est une vrai catastrophe. A fuir sans hésiter.

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Avec MinGW, j'obtiens 45555
    Même résultat avec un bon vieux gcc sous Linux.

    Comme dit Diogene, un tel site est à fuir sans hésiter. Quand à la boite qui impose ça lors d'un entretien d'embauche...

  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 494
    Billets dans le blog
    1
    Par défaut
    Plus j'en lis et plus j'ai peur. Soit c'est mal expliqué (comme ici avec les strings) ou alors totalement faux (comme ici avec le const ou avec les opérateurs bits à bits).....

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Le coup des ++, c'était la grosse discussion avec doccpu sur le séquencement et les limites de la norme, certains s'en souviennent peut-être.
    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.

  16. #16
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    IsraGab, si tu as une seule chose a retenir, c'est ceci :

    Citation Envoyé par diogene Voir le message
    Le site qui propose ces questions en fournissant de telles "réponses" est une vrai catastrophe. A fuir sans hésiter.
    Si tu as besoin de tutoriels, va sur http://c.developpez.com/tutoriels
    Si tu as besoin de ressources en anglais, demande ici, certains pourront te repondre, mais surtout, fuis ce site !
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

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

Discussions similaires

  1. question en entretien d'embauche
    Par fanototo dans le forum Entretien
    Réponses: 6
    Dernier message: 06/06/2014, 16h41
  2. [Android] HR interview questions - préparation entretien d'embauche
    Par azeer dans le forum Mon application mobile
    Réponses: 2
    Dernier message: 30/04/2013, 11h56
  3. Réponses: 71
    Dernier message: 28/03/2011, 11h48
  4. entretien d'embauche, questions
    Par chamamo dans le forum Entretien
    Réponses: 3
    Dernier message: 10/02/2011, 19h20
  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