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 pleine relecture de code (en langage C), je tombe sur l'algo suivant :

switch(val)
{
  case 0:
  case 1:
    if (val == 0)
    { ... }
    else if (val == 1)
    { ... }
    else if (val == 2)
    { ... }
    break;
  case 2:
    if (val == 2)
    { ... }
    break;
}

J'ai peur pour la suite de la relecture. PEBKAC.
PEBKAC #6753 proposé par Garf365 le 23/01/2013 | 55 commentaires | 👍🏽 👎🏽 +293
Ben on sait jamais, la valeur peut avoir changée entre temps, faut être bien sur de son coup.

Imagine que ce bout de code serve à gérer la température de fusion de l'uranium dans une centrale nucléaire, tu serais pas rassuré de voir la sécurité mise en oeuvre?
Commentaire #75313 écrit par Link le 23/01/2013 à 17h32 | 👍🏽 👎🏽
En cas de programmation parallèle avec des variables partagées entre processus ce serait possible... Mais dans ce cas-là on utilise plutôt des mutex ou autres systèmes de protection non ?
Commentaire #75320 écrit par Acorah le 23/01/2013 à 17h38 | 👍🏽 👎🏽
Je vois mal comment le code ci-dessus arrangerais quoi que ce soit dans le cas que tu dis... Ça n'empêche pas la modification juste après le if. (Et de toute façon, ce genre de truc a de bonne chance d'être shunté par le compilateur si les optimisations sont activées.
Commentaire #75322 écrit par danarmk le 23/01/2013 à 17h41 | 👍🏽 👎🏽
C'est là que je me dis que ce serait pas mal d'avoir pour chaque PEBKAC une petite explication juste avant les commentaires ^^
Commentaire #75325 écrit par Mastermind le 23/01/2013 à 17h44 | 👍🏽 👎🏽
Mais vous êtes bêtes, c'est pour être sur que l'ordinateur ne s'est pas trompé en comtant.
Commentaire #75327 écrit par Yukotso le 23/01/2013 à 17h46 | 👍🏽 👎🏽
OMG Faudra quand même que tu lui demande ce qu'il a voulu faire histoire de nous expliquer ! Parce que la j'ai beaucoup de mal à imaginer quelconque raison à cette atrocité...
Commentaire #75330 écrit par Navi le 23/01/2013 à 17h51 | 👍🏽 👎🏽
@danarmk: Pas si "val" est déclarée comme volatile :p. (Je reste tout à fait d'accord avec toi.)
Commentaire #75332 écrit par Cpp le 23/01/2013 à 17h53 | 👍🏽 👎🏽
Y'a qu'à demander :

En faisant un switch sur la variable val, il permet d'effectuer diverses actions en fonction de la valeur de cette variable :
-> Si la variable vaut 0, il ne fait rien, mais exécute quand même le reste du code puisqu'il n'a pas mis d'instruction break
-> Si la variable vaut 1 (ou 0, puisque le break n'a pas été mis), il vérifie ensuite la valeur de la variable avec le if et exécute un code différent si elle vaut 0, 1 ou 2 (alors qu'à ce stade, elle ne peut pas valoir 2 puisque le switch n'arrive ici que si elle vaut 0 ou 1)
-> Si la variable vaut 2, il commence par vérifier si elle vaut 2 (!!), et exécute un code dans ce cas-là.
Enfin, il quitte la structure switch avec le break à la fin de la condition 2.

En bref : il aurait mieux fait de mettre des break à la fin de chaque case, et d'inclure le code pour chaque valeur dans le case qui convient, ou alors de ne pas du tout mettre le switch et ne garder que la structure en if contenue dans le case 1.

Le pire, c'est que ça a beau être parfaitement horrible et mal optimisé, sa structure fonctionnera (sauf erreur de ma part)

En me relisant, je ne sais pas si je suis très clair en fait...
Commentaire #75333 écrit par Morrock le 23/01/2013 à 17h55 | 👍🏽 👎🏽
Je suis une bille en C et pourtant j'ai trouvé que c'était très clair. Merci, car moi non plus je n'avais pas compris l'algo... sifflote
Commentaire #75337 écrit par ROB le 23/01/2013 à 18h02 | 👍🏽 👎🏽
L'instruction switch (en C comme dans d'autres langages) teste la valeur en paramètre pour exécuter le code après le case de la valeur correspondante. Comme il est utilisé, il fait le travail d'un if.
Du coup l'instruction if ne sert à rien : le if teste la valeur de val, mais le case s'en est déjà chargé.
Commentaire #75339 écrit par Captain Obvious le 23/01/2013 à 18h06 | 👍🏽 👎🏽
Je viens de voir qu'il manque une précision dans mon explication :

Dans le dernier case, la variable peut également valoir 1 ou 0, toujours du fait de l'omission de l'instruction break à la fin des case correspondant à 0 et 1.

J'en profite pour ajouter que du coup, il doit avoir écrit en doublon le code qui doit s'exécuter si la variable vaut 2... alors qu'une des deux instances de ce code ne sera de toutes façons jamais exécuté...

'fin bref, vous aviez compris le concept...
Commentaire #75343 écrit par Morrock le 23/01/2013 à 18h13 | 👍🏽 👎🏽
J'aurais bien aimé les switch en TI-BASIC, moi...
Commentaire #75348 écrit par ROB le 23/01/2013 à 18h20 | 👍🏽 👎🏽
Mon premier message était ironique, mais avec du recul pas si faux que ca.

On admet que val est une variable globale qui vaut 1. Je passe donc dans la première boucle du case. Juste a ce moment la, une interruption pète, et fait un val++. On ira donc dans la partie if(val == 2)

C'est tiré par les cheveux, hautement improbable, mais pas impossible. Même si ça donne un code crade et peu compréhensible.
Commentaire #75350 écrit par Link le 23/01/2013 à 18h28 | 👍🏽 👎🏽
Le switch-case s'en est très mal chargé ici, du fait de l'absence des instructions break...

A moins qu'il n'ait effectivement besoin de faire des actions si val vaut 0 ou 1 par exemple, mais je n'ai pas l'impression que ce soit le cas.
Commentaire #75351 écrit par Morrock le 23/01/2013 à 18h32 | 👍🏽 👎🏽
Moi qui fait de la programmation embarquée temps réel jamais encore je n'avais vu de telle absurdité.
Et pourtant je suis dans le domaine où ce genre de réflexion pourrait avoir lieu. :')
Commentaire #75357 écrit par xTG le 23/01/2013 à 18h55 | 👍🏽 👎🏽
En lisant ton commentaire, j'ai pensé à un truc. Est-ce-que au départ il n'avait pas fait ça :

switch(val)
{
case 0:
case 1:
...
break;
case 2:
...
break;
}

Mais comme il a oublié le « break; » après le « case 0: », ça ne faisait pas ce qu'il voulait. Il ne comprenait pas pourquoi, quand val valait 0, ça exécutait le « case 1: ». Pour corriger ça, il a ajouté les conditions.

C'est un cheminement ''«'" logique "'»''. (notez les guillemets, je n'approuve pas du tout ce raisonnement)

