[CPP] Interrogations de janvier des années précédentes.

Voir le sujet précédent Voir le sujet suivant Aller en bas

[CPP] Interrogations de janvier des années précédentes.

Message  L@rgo_XIII le Mar 04 Jan 2011, 15:10

Bonjour, je parcours actuellement les interrogations de janvier des années précédentes et je vérifie mes réponses en tentant de compiler les codes.

J'aurais une question pour le code suivant : Code 10, 2006-2007


Code:

#include <iostream.h>
int & minOf(int a, int b)
{
   if(a<b)
      return a;
   else
      return b;
}


int main() {
   int x = 9, y=6, z;
   z = minOf(x,y);
   cout << z << endl;
}

Ce code compile et me donne le résultat "attendu" qui est 6.

Pourtant avant de vérifier j'étais persuadé qu'il allait me donner n'importe quel résultat. En effet puisque la référence retournée par la fonction minOf() est une référence à une variable locale (d'ailleurs le compilateur nous le rappelle bien au passage par Warning) on ne peut pas être sûr que la référence reçue sera encore valable après l'exécution de la fonction ...

Je pense donc que si j'obtiens le bon résultat qui est 6, c'est uniquement par chance, tout simplement parce qu'aucun autre programme n'a entre temps été modifié cet espace mémoire qui aurait très bien pu être réalloué et modifié ...

Ai-je raison ? Tort ? A l'interro que doit je répondre ? Que le résultat est aléatoire, même si l'expérimentation me donne tout le temps 6 ?


Bien à vous.

Lionel


PS: J'ai donné volontairement un titre générique au sujet car je pense que je reviendrai sûrement poser d'autres questions pour d'autres bouts de code ...

L@rgo_XIII

Nombre de messages : 80
Age : 30
Prénom : Lionel
Statut : Etudiant en 3e année Réseau & Télécommunicatio
Localisation : Uccle
Date d'inscription : 20/09/2010

http://largoxiii.wordpress.com

Revenir en haut Aller en bas

Re: [CPP] Interrogations de janvier des années précédentes.

Message  smb le Mar 04 Jan 2011, 15:48

Réflexion pertinente !

Ce n'est absolument pas une bonne idée de retourner un alias d'un objet local.

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

Re: [CPP] Interrogations de janvier des années précédentes.

Message  nvs le Mar 04 Jan 2011, 16:50

L@rgo_XIII a écrit:
[...] A l'interro que doit je répondre ? Que le résultat est aléatoire, [...]
tout juste !















Like a Star @ heaven

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [CPP] Interrogations de janvier des années précédentes.

Message  L@rgo_XIII le Dim 09 Jan 2011, 15:25

Merci pour la réponse précédente.


La fatigue faisant, et/ou le stress de l'interrogation qui approche, je ne trouve pas ce qui cause le bug de ce minuscule bout de code ...

Code:
#include <iostream>
using namespace std;

class P{
   int *tab;
   unsigned size;
public:
   P(unsigned nb)
   {
      if (nb==0) nb = 1;
       int *tab = new int[nb];
      size = nb;
      for (nb=0;nb<size;nb++) tab[nb]=0;
   }
   void putAt(unsigned i, int val) {tab[i]=val;}
   int getAt(unsigned i){return tab[i];}
};

int main() {
      P test(10);
      test.putAt(5,-9);
      cout << test.getAt(5) << endl;
}

Après débugage, celà vient de l'exécution "test.putAt(5,-9);" ...
Certainement un problème d'indice, mais lequel ? Atteindre l'indice 5 d'un tableau de 10 cases ne devrait pas poser de soucis Neutral Neutral
La solution ne manquera sûrement pas d'être simpliste, mais je suis pourtant dans le flou total

Est-ce que quelqu'un peut éclairer ma lanterne ? cheers

Lionel pale

L@rgo_XIII

Nombre de messages : 80
Age : 30
Prénom : Lionel
Statut : Etudiant en 3e année Réseau & Télécommunicatio
Localisation : Uccle
Date d'inscription : 20/09/2010

http://largoxiii.wordpress.com

Revenir en haut Aller en bas

Re: [CPP] Interrogations de janvier des années précédentes.

