Bienvenue sur PEBKAC.fr, le site qui recense les anecdotes où l’on se moque des utilisateurs ne maîtrisant pas l’outil informatique. PEBKAC est un acronyme signifiant « Problem Exists Between Keyboard And Chair ».
Le problème se situe entre la chaise et le clavier : soumettez vos histoires, donnez votre avis !
Ce site n'est pas le site original pebkac.fr. Je publie ici la liste des PEBKAC que j'ai pu sauvegarder avant que le site original ne soit mis hors ligne.
En cours d'informatique en classe prépa, on nous apprend à écrire ce genre de code (ici une procédure supprimant une occurrence d'un élément dans une liste chaînée, s'il en existe) :

type  
    Liste = ^Cellule;
    Cellule = record
        tete: integer; 
        queue: Liste;   
        end;

procedure del(e:integer; l:Liste);
begin
 if l <> nil then
  if l^.queue <> nil then 
   if l^.queue^.tete = e then
    l^queue = l^.queue^.queue
   else
    del(e,l^.queue);
end;

Ce code génère une fuite de mémoire manifeste, car la mémoire utilisée par l'élément supprimé n'est pas libérée. Anticipant la remarque, le professeur nous lance : « Si on voulait bien faire, il faudrait libérer la mémoire que prenait l'élément supprimé. Mais aujourd'hui, les ordinateurs ont tout de même beaucoup de mémoire, donc ça n'est pas nécessaire ».

Certes, les ordinateurs ont peut-être beaucoup de mémoire, mais si le programme en question est destiné a tourner plusieurs mois sans interruption, il aura toujours assez de mémoire, l'ordinateur ? PEBKAC.
PEBKAC #6347 proposé par danarmk le 03/12/2012 | 54 commentaires | 👍🏽 👎🏽 +225
Mais si on prend les mauvaises habitudes maintenant, qu'est-ce que ça deviendra avec les programmes qui prennent 1 Gio de RAM !
Commentaire #67739 écrit par BUPO le 03/12/2012 à 12h32 | 👍🏽 👎🏽
<troll class="pourrieetobselete"> Les développeurs de la fondation mozilla doivent avoir eu ce prof... </troll>

(bon, je dis ça, mais j'utilise Firefox comme navigateur principal)
Commentaire #67741 écrit par ROB le 03/12/2012 à 12h50 | 👍🏽 👎🏽
En même temps, les cours d'informatique de prépa, c'est surtout de l'algorithmique et des calculs de complexité... La programmation, version mains dans le camboui, ça arrive qu'en école...
Commentaire #67742 écrit par Mat+1 le 03/12/2012 à 12h55 | 👍🏽 👎🏽
C'est quoi comme langage ? A quoi sert l'opérateur "^" ?
Commentaire #67744 écrit par Epok__ le 03/12/2012 à 13h10 | 👍🏽 👎🏽
C'est du Pascal. Les ^ correspondent aux opérations de pointeurs.

Liste = ^Cellule
Une liste est un pointeur sur une cellule.

l^.queue
L'opérateur ^. sert pour le déréférencement de pointeur. En langage C-like :
l->queue
Commentaire #67749 écrit par Loom le 03/12/2012 à 13h35 | 👍🏽 👎🏽
C'est tellement mieux de prendre des mauvaise habitudes pendant 2 ans, surtout avec des arguments aussi bidons pour les justifier...
Commentaire #67750 écrit par Alibi le 03/12/2012 à 13h38 | 👍🏽 👎🏽
le code est peut être un peu superflue. sans le lire, j'ai très bien compris de quoi on parlait!
Commentaire #67756 écrit par geek85 le 03/12/2012 à 13h55 | 👍🏽 👎🏽
Ceux qui développent Flash aussi. Que ce soit chez macromedia ou adobe ...
Commentaire #67758 écrit par but2ene le 03/12/2012 à 13h56 | 👍🏽 👎🏽
« Si on voulait bien faire, ... »
Donc ce prof ne veut pas enseigner comment bien faire.

Il est vrai que dans ce petit exercice ça ne devrait pas pénaliser, sauf que c'est à ce moment là que les habitudes s'installent, et ça devient assez problématique par la suite.

En entreprise, que dira un élève qui a appris comme ça ?
« Il faudrait passer à 192Go de RAM sur notre serveur parce que l'outil qu'on a développé en bouffe pas mal. Mais ça doit être normal, il y a beaucoup de données »
Commentaire #67759 écrit par juu le 03/12/2012 à 13h58 | 👍🏽 👎🏽
Pourquoi est-ce que je n'ai jamais programmé en Pascal, déjà?
"regarde le code"
...ah oui, voila pourquoi. :s
Plus sérieusement, heureusement que y a les explications derrières...^^ PEBKAC validé. :)