Edit : la mise en page a complètement sauté. De toutes façons, l'indentation, c'est pour les tapettes...
Commentaire #75359 écrit par Moi le 23/01/2013 à 19h04 | 👍🏽 👎🏽
Parce que c'est relativement absurde. Sur les phases critiques de ton programme, tu va empêcher les interruptions. Le reste du temps, il faudrait qu'elle survienne pile entre deux instructions... A part avoir un processeur qui tourne avec un signal d'horloge à plusieurs centaines de Hertzs, les probabilités que ça arrive sont faibles (mais au bout de X heures de programme en boucle, ça pourrait arriver).

@Grammar Nazi : faut il mettre un s à plusieurs centaines de Hertzs? mon correcteur orthographique dit que non. Pourtant je met bien un s à plusieurs mètres. Un quelconque lien avec le fait que Hertz soit avant tout un nom propre (du nom d'un de vos compatriotes).
Commentaire #75363 écrit par Link le 23/01/2013 à 19h14 | 👍🏽 👎🏽
C'est tellement dégueu que j'ai froncé les sourcils en lisant ce bout de code, et ils sont restés bloqués.
Commentaire #75366 écrit par Hart le 23/01/2013 à 19h42 | 👍🏽 👎🏽
@Link : Dans ce genre de cas, tu recopies la valeur de la variable soumise à interruptions dans une autre qui n'a pas ce souci, et tu travailles sur l'autre. Si une modification de la variable entre-temps entraîne un trop grand décalage entre les hypothèses de travail de tes fonctions et l'état réel du programme et cause des problèmes critiques, y a des trucs à revoir.

Et puis de toute manière, la seule manière d'éviter qu'une interruption n'interrompe la continuité de la valeur de la variable juste après le dernier test que tu fais, c'est d'en faire une infinité, et de ne jamais se servir du résultat. Pas hyper utile, tu en conviendras.

Quant à ta question sémantique : si le symbole est «Hz», l'unité est le hertz. Et c'est un nom commun, au même titre que mètre, litre ou newton. En revanche, je doute que le pluriel adéquat soit «hertzs», «hertzen» passe bien mieux, voire aucune variation (mais ça reste un pluriel). Ton correcteur orthographique n'a pas l'habitude, point. Et le moustachu à la frange, s'il a fait carrière en Allemagne comme le vibrant barbu, était contrairement à lui autrichien.
Commentaire #75377 écrit par Geist le 23/01/2013 à 20h21 | 👍🏽 👎🏽
<ma_vie>
Tiens, j'ai appris à programmer avec le TI-BASIC moi.
</ma_vie>
Commentaire #75388 écrit par Muphins le 23/01/2013 à 20h51 | 👍🏽 👎🏽
Je suis bien d'accord que pour éviter tout ennuis, on va éviter des conneries choses de ce genre.

Le moustachu à la frange était allemand à la fin de sa "carrière".
Commentaire #75391 écrit par Link le 23/01/2013 à 21h03 | 👍🏽 👎🏽
Une règle que je me fixe : si j'omets sciemment un break;, je mets un commentaire pour le dire. Sauf dans le cas ou l'on voit clairement que c'est pour faire un « ou » :
case 0:
 case 1:
 /code/
 break;
 case 2:
 case 3:
 /code/
 break;
 ...


@Clem : STP désactive le markdown dans le code, c'est dur de mettre des commentaires style C sinon…
Et ne pas manger d'espaces aussi (ça n'a pas bon goût de toute façon, les espaces).
Commentaire #75396 écrit par BSK le 23/01/2013 à 21h32 | 👍🏽 👎🏽
C'est tout à fait plausible en effet. D'autant que je me suis planté dans mon précédent commentaire de mon commentaire vu qu'il y a bien le break à la fin du case 1 (je fatigue, ce soir, je fatigue ....)

