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.
Dans une école d'ingénieur, lors d'un TP de programmation système, l'enseignant prodigue quelques conseils à un élève en difficulté :

- « Une variable "static" en C est accessible dans tous les autres fichiers sources, même si le responsable de la matière a écrit LOCAL juste au-dessus »
- « Il faut inclure "fichier.c" en plus de "fichier.h" »
- « On peut passer un fichier en paramètre pour le récupérer avec argv[0] »

Et le pompon sur la cerise : « int* val = 0 ... dont l'ADRESSE sera utilisée pour initialiser un tableau ».
Je veux bien que ce ne soit pas une spécialité, mais ça reste du C... PEBKAC.
PEBKAC #6499 proposé par Noname le 22/12/2012 | 19 commentaires | 👍🏽 👎🏽 +162
Venant d'un élève, j'aurais dit qu'il n'a pas compris. Venant d'un prof de C, PEBKAC direct.

La coup de la variable static mérite un PEBKAC à lui seul. Quand une personne écrit quelque chose et te soutient le contraire, il n'y a pas d'autre vote possible
Commentaire #70146 écrit par achille le 22/12/2012 à 10h04 | 👍🏽 👎🏽
↑ est largué car ne connait pas le C
Commentaire #70163 écrit par ROB le 22/12/2012 à 13h56 | 👍🏽 👎🏽
Pas grave, le prof non plus.
Commentaire #70164 écrit par Gabriel le 22/12/2012 à 14h00 | 👍🏽 👎🏽
Indice : toutes les affirmations de l'enseignant sont fausses (j'aurais du me connecter en Captain Obvious, moi).

Bon, je vais essayer de détailler un peu, mais je ne suis pas un pro du C (vous vous rappelez du PEBKAC à propos du cours de Pascal ? :p)

-L'enseignant confond variables "statiques" et "globales". Les variables globales sont des variables accessibles par tout le programme (enfin, pas vraiment, mais laissons les détails de cotés). Les variables statiques sont des variables qui gardent leur valeur de l'appel d'une fonction à l'autre. Prenons le code suivant pour exemple.

int var1 = 1;

int foo()
{
static int var2 = 0;
var2 = var2 + var1;
return var2;
}

int bar()
{
int var3 = 0;
var3 = var3 + var1;
return var3;
}

var1 est une variable globale. Je peux l'utiliser dans les fonctions foo et bar. Dans foo, var est statique, l'effet est que, sous hypothèse qu'il n'y a pas de fonctions qui modifient var1, foo renverra le nombre de fois où on a appeler foo. Par contre bar renverra toujours 1. Et je ne peux pas utiliser var2 dans la fonction bar.

-En général, dès que le programme n'est pas tout petit, on ne l'écrit pas dans un unique fichier. Alors, en général, on écrira dans un fichier portant l'extension .h les prototypes de fonctions : le type qu'elles renvoient, leur noms et leur paramètres, mais pas le code de leur implémentation. Dans un fichier qui porte le même nom, mais d'extension .c, on écrit le code des fonctions. Du coup, lorsqu'on veut utiliser les fonctions dans un autre fichier, on inclue le .h pour dire "je vais (peut-être) utiliser les fonctions déclarées dans le .h". L'intérêt et de ne pas avoir à tout recompiler. Si on change le code dans un .c, on n'aura que celui-ci à recompiler. Mais si on inclue le .c comme le demande l'enseignant, ce n'est évidemment plus possible. En plus, le compilateur "risque" de râler en disant qu'il y a plusieurs fonctions qui portent le même nom.

-argv[0] est le nom du fichier exécutable, les paramètres passés en ligne de commande, s'il y en a, sont dans argv[1], argv[2], etc.

-int *val = 0 déclare un pointeur vers un entier. Si on veut créer un tableau, il faudra faire un truc du genre val = malloc(42 * sizeof(int)), ce qui alloue 42 fois la taille d'un entier (42 pouvant être remplacé par une variable, bien entendu), et l'adresse du bloc alloué est stockée dans val. Alors que l'enseignant propose de... En fait je comprend pas ce qu'il propose. J'ai l'impression que ça phrase n'a pas de sens du tout.
Commentaire #70173 écrit par danarmk le 22/12/2012 à 14h23 | 👍🏽 👎🏽
Pour le dernier, c'est le seul que je pense avoir à peu près compris : il voudrait faire un malloc sur le nombre de l'adresse de l'entier et non l'entier lui même... ???!