(quoique... les variables d'une seule lettre, c'est obligatoire en PASCAL, ou c'est une mauvaise habitude de l'auteur? :p)
Commentaire #67761 écrit par Sihn le 03/12/2012 à 14h01 | 👍🏽 👎🏽
Le ^ en pointeur, le truc pas relou du tout... limite obligé de coder en qwerty (ce que je faisais en COBOL) pour pas péter un câble...
Commentaire #67763 écrit par neeko le 03/12/2012 à 14h07 | 👍🏽 👎🏽
yep. qd quelqu'un fait mal quelque chose parcequ'il n'est pas au courant, c'est regrettable mais la il sagit de quelqu'un qui sait ce qu'il faut faire, qui enseigne mais qui va balancer un argument de merde pour faire mal...

tant qu'on y est:

pour bien faire il ne faudrai pas mettre la main dans la fraiseuse pendant qu'elle usine la piece mais bon aujourd'hui on sait faire de bonnes protheses de mains ...
Commentaire #67764 écrit par achille le 03/12/2012 à 14h09 | 👍🏽 👎🏽
Une mauvaise habitude évidemment.
Pascal est un langage très verbeux donc usuellement plutôt facile à lire, mais l'absence d'indentation de l'extrait n'aide pas, faut avouer.
Commentaire #67765 écrit par Loom le 03/12/2012 à 14h11 | 👍🏽 👎🏽
Le "nil" c'est pas l'équivalent du "null" dans d'autres langages ?

if l nil then
if l^.queue [...]

Ca pète pas ça à l'exécution ?
Commentaire #67766 écrit par Acorah le 03/12/2012 à 14h14 | 👍🏽 👎🏽
Ce qui m'a le plus gêné dans la lecture, c'est le l (L) que j'ai pris pour un | (barre verticale, généralement utilisée pour faire un "OU")... En lisant ça, forcément, je pigeais que pouic au code... X)
Commentaire #67768 écrit par Sihn le 03/12/2012 à 14h15 | 👍🏽 👎🏽
En effet, à moins que ça corresponde à un "not null"... ce qui m'étonnerais franchement.
Commentaire #67769 écrit par Sihn le 03/12/2012 à 14h17 | 👍🏽 👎🏽
Les 3 if à la suite, c'est plutôt crade. On lui a pas appris les && (ou équivalent en Pascal)?

(sauf si il est payé à la ligne de code)
Commentaire #67770 écrit par Link le 03/12/2012 à 14h19 | 👍🏽 👎🏽
Je me suis aussi posé la question. Voir http://dictionnaire.phpmyvisites.net/definition-Nil-8882.htm

"Définition du mot NIL Qualifie, en LISP ou Pascal, un paramètre variable invalide, par exemple un pointeur nil. En C, l'équivalent est null."

Vu le code, je dirais que ça retourne 0 si invalide, 1 sinon.

edit: je voulais répondre à Acorah, mais j'ai (encore) loupé une ligne...
Commentaire #67771 écrit par Link le 03/12/2012 à 14h21 | 👍🏽 👎🏽
Je n'ai pas testé mais de tête je dirais que le code est faux.

Ça devrait plutôt être quelque chose comme ça :
if l <> nil and l^.queue <> nil then ...

Dans tous les cas ça ne "pètera pas à l'exécution" comme écrit ci-dessus. À la compilation plutôt.
Commentaire #67772 écrit par Loom le 03/12/2012 à 14h37 | 👍🏽 👎🏽
J'ai programmé en Pascal il y a... un certain temps.
Heureusement que j'ai eu un meilleur prof !

Les langages de la famille du Pascal sont effectivement verbeux.

Voir ADA, PL/SQL...

En ADA, une règle est : on écrit une fois, on lit souvent => on écrit lisiblement.

Ce prof donne directement les mauvaises habitudes...
Commentaire #67774 écrit par Delphes le 03/12/2012 à 14h53 | 👍🏽 👎🏽
c'est un code sans queue nil tête!
Commentaire #67776 écrit par ROB le 03/12/2012 à 15h18 | 👍🏽 👎🏽
OK, merci pour cette réponse très complète.
Commentaire #67778 écrit par Epok__ le 03/12/2012 à 15h28 | 👍🏽 👎🏽
@Loom : C'ets justement la joie des pointeurs, le compilateur ne peut pas savoir ce qu'il y aura dedans à l'exécution. Donc ça compile sans problème, par contre à l'exécution si jamais ton pointeur ne contient rien, ça explose. Je ne sais pas quel est le message d'erreur en Pascal mais en C tu auras droit à une belle "segmentation fault".
Et soit dit en passant, ton code ne fonctionne que si les booléens sont paresseux dans ton langage de programmation... Sinon même punition.