Sinon, pour ton code, je pense que tu voulais quelque chose de cette forme-là :

switch(val)
 {
   case 0:
   case 1:
     [...]
     break;
   case 2:
     [...]
     break;
 }
Commentaire #75397 écrit par Morrock le 23/01/2013 à 21h32 | 👍🏽 👎🏽
<3615 class="myLife>
Yep, j'ai fait mes premiers pas là-dessus moi aussi ^^
Aaaah, les heures passées au fond de la classe pendant le cours de physique...
</3615>
Commentaire #75399 écrit par Morrock le 23/01/2013 à 21h37 | 👍🏽 👎🏽
Le TI-basic (pas un si mauvais langage que ça somme toute, pour des calculettes) a été mon troisième langage, après le VB et le vrai basique. Maintenant que je suis soigné, j'alterne entre le C et le Python :p

Pour les nostalgiques du langage ayant permis l'invention du concept de « spaghetti-code » :
20 goto 10
 10 print "n00b"
Commentaire #75400 écrit par BSK le 23/01/2013 à 21h39 | 👍🏽 👎🏽
J'ai eu à m'amuser avec les changements de valeurs d'une variable en simultané (qui arrivent, même sur 2,5GHz x 8core) et franchement, un mutex, il y a rien de mieux...
Un cas pratique serait le lancement de plusieurs threads ne devant pas s'exécuter en parallèle (mise à jour de ressources, répertoire courant modifié, etc...) et qui, en attendant leur tour boucle sur while(accessDenied == 1) {
wait(50);
}
Sans mutex, je te garantis que tu aura des surprises et c'est pas ce code qui changera grand chose (car le changement peut s'effectuer dans le if)
Commentaire #75410 écrit par Taiki le 23/01/2013 à 21h51 | 👍🏽 👎🏽
That code gave me cancer.
Commentaire #75415 écrit par mini le 23/01/2013 à 22h00 | 👍🏽 👎🏽
la partie case 0/1 if 2 est clairement un PEBKAC pour moi.