Message  Yacine le Dim 09 Jan 2011, 16:18


int *tab = new int[nb];

Tu crées une nouvelle varibale (locale) au contructeur, tu n'initialises pas l'attribut tab =)

Yacine

Nombre de messages : 7
Prénom : Yacine
Date d'inscription : 08/12/2010

Revenir en haut Aller en bas

Re: [CPP] Interrogations de janvier des années précédentes.

Message  L@rgo_XIII le Dim 09 Jan 2011, 16:49

Yacine a écrit:
int *tab = new int[nb];

Tu crées une nouvelle varibale (locale) au contructeur, tu n'initialises pas l'attribut tab =)
Bien vu, merci !

Il suffit donc de remplacer

Code:
int *tab = new int[nb];
par
Code:
tab = new int[nb];

L@rgo_XIII

Nombre de messages : 80
Age : 30
Prénom : Lionel
Statut : Etudiant en 3e année Réseau & Télécommunicatio
Localisation : Uccle
Date d'inscription : 20/09/2010

http://largoxiii.wordpress.com

Revenir en haut Aller en bas

Re: [CPP] Interrogations de janvier des années précédentes.

Message  L@rgo_XIII le Dim 09 Jan 2011, 18:38

J'ai un petit problème avec la question 2 de janvier 2007. Je ne vois pas comment déterminer le nombre d'éléments du tableau tabStr (qui contient des chaines de 15 caractères).

Il est déclaré ainsi :

char tabStr[][15]

Pour ceux qui veulent l'énoncé complet, je l'ai réuploadé ici

Le but du code suivant est de trier le tableau tabStr en majeur de manière croissante sur la
taille des chaînes et en mineur de manière décroissante sur l’ordre alphabétique.
Ce code utilise une pseudo-fonction (macro) dont le nom est NBELEM et dont l’expansion
est telle que si vous ajoutez une ou plusieurs chaînes correctes au tableau tabStr, il ne faudra
rien changer au reste du code pour que le tri et l’afffichage fonctionnent correctement. Notez
qu’il n’y a pas besoin d’inclure d’autres headers que ceux déjà inclus.
Ecrivez le code nécessaire pour chaque point (A, B, C) sur la feuille en annexe.

Code:

#include <iostream.h>
#include <stdlib.h>
#include <string.h>

// A : définition de la pseudo-fonction NBELEM

// B : définition de la fonction utilisée par qsort

int main ( int argc, char * argv[] )
{
char tabStr [][15] = {"BZUT", "AZARE", "AZUR", "BZUTE", "AZAR", "BZIT", "AXE" ,"ZO", "AZA"};

// affichage du tableau avant le tri
for ( int i=0; i< NBELEM(tabStr); i++ )
cout<<tabStr[i]<<endl

/*
TRI du tableau
en majeur : croissant sur la taille des chaînes
en mineur : décroissant sur l'ordre alphabétique
*/
// C : appel de la fonction standard qsort

// affichage du tableau après le tri
for ( int i=0; i< NBELEM(tabStr); i++ )
cout<<tabStr[i]<<endl;
system("pause");
return 0;
}

L@rgo_XIII

Nombre de messages : 80
Age : 30
Prénom : Lionel
Statut : Etudiant en 3e année Réseau & Télécommunicatio
Localisation : Uccle
Date d'inscription : 20/09/2010

http://largoxiii.wordpress.com

Revenir en haut Aller en bas

Re: [CPP] Interrogations de janvier des années précédentes.

Message  Jeyminee le Dim 09 Jan 2011, 18:45

Un element qui m'a donne egalement bcp de soucis...

Voici juste la ligne de cette macro :

Code:

#define NBELEM(tabstr) (int)(sizeof(tabstr) / 15)

C'est donc la taille totale du tableau divisiee par la taille d'un element du tableau. Ici, 15 car 15 char et qu'un char = 1.

Jeyminee

Nombre de messages : 20
Age : 27
Prénom : Frederic
Date d'inscription : 12/12/2009

Revenir en haut Aller en bas

Re: [CPP] Interrogations de janvier des années précédentes.

Message  L@rgo_XIII le Dim 09 Jan 2011, 19:02