EDIT : arf moi aussi je me suis encore planté de bouton "répondre"...
Commentaire #67779 écrit par Acorah le 03/12/2012 à 15h34 | 👍🏽 👎🏽
Ah punaise !!!

Merci, Sihn, je prenais moi aussi le l pour un | ...
Commentaire #67780 écrit par Morrock le 03/12/2012 à 15h38 | 👍🏽 👎🏽
Si on t'apprend à conduire une voiture, ce n'est pas pour qu'ensuite on te crache dessus si tu ne sais pas manoeuvrer un camion.
Quand on ne fait que de l'algo, on ne devine pas les questions de mémoire, désolé.
Commentaire #67784 écrit par mini le 03/12/2012 à 16h32 | 👍🏽 👎🏽
Et puis c'est joli une *
Commentaire #67785 écrit par mini le 03/12/2012 à 16h34 | 👍🏽 👎🏽
"doivent avoir eu" ou "ont du avoir" ?
Commentaire #67787 écrit par Anon le 03/12/2012 à 17h01 | 👍🏽 👎🏽
Il faudrait vraiment que les gens apprennent à faire des listes chainées cycliques (avec un élément marqueur reliant le début et la fin de la liste)... C'est beaucoup plus performant, et aussi plus simple à implémenter.
Commentaire #67801 écrit par OzoneGrif le 03/12/2012 à 17h50 | 👍🏽 👎🏽
C'est du Pascal (très bon langage pour apprendre, c'est du C sans tous les trucs tordus ; très mauvais langage pour coder réellement : il n'y a pas les trucs tordus).
« type Liste = ^Cellule; » est l'équivalent de « typedef Cellule* Liste; » et « pointeur^ » l'équivalent de « *pointeur ».
En prépa, c'est ça ou du CAML.
Commentaire #67821 écrit par BSK le 03/12/2012 à 18h22 | 👍🏽 👎🏽
En fait le code donné par danarmk ne compile pas, il manque les opérateurs de comparaison. Je me demande si les protections du site n'ont pas fait sauter les « <> »... Clem ?
Commentaire #67830 écrit par BSK le 03/12/2012 à 18h29 | 👍🏽 👎🏽
Ça dépend, si tu veux l'utiliser comme une pille, la solution basique est la meilleur.
Commentaire #67833 écrit par BSK le 03/12/2012 à 18h31 | 👍🏽 👎🏽
Il y aurait du y avoir des <> effectivement... J'aurais juré les avoir mis, pourtant... Auraient-ils dégagés lors de la soumission ? Ça peut ressembler à des bouts de balises HTML, alors un script les a peut-être retiré. Dans tous les cas, j'en appelle à Clem pour faire une correction :) .
Commentaire #67841 écrit par danarmk le 03/12/2012 à 18h45 | 👍🏽 👎🏽
J'imbrique des if parce que je dois savoir si un truc n'est pas le pointeur vide avant d'aller chercher ce qu'il y a à l'intérieur :) . C'est vrai que les compilateurs peuvent optimiser le code pour ne pas vérifier la seconde condition si la première est fausse, mais bon. Je préfère ne pas jouer avec ce que les compilateurs savent faire ou non, et comme ça, du point de vue de la correction, c'est inattaquable. Ça fuite, mais ça plante pas.

Les variables à une seule lettre, c'est comme ça qu'on nous apprend à faire les choses... Dans (pratiquement ?) tous les sujets de l'X (et même des Mines et Centrale, je crois), tous les noms de paramètres des fonctions, par exemple, ont une seule lettre, voire deux. Voir par exemple là : https://gargantua.polytechnique.fr/siatel-web/files/download?id=DOCF00[...] (j'espère que le lien fonctionne ; si ce n'est pas le cas, une recherche du style "sujet informatique polytechnique" devrait vous mener aux résultats...)
Commentaire #67845 écrit par danarmk le 03/12/2012 à 18h58 | 👍🏽 👎🏽
C'est vrai que l'informatique de prépa est essentiellement de l'algorithmique (ainsi qu'une petite partie sur les langages rationnels). N'empêche, ce n'est pas un prétexte pour donner des mauvaises habitudes. Si on veut seulement faire de l'algo sans se soucier des problèmes de mémoires, on fait ça autrement que ce qui est présenté ici. D'autant plus que si on ne voit pas de commande pour libérer la mémoire (dont je ne connais même plus le nom), on voit des new...