par contre si il y a un gros bloc de code est commun à val=0 et val=1, c'est pas idiot de regrouper les 2 case et ensuite de tester val pour les parties spécifiques.

par exemple pour une gestion d'utilisateurs, le code de pour sauvegarder les données de l'utilisateur sera le même pour la création et la modification sauf que l'un fera un create et l'autre un update. On peut donc regrouper ces 2 actions dans le même case et ensuite faire

if(action == "add")
   sql="create ....."
 else 
   sql="update ...."
 mysql_query(sql)
Commentaire #75430 écrit par achille le 24/01/2013 à 00h55 | 👍🏽 👎🏽
perso, ce qui m'étonne en lisant le bout de code c'est plutôt de ne pas voir en plus un truc du style:

default:
if (val==0) {
...
}
else {
if (val==1) {
...
}
else {
if (val==2) {
...
}
else {
printf("something goes really wrong !!");
}
}
}
break;

du coup, je trouve ça vraiment moche comme code
(suis déjà dehors, et plus loin que la portée d'une pelle à baffe standard)

edit: ah zut, ça garde pas l'indentation par espace dans les commentaires, dommage. Juste pour au cas où pour plus tard, y a un truc du style [code] mettre ici du code indenté [/code] qui fonctionne ?
Commentaire #75438 écrit par globideuh le 24/01/2013 à 01h22 | 👍🏽 👎🏽
Auquel cas on crée une fonction ... c'est plus propre.
Commentaire #75445 écrit par mini le 24/01/2013 à 08h21 | 👍🏽 👎🏽
Regarde juste un peu au dessus ... ;)
Commentaire #75446 écrit par mini le 24/01/2013 à 08h22 | 👍🏽 👎🏽
Si, il faut entourer ton code avec le caractère `
Commentaire #75447 écrit par Morrock le 24/01/2013 à 08h24 | 👍🏽 👎🏽
Mon premier pebkac ^^

En fait, point de programmation parallèle, val n'est modifié nul part... c'est la que repose toute la "beauté" de ce code...
Commentaire #75456 écrit par Garf365 le 24/01/2013 à 09h11 | 👍🏽 👎🏽
J'aimerais bien... mais personne ne sais qui a fait ce bout de code bien sur!
Commentaire #75457 écrit par Garf365 le 24/01/2013 à 09h14 | 👍🏽 👎🏽
sauf que dans ce cas, non, il n'y a pas de partie commune
Commentaire #75458 écrit par Garf365 le 24/01/2013 à 09h15 | 👍🏽 👎🏽
Il y avait bien le break avant le case 2, je confirme l'inutilité de la condition if (val == 2 )
Commentaire #75459 écrit par Garf365 le 24/01/2013 à 09h17 | 👍🏽 👎🏽
Merci pour ces explication ! J'adore ce site, mais j'ai fait mes études dans le génie mécanique, donc ce genre de PEBKAC est un peu abstrait pour moi sans qu'on l'explique un minimum.
Commentaire #75460 écrit par ChainsawAxis le 24/01/2013 à 09h20 | 👍🏽 👎🏽
@Link (la flemme de me loguer en Grammar Nazi)

Les mots finissant par -s, -z ou -x au singulier ne changent pas de forme au pluriel, c'est pourquoi on garde hertz, même au pluriel.

Quant à la majucule :
Les éponymes s'écrivent généralement en minuscules (2 hertz), mais la première lettre du symbole de l'unité formée à partir d'un éponyme prend la majuscule (2Hz)
Commentaire #75462 écrit par Sarah le 24/01/2013 à 09h31 | 👍🏽 👎🏽
Clem, ta crontab ne marche plus!!!
Commentaire #75481 écrit par Link le 24/01/2013 à 12h30 | 👍🏽 👎🏽
Wep, elle est toute cassée :(

(Un jeu de mot pourri? Où ça?)
Commentaire #75491 écrit par ROB le 24/01/2013 à 14h55 | 👍🏽 👎🏽
Spaghetti-code ?
Commentaire #75497 écrit par Geist le 24/01/2013 à 16h04 | 👍🏽 👎🏽
Il n'y a pas un site pebkac version architectes/maçons? Qu'on se marre un peu de vos clients
Commentaire #75504 écrit par Link le 24/01/2013 à 16h44 | 👍🏽 👎🏽
http://fr.wikipedia.org/wiki/Programmation_spaghetti

Applicable aussi aux réseaux : http://fr.wikipedia.org/wiki/Syndrome_du_plat_de_spaghettis
Commentaire #75506 écrit par Link le 24/01/2013 à 17h08 | 👍🏽 👎🏽
On revient aux mois sans pebkac de la V1 ? Et aux salons de thé aussi ?

Comment ça, je suis impatient ? Je ne vous permet pas !

(Alors, il est où le thé...)
Commentaire #75508 écrit par danarmk le 24/01/2013 à 18h02 | 👍🏽 👎🏽
Ça fait à peine une journée

Thé ou infusion? Si quelqu'un a des petits biscuits
Commentaire #75509 écrit par Link le 24/01/2013 à 18h12 | 👍🏽 👎🏽
Thé. Vert, pourquoi pas parfumé. 85°C, 3 minutes. Je vais acheter les biscuits.
Commentaire #75510 écrit par danarmk le 24/01/2013 à 18h39 | 👍🏽 👎🏽
J'ai voté CTLP sans faire exprès (mobile...), faudrait pouvoir changer son vote.
Autre raison : les commentaires constructifs qui peuvent faire changer d'avis.
Commentaire #75513 écrit par X3N le 24/01/2013 à 19h16 | 👍🏽 👎🏽
Je peux amener les bonbons :3
Commentaire #75521 écrit par LeGeekReveur le 24/01/2013 à 21h03 | 👍🏽 👎🏽
Bon, j'ai les biscuits...

Ok, je les ai mangés, mais je les ai. :)

Pour la musique, je propose de la musique à grande vitesse : http://www.youtube.com/watch?v=0jgrCKhxE1s

Pardon, je voulais parler de la Musique à Grande Vitesse : http://www.youtube.com/watch?v=jsjPM_UsSGc
Commentaire #75524 écrit par danarmk le 24/01/2013 à 21h35 | 👍🏽 👎🏽
Le Cron marche toujours bien :)

Si vous prenez le thé, pour moi ça sera Nurofen Rhume + Fervex.
Le tout avec un grand verre de rhum.

(oui, je suis très malade... d'où l'absence de PEBKAC hier... Si je l'avais anticipé, j'aurais ajouté plus de posts dans la file de publication... mais ça m'est tombé dessus d'un coup :-(.... )
Commentaire #75534 écrit par Clem le 25/01/2013 à 07h35 | 👍🏽 👎🏽
@Link : rien à voir avec le processeur. Il suffit d'avoir deux thread et un ordonnanceur qui respecte l'équité.
Si tu préfères c'est la base du multi-tâche les instructions doivent s'entrelacer pour donner l'illusion que tout se fait en même temps.

T'as peut-être mal compris un cours là dessus le temps de l'ordonnanceur (hors real time) n'est pas un seconde mais nombre cycle processeur.
Commentaire #75535 écrit par but2ene le 25/01/2013 à 07h50 | 👍🏽 👎🏽
Yes effectivement, je vais conserver ton commentaire comme référence, pour traiter ce problème.
Commentaire #75536 écrit par Clem le 25/01/2013 à 07h56 | 👍🏽 👎🏽
@Clem: ca arrive toujours quand on s'y attend le moins. Rétablie toi bien!
Commentaire #75538 écrit par but2ene le 25/01/2013 à 08h05 | 👍🏽 👎🏽
Autre option : voter après avoir compris.
Commentaire #75738 écrit par Geist le 25/01/2013 à 23h28 | 👍🏽 👎🏽
@Geist : Sauf que Hertz est vraisemblablement un nom propre qui a été utilisé pour nommer l'unité découverte par le scientifique éponyme. Donc non, pas de variation au pluriel.
Commentaire #98452 écrit par Somadeva le 22/06/2013 à 17h52 | 👍🏽 👎🏽