Bon, j'arrête d'essayer de comprendre les profs qui disent des conneries sur un langage que je ne connais pas, je vais finir par planter >_<
Commentaire #70174 écrit par ROB le 22/12/2012 à 14h34 | 👍🏽 👎🏽
4 en 1 celui là ! :)
Commentaire #70177 écrit par X3N le 22/12/2012 à 15h26 | 👍🏽 👎🏽
Pour le 1er il a juste confondu static et extern, static permet (si utilisé hors d'un bloc) de restreindre l'utilisation de la variable au fichier, contrairement à extern (qui est utilisé par défaut donc pas besoin de l'écrire même si ça rend les choses plus clair).
Commentaire #70186 écrit par RouRou le 22/12/2012 à 18h07 | 👍🏽 👎🏽
@danarmk : l'instruction "int* val = 0" crée bien un pointeur, mais ici le pointeur pointe vers l'adresse n° 0. Ce n'est même pas vraiment un pointeur NULL mais simplement un pointeur dont l'adresse est illégale (car probablement réservée au système).

Ce pointeur devait contenir l'adresse d'un tableau qui contenait des valeurs d'initialisation. Si nous ne voulions pas renseigner ce tableau, alors les valeurs d'initialisation étaient 0 par défaut ... mais pourquoi mettre simplement 0 quand on peut carrément écrire &val ... ce qui est complètement faux.

Ce code ne compilait d'ailleurs pas : j'ai simplement remplacer le &val par 0 pour que ça fonctionne.
Commentaire #70188 écrit par Noname le 22/12/2012 à 18h30 | 👍🏽 👎🏽
Concernant le pointeur, on fait plutôt un truc genre
int *val = NULL;
val = malloc (sizeof(int));
if(val == NULL)
{
erreur();
}

Il y a perpète et en fonction des types de C, les fonctions comme malloc ne renvoyaient pas systématiquement NULL en cas de problème et il fallait initialiser le pointeur avant.

Après assigner une valeur numérique à un entier n'est pas une erreur.
Si tu as un système minimal style OS9 avec un bargraph à leds placé à l'adresse 1000, tu peux faire

char *bargraph = 1000;

Ensuite un *bargraph=0x55; allumera une led sur 2

Sinon il me semble que la syntaxe int *val = malloc(...); est correcte.

Donc hormis l'utilisation de 0 au lieu de NULL ce qui ne change rien normalement, je vois pas trop l'erreur
Commentaire #70189 écrit par achille le 22/12/2012 à 18h34 | 👍🏽 👎🏽
C'facile. C'est ce qui vient juste après le B et avant le D.
Commentaire #70190 écrit par Siggy le 22/12/2012 à 18h44 | 👍🏽 👎🏽
@Noname : Pour le pointeur nul ça dépend de l'implémentation de la bibliothèque standard. Sur ma machine (sous GNU/Linux), stddef.h contient :

    #if defined(__cplusplus)
    #define NULL 0
    #else
    #define NULL ((void *)0)
    #endif

Autrement dit : si c'est du C++, NULL vaut 0, sinon il vaut 0 transtypé vers un pointeur.
Commentaire #70196 écrit par BSK le 22/12/2012 à 20h02 | 👍🏽 👎🏽
J'arrive pas à savoir si tu te moque de lui ou pas...
https://fr.wikipedia.org/wiki/B_%28langage%29 https://fr.wikipedia.org/wiki/D_%28langage%29
Commentaire #70197 écrit par BSK le 22/12/2012 à 20h04 | 👍🏽 👎🏽
« Sinon il me semble que la syntaxe int *val = malloc(...); est correcte. »
Avec gcc ça compile avec « -Wall -Werror -Wextra -pedantic ».
Commentaire #70200 écrit par BSK le 22/12/2012 à 20h13 | 👍🏽 👎🏽
@BSK: oh! Euh...
Commentaire #70201 écrit par Siggy le 22/12/2012 à 20h57 | 👍🏽 👎🏽
« le pompon sur la cerise » : cette phrase m'a tué !
Pour moi c'est LE truc drôle du post (même si je suis développeur).
Commentaire #70209 écrit par juu le 23/12/2012 à 00h13 | 👍🏽 👎🏽
Content que tu apprécies, je voulais absolument traduire le What-The-Fuckisme que j'ai ressenti en lisant cette expression.
Sinon, pour jouer mon Grammar Nazi : "Cette phrase m'a tuer" ... ... pardon je ne la ferai plus :(
Commentaire #70210 écrit par Noname le 23/12/2012 à 01h04 | 👍🏽 👎🏽
J'ai mieux compris avec la remarque de RouRou qu'avec ton gros pâté :D
Il me semblait que static avait un effet global mais je fais peu de C donc bon...
Mr. Toll: De toute façon, le C, c'est pour ceux qui veulent ré-inventer la roue.
Commentaire #70226 écrit par Cartman34 le 23/12/2012 à 12h12 | 👍🏽 👎🏽
@danarmk
Merci pour l'explication.
Commentaire #70244 écrit par 1138 le 23/12/2012 à 20h17 | 👍🏽 👎🏽
Purée mais viré le ce prof. S'est une plaie. J'en ai eu un pareil j'arrêtais pas de faire des facepalms avec les autres élèves et un jour, un élève l'a casser en direct. Et pour terminer et se foutre de sa gueule de con, il a terminer en disant "Autre question ?" s'est comme sa que j'ai pris mon speudo!
Commentaire #70497 écrit par Autre question ? le 26/12/2012 à 11h31 | 👍🏽 👎🏽