En fait, je soupçonne qu'il y ait une raison peut-être plus plausible que le coup du "les ordis ont beaucoup de mémoire" pour "justifier" ce que le prof dit (je vous laisse en juger). C'est que le but de la prépa, c'est avant tout de réussir aux concours. Et aux épreuves d'informatique, il y a deux langages d'autorisés : Pascal et Caml. Mais les sujets sont clairement pensés pour être rédigés en Caml, alors, pour limiter la casse, le prof nous "épargne" ces problèmes de mémoire. Déjà que ceux qui font les sujets en Pascal sont désavantagés, si on rajoute les problèmes de libération de mémoire, ça se transforme en catastrophe (pour les candidats).

La meilleure solution pour régler ça serait de faire le cours en Caml, mais si l'un des deux profs (celui de première année ou celui de seconde année) trouve plus facile de faire un cours comme ça et de pénaliser les élèves plutôt que d'apprendre un nouveau langage, ça bloque.

Mais je ne me voyais pas expliquer tout ça dans le pebkac :p .
Commentaire #67852 écrit par danarmk le 03/12/2012 à 19h10 | 👍🏽 👎🏽
C'est malin ! Maintenant j'ai la question en tête !
Commentaire #67854 écrit par Banon le 03/12/2012 à 19h12 | 👍🏽 👎🏽
Moi j'm'en tape je code en JAVA!
Commentaire #67863 écrit par Hum. le 03/12/2012 à 20h06 | 👍🏽 👎🏽
Ce qui m'a plus fait chier c'est le begin et le end contre un {} en C.
Le pire c'est que certains compilateurs le demandaient même pour une seule ligne !

Bon après les structures compliquées (pointeur de pointeur) et les tableaux dynamiques en pascal ce n'est pas encore cela.
Commentaire #67875 écrit par but2ene le 04/12/2012 à 00h05 | 👍🏽 👎🏽
Ben pour les pointeurs nil ça fait la même chose en pascal (accès à 0x0). Segmentation fault ne vient pas du compilateur C mais de l'OS qui envois le signal sigbus si je me rappelle, et c'est la réponse par défaut si le signal n'est pas catché (librairie de gestion de signaux).

Sur Sun OS ça fait un coredumped message que j'ai eu souvent en DEUG. Mais on nous apprenait à libérer la mémoire.
Commentaire #67876 écrit par but2ene le 04/12/2012 à 00h12 | 👍🏽 👎🏽
Je ne suis pas convaincu même pour une file. Coté performance, je doute il faut gérer la boucle à chaque push ou pop. Ca rajoute des instructions. Même pas besoin d'élément marqueur la marque c'est le pointeur te donnant le départ ;)
Commentaire #67877 écrit par but2ene le 04/12/2012 à 00h20 | 👍🏽 👎🏽
Ben il ne faut pas oublier de virer certains éléments de certaines structures. Certains objets ont besoin d'un dispose (comme dans jgit), afin que le GC fasse son boulot. Beaucoup de dev l'oublient.
Les fuites, ça existe aussi en Java. Il ne faut pas s'inquiéter.
Commentaire #67878 écrit par but2ene le 04/12/2012 à 00h28 | 👍🏽 👎🏽
Non mais sérieux !!! La prépa ne donne pas de mauvaises habitudes, elle apprend à faire de l'algorithmique pas de la programmation concrète. La plupart du temps, on code même en pseudo-code... Et puis, quand tu deviens ingé, tu t'amuses pas à faire des multiplications matricielles en O(n^2,8) tous les jours...
Commentaire #67903 écrit par Mat+1 le 04/12/2012 à 08h59 | 👍🏽 👎🏽
c'est aussi la faute aux languages recents. qui utilise encore mysql_free_result et mysql_close en php???

on t'apprends que t'as pas besoin de le faire car les machines sont plus puissantes et les languages liberent la memoire et autre a la fin du script

je me souviens que quand j'apprenais le c dans les annees 97 environ si tu liberais pas ta memoire ou liberais pas les fichiers, t'avais pas d'autre choix que de rebooter ton pc et ca ca t'oblige vite a prendre de bonnes habitudes
Commentaire #67905 écrit par achille le 04/12/2012 à 09h14 | 👍🏽 👎🏽
Ils ont effectivement sauté pour shooter les éventuelles balises HTML à la soumission.