Merci beaucoup. En fait j'avais très mal compris la question, je n'avais pas compris qu'on demandait de faire une MACRO :-)

Pour la portabilité, c'est pas encore mieux de remplacer 15 par 15*sizeof(char) ?!

Lionel

L@rgo_XIII

Nombre de messages : 80
Age : 30
Prénom : Lionel
Statut : Etudiant en 3e année Réseau & Télécommunicatio
Localisation : Uccle
Date d'inscription : 20/09/2010

http://largoxiii.wordpress.com

Revenir en haut Aller en bas

Re: [CPP] Interrogations de janvier des années précédentes.

Message  L@rgo_XIII le Dim 09 Jan 2011, 19:07

Bon, je sais je n'arrête pas de poser des questions, mais ce sont parfois les détails qui comptent :

Le code suivant

Code:
int main(void){
   int c=1, a=7,b=3;
   if (a>b>c)
      cout << "DEC" << endl;
   else
      cout << "BUG" << endl;
}

Compile, s'exécute et affiche BUG.
D'ailleurs le compilateur nous préviens d'un warning que


comparisons like 'X<=Y<=Z' do not have their mathematical meaning

Mais alors, quelle est la signification de cette expression ?

L@rgo_XIII

Nombre de messages : 80
Age : 30
Prénom : Lionel
Statut : Etudiant en 3e année Réseau & Télécommunicatio
Localisation : Uccle
Date d'inscription : 20/09/2010

http://largoxiii.wordpress.com

Revenir en haut Aller en bas

Re: [CPP] Interrogations de janvier des années précédentes.

Message  smb le Dim 09 Jan 2011, 19:12

L@rgo_XIII a écrit:Bon, je sais je n'arrête pas de poser des questions, mais ce sont parfois les détails qui comptent :

Le code suivant

Code:
int main(void){
   int c=1, a=7,b=3;
   if (a>b>c)
      cout << "DEC" << endl;
   else
      cout << "BUG" << endl;
}

Compile, s'exécute et affiche BUG.
D'ailleurs le compilateur nous préviens d'un warning que


comparisons like 'X<=Y<=Z' do not have their mathematical meaning

Mais alors, quelle est la signification de cette expression ?

C'est le genre de chose qu'il ne faut pas faire !

a>b est évalué à true (1)
1 > c est évalué à false

--> BUG


smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

Re: [CPP] Interrogations de janvier des années précédentes.

Message  L@rgo_XIII le Dim 09 Jan 2011, 19:14

ok, merci.
Je me doutais que c'était celà, mais je pensais que c'était peut être une expression plus particulière que ça.

L@rgo_XIII

Nombre de messages : 80
Age : 30
Prénom : Lionel
Statut : Etudiant en 3e année Réseau & Télécommunicatio
Localisation : Uccle
Date d'inscription : 20/09/2010

http://largoxiii.wordpress.com

Revenir en haut Aller en bas

Re: [CPP] Interrogations de janvier des années précédentes.

Message  nvs le Dim 09 Jan 2011, 19:35

L@rgo_XIII a écrit:Pour la portabilité, c'est pas encore mieux de remplacer 15 par 15*sizeof(char) ?!
non car la norme dit que sizeof(char) est égal à 1. je suppose que c'est la manière de définir le byte dans le cadre du langage c. rappelez-vous qu'un byte n'est pas nécessairement un octet, mais que sa définition peut varier. en c, un byte est égal à la taille occupée par un char.






I love you

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [CPP] Interrogations de janvier des années précédentes.

Message  L@rgo_XIII le Dim 09 Jan 2011, 19:39

Wouaw, précision plus qu'intéressante. Bizarrement j'ai l'impression qu'on me l'avait déjà dit mais que j'avais oublié :-)

Un grand merci.

Lionel

L@rgo_XIII

Nombre de messages : 80
Age : 30
Prénom : Lionel
Statut : Etudiant en 3e année Réseau & Télécommunicatio
Localisation : Uccle
Date d'inscription : 20/09/2010

http://largoxiii.wordpress.com

Revenir en haut Aller en bas

Re: [CPP] Interrogations de janvier des années précédentes.

Message  Contenu sponsorisé Aujourd'hui à 05:27


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum