Jump to content

Mathieu STEFANI

Anciens
  • Content Count

    61
  • Joined

  • Last visited

  • Days Won

    10

Mathieu STEFANI last won the day on July 27 2016

Mathieu STEFANI had the most liked content!

About Mathieu STEFANI

  • Rank
    Member

Profile Information

  • Gender
    Not Telling
  • Cursus
    Alumni
  1. Mais euh, elles sont pas à la demande les vidéos ? Vous pouvez pas les visionner quand vous voulez ?
  2. Si étant que les slides du cours soient en adéquation avec les thèmes abordés par vos vidéos ..
  3. T *pt; déclare une variable de type T * (pointeur sur T), non initialisée. Le contenu de pt est donc complètement aléatoire. Essayer de déréférencer ce pointeur tel quel provoque un comportement indéterminé. T *pt = NULL; déclare une variable de type T * (pointeur sur T), initialisée à NULL. Le contenu de pt est donc connu et correspond à la macro spéciale NULL. Essayer de déréférencer un tel pointeur provoque également un comportement indéterminé. Dans les deux cas, il n'y a qu'une seule allocation qui se produit, celle de la variable pt. Tant que tu n'as pas de malloc qui traine, rien n'est alloué dynamiquement.
  4. Ce que tu ne devrais pas faire car en exposant un détail d'implémentation comme celui-ci au monde entier, tu brises le principe d'encapsulation. Dans Plateau, plutôt que de retourner ta matrice au complet, tu devrais faire une fonction qui prend en paramètre un x et un y, et qui te renvoie la case associée à ce couple (x, y). Accessoirement, tu peux valider que (x, y) ne dépasse pas les limites de ta matrice et faire crasher ton programme si tel est le cas (assert)
  5. Pour ceux que ça intéresse, ma solution (implémentation libre), en C++11. Je me suis uniquement contenté d'implémenter une partie du sujet, mais si ça peut aider des étudiants à comprendre et appréhender le C++ moderne, tant mieux.
  6. Construis un vector de cases possibles pour l'ange. Enlève de ce vector toutes les cases ayant été détruites, puis cherche si la case entrée par l'utilisateur est présente dans ce vector.
  7. 03 - Core language features Slide 05: Tu dis "similar to a array". Mise à part la faute d'anglais (d'ailleurs ce n'est pas la seule, mais je ne me suis pas attardé sur la forme), je ne suis pas convaincu par la formulation, étant donné qu'une structure et un array sont deux types distincts. D'autre part, leur disposition en mémoire n'est pas semblable. Pour un tableau, les éléments seront contigüs en mémoire. Pour une structure, ils sont séquentiels mais pas forcément contigus, étant donné que le compilateur est libre d'ajouter des bytes de padding pour respecter l'alignement. Tout ça pour dire que je ne suis pas convaincu de la pertinence de comparer une structure à un tableau, mais ça peut se discuter (en tout cas des détails sont, à mon sens, nécessaires). Slide 06: Toujours par souci de vocabulaire, j'aurais plutôt dit "attribute" au lieu de "property" Slide 07-09: Ce n'est pas très courant de déclarer ce genre de structure à l'intérieur d'une fonction, une raison particulière d'avoir fait ce choix ? Il faut être clair sur la portée dans ce cas là je pense. Slide 12: Pareil, s/property/attribute Slide 17: Corrige ton anglais Slide 19: Précise que la taille d'un type donné peut dépendre de l'architecture (exemple sizeof(int) sur x86 vs x86_64). Tu as par contre raison pour char où la spécification définit bien sizeof(char) == 1. Slide 20: Ok, en supposant que sizeof(int) == 4 sur l'architecture cible. Slide 21: Anglais (au fait tes tableaux sont en français) Slide 25: Léger détail, mais il y a code de format spécial pour printf, qui est "%p" pour affichier un void * sous forme hexadécimale. Slide 27: Je me pose beaucoup de questions sur ce slide. Qu'as-tu voulu expliquer exactement ? Tout d'abord, tu déréferences un pointeur qui n'a pas été initialisé, ce qui va provoquer un crash pur et dur du programme. Ensuite, sur le schéma, je ne comprends pas trop ce que tu as voulu représenter. Pour être clair visuel, j'aurais représente en mémoire date et pt, et j'aurais mis une flèche allant de pt vers &date. Slide 28: Ok tu le fais là, donc je ne comprends pas le but du slide d'avant. Mais je n'aurais pas mis pt comme ça. Réserve lui sa propre place en mémoire comme je l'ai dit plus haut, comme ça il sera clair qu'il s'agit de deux variables différentes. Là on dirait qu'il s'agit de la seule et même variable. Un peu comme si tu essayais d'expliquer le concept de référence en C++. Remarque aussi générale, tu devrais encourager les étudiants à initialiser leur pointeur à NULL. Non seulement ça sera mieux plutôt qu'une valeur non initialisée qui peut contenir un peu tout et n'importe quoi, mais également cela aura pour conséquence de n'avoir aucun effet avec free(ptr); Slide 31: Ok tu le spécifies ici, je l'aurais fait plus tôt et j'aurais plus insisté Par contre soit l'anglais n'est pas correct encore une fois, soit il manque des mots dans ta seconde phrase. Les gars, faites au moins corriger l'anglais dans les cours, je vous en supplie. Slide 32: Délare ton tableau juste au dessus pour que ce soit clair. Parce que si l'étudiant essaie en déclarant int i[2]. aïe. Slide 34: Je verrais bien un schéma là aussi, avec la représentation mémoire du tableau et du pointeur. Je suis persuadé qu'un concept aussi complexe que les pointeurs est beaucoup plus appréhendable avec de bons visuels et de bons schémas. Slide 37: "An array is a pointer". Je ne vais pas être aussi catégorique que j'ai pu l'être dans le passé, mais je ne suis pas d'accord avec-toi là dessus. Oui, les pointeurs et les tableaux sont assez similaires, mais non, un tableau n'est pas un pointeur. Je me souviens d'ailleurs de débats acharnés que l'on a pu avoir à l'époque avec des membres chevronnés du forum C du siteduzero. La source confusion est la suivante: Le concept clé étant l'array-decaying. En gros, un tableau de type T[] est automatiquement convertible en pointeur de type T *const, pointant vers le premier élément du tableau. Donc, dans l'expression suivante a, l'identifieur a se "transforme" en pointeur. Si en C, les tableaux et pointeurs étaient réellement identiques comme tu le prétends, alors ils seraient interchangeables et on pourrait écrire ceci: char tab[] = "hello"; char *tab2 = "hello"; tab[0] = 'H'; tab2[0] = 'H'; Je te laisse comprendre pourquoi ce bout de code ne fonctionne pas. Donc, pour résumer, non, un tableau N'EST PAS un pointeur. Oui, l'identifiant d'un tableau est automatiquement transformé en pointeur (constant) vers son premier élément, mais ça s'arrête là. Les deux ne sont pas interchangeables, donc il n'y a pas de relation d'équivalence (cf mon argumentaire). Slide 40: k n'est pas utilisé ? Slide 45: Il faut vraiment insister sur comment est représenté un char* en mémoire, et insister que, qu'importe le segment dans lequel le compilateur décide de l'allouer, c'est du lecture-seule, et que, malheureusement, le C autorise à omettre le qualificateur const Slide 53: Je sais que c'est dans la norme Epitech, mais pourquoi les parenthèses autour du return ? Je n'ai jamais compris cet aspect de leur norme, return est un mot-clé, pas une fonction ou autre. Slide 77: Tu veux plutôt dire que le point d'entrée est la fonction main(), pas "main.c" ? Tu peux très bien ne pas avoir de main.c et un main() dans un autre fichier. Slide 84: s/library/header, j'insiste sur ça. Tu peux parler de l'endroit où le compilateur va cherche le header, entre <> et "" si tu veux. Slide 95: Idem. Slide 125: Précse que fgets rajoute le '\n' dans le buffer, ça peut jouer des surprises avec strcmp par exemple. La pratique général est de lire avec fgets dans un buffer de taille fixe, de chercher la présence du '\n' avec strchr, et de le remplacer par 0 si strchr renvoie un pointeur != NULL. Slide 140: Tes phrases veulent pas dire grand chose. Je vois pas trop non plus en quoi allouer dynamiquement permet d'optimiser la mémoire. Slide 142: Bonne pratique: vérifier le retour de ses mallocs. Déréférencer un pointeur NULL est un comportement indéterminé en C. Slide 144 Idem
  8. Ça l'avance si tu prends le temps de comprendre l'erreur
  9. C'est là où C++11 et le mot-clé override serait venu à ta rescousse. Indice: http://ideone.com/KPIJ1k
  10. Bah dans le .h, il suffit de déclarer Joueur *joueurs[2]; et non Joueur* joueur; As-tu bien respecté les règles inhérentes au polymorphisme ? i.e modifierCase doit être virtual (elle doit être virtuelle pure dans Joueur idéalement).
  11. Visiblement, tu as déclaré un tableau de type Joueur et non Joueur*: Joueur* joueurs[2] = { new Ange(j1, plateau.getDim() / 2, plateau.getDim() / 2), new Demon(j2) };
  12. Non, tu y auras accés uniquement s'il fait parti de ta classe en tant que variable membre et que tu l'initialises correctement. const-correctness: getDim() devrait être déclarée const.
  13. Ou est-ce que tu initialises Plateau ? Je suis pratiquement sûr que tu vas devoir le passer en paramètre du constructeur: Ange::Ange(const Plateau& plateau) : ligne(plateau.getDim() / 2) , colonne(plateau.getDim() / 2) { } Voire faire une méthode statique: Ange Ange::positionSurPlateau(const Plateau& plateau) { Ange ange(plateau.getDim() / 2, plateau.getDim() / 2); return ange; }
  14. Je vois pas en quoi faire de la validation comme je l'ai décrit serait du hors sujet. Si ton formateur te pénalise parce que tu t'es permis, à juste titre, de prendre quelques libertés par rapport au sujet, il mériterait la sanction disciplinaire sur le champ.
  15. Reporter une erreur serait mieux plutôt que de magiquement changer l'entrée. Je suppose que la méthode incorrect vérifie juste que les nombres entrés par l'utilisateur sont valides ou non, selon que ce soit l'ange ou le démon (peut-il se déplacer sur le plateau à l'endroit indiqué ou non ?). Si tu veux vérifier que l'utilisateur renseigne bien des entiers, et non pas des caractères, il va falloir le faire directement dans la fonction « saisir », vu que ça implique de vérifier directement l'état de std::cin. Attention, faire de la validation d'entrée en C++, comme en C, ce n'est pas simple. Dans l'ordre, il faut: 1. Vérifier l'état du flux d'entrée (if !(std::cin >> x)) 2. Si l'état n'est pas correct, ré-initialiser le flux avec clear() 3. Ignorer tous les caractères restant dans le flux avec ignore() 4. Tout cela en boucle
×
×
  • Create New...