Je ne suis pas familier de ce langage, je propose qu'un user plus familier que moi copie en réponse ce qui ne va pas, et je ferai l'édition du code ci-dessus.
Commentaire #67956 écrit par Clem le 04/12/2012 à 11h41 | 👍🏽 👎🏽
Remplacer "l nil" par "l <> nil" ainsi que "l^.queue nil" par "l^.queue <> nil".
Commentaire #67959 écrit par danarmk le 04/12/2012 à 11h47 | 👍🏽 👎🏽
OK tu saurais me dire si c'est OK comme ça ?
Commentaire #67987 écrit par Clem le 04/12/2012 à 14h40 | 👍🏽 👎🏽
Ça à l'air bon. Et merci pour l'indentation également :) !
Commentaire #67997 écrit par danarmk le 04/12/2012 à 15h23 | 👍🏽 👎🏽
Sur une liste linéaire, la performance se perd car il faut ajouter des contrôles et un comportement différent (et donc une branche de code) pour chaque début et fin de liste, sur les ajouts, suppressions, et lectures d'élément.

Avec une liste cyclique, l'algorithme est strictement identique quelque soit la position dans la liste : Pas de contrôle, pas de branche, et donc meilleure performance et plus simple a implémenter.

C'est tellement évident une fois qu'on le met en pratique que faire des listes linéaires parait soudainement d'une bêtise absolue. Mais l'esprit humain veut toujours aller vers le concret : faire du cyclique ne semble pas naturel.
Commentaire #68058 écrit par OzoneGrif le 04/12/2012 à 19h55 | 👍🏽 👎🏽
Beaucoup de dev Java ne savent pas non plus utiliser les liaisons faibles... élément indispensable pour que le GC fasse correctement son boulot sans avoir à libérer manuellement un objet.
Commentaire #68097 écrit par OzoneGrif le 05/12/2012 à 00h00 | 👍🏽 👎🏽
Tu parles de références faible et douces (weakreference et softreference) ?
J'ai vu cela mais je n'ai toujours pas trouvé un intérêt pour ce que je fais. Ou j'ai besoin de l'objet ou j'en ai pas besoin. Je n'ai pas eu un demis mot. Déjà que le GC m'emmerde quand je fais du benchmark, si en plus j'ai les objets qui disparaissent à son grés, je n'ai pas fini :)

Pour la gestion de cache il y a d'autres objets ;)
Commentaire #68113 écrit par but2ene le 05/12/2012 à 08h54 | 👍🏽 👎🏽
Ah windows9x et sa gestion catastrophique. J'ai arrêter de dev dessus (pour le projet perso) quand mon bureau a changé de couleur suite à un oublie de 0 à la fin d'une string :)

Sous linux aucun soucis tu ferme l'application la mémoire est libérée et tu repart ;)
Commentaire #68115 écrit par but2ene le 05/12/2012 à 09h06 | 👍🏽 👎🏽
c'est sur que c'est plus pratique mais ca t'incite pas a prendre de bonnes habitudes...

j'avoue que je ne les ai pas toutes prises quand meme ...
Commentaire #68145 écrit par achille le 05/12/2012 à 12h36 | 👍🏽 👎🏽
Pour les bonnes habitudes, il y a valgrind :)
Commentaire #68159 écrit par but2ene le 05/12/2012 à 15h02 | 👍🏽 👎🏽
C'est ridicule de dire que c'est un pebkac.
Il y a un contexte qui ne sera JAMAIS celui d'un code qui tournera des mois.
La programmation en prépa, c'est dans le but de réaliser quelques opérations mathématiques pour faire des exos de maths ou de physique.
Le prof met déjà en garde des problèmes de mémoire. Il va plus loin que ce qu'il a besoin d'enseigner.
On est au niveau d'un "hello world" avec les exo de prepa.

(Et en prépa, il y a d'autres langages que les deux précédemment cités, il y a aussi de la programmation sur maple.)
Commentaire #68349 écrit par Peredur le 07/12/2012 à 13h35 | 👍🏽 👎🏽
Tu mélanges les cours que tu décris (que j'appellerais "cours Maple", bien que Maple ne soit pas le seul langage autorisé) avec les cours d'option informatique de la filière MPSI/MP, pour lesquels les seuls langages autorisés sont Pascal et Caml.

Dans les cours d'option, le but n'est pas d'utiliser les commandes Maple pour diagonaliser une matrice ou résoudre numériquement une équation. Certes, le but n'est pas non plus de faire des programmes tournant des mois, mais puisqu'on a à faire à de la gestion mémoire (on fait des new), c'est un Pebkac de donner des mauvaises habitudes à ce sujet.
Commentaire #68412 écrit par danarmk le 07/12/2012 à 23h04 | 👍🏽 👎🏽