[C] Local Computation
|
21-08-2014, 17h18
(Modification du message : 21-08-2014, 17h30 par octarin.)
Message : #1
|
|
octarin
Apprenti sorcier Messages : 68 Sujets : 11 Points: 47 Inscription : May 2013 |
[C] Local Computation
J'ai découvert cette fonctionnalité du C permettant de récupérer le résultat d'un algorithme autrement que par une fonction. Cela sert (selon moi) à clarifier le code.
Voici un exemple avec la suite de fibonacci. Code C :
Edit: Cela semble particulièrement utile dans une macro Code C :
Edit2: Bon, si quelqu'un trouve le moyen de le faire marcher dans une macro...
Faire des mathématiques c’est donner le même nom à des choses différentes. -- Henri Poincaré
|
|
22-08-2014, 09h54
Message : #2
|
|
ark
Psyckomodo! Messages : 1,033 Sujets : 48 Points: 317 Inscription : Sep 2011 |
RE: [C] Local Computation
Tiens, je connaissais pas ce truc, intéressant faut voir si c'est vraiment utile par contre, parce que je trouve pas que ça aide a la lisibilité du code, au contraire!
|
|
22-08-2014, 10h05
Message : #3
|
|
Junky
Snorky Master Messages : 228 Sujets : 35 Points: 204 Inscription : Mar 2013 |
RE: [C] Local Computation
Bonjour,
Moi c'est le 'b = b' que je ne comprends pas trop en faite! :/ Pour la sécurité, sous linux, le principal soucis est l'interface chaise/clavier
|
|
22-08-2014, 10h25
(Modification du message : 22-08-2014, 10h25 par notfound.)
Message : #4
|
|
notfound
#!/usr/bin/env bash Messages : 687 Sujets : 47 Points: 272 Inscription : Sep 2012 |
RE: [C] Local Computation |
|
22-08-2014, 10h40
Message : #5
|
|
Junky
Snorky Master Messages : 228 Sujets : 35 Points: 204 Inscription : Mar 2013 |
RE: [C] Local Computation
Humm je suis pas sur pour le coup Gros!
Si on regarde son code, le nb est _HORS_ du define. Et de plus le nb == le retour du define. Ou alors je suis passé a côté d'un truc. Pour la sécurité, sous linux, le principal soucis est l'interface chaise/clavier
|
|
22-08-2014, 10h48
Message : #6
|
|
ark
Psyckomodo! Messages : 1,033 Sujets : 48 Points: 317 Inscription : Sep 2011 |
RE: [C] Local Computation
Moi je note quand même qu'il a dit que ca avait pas l'air de marcher dans le define. Donc peut être que c'est une faute.
Après, c'est peut être effectivement une particularité de la syntaxe. |
|
22-08-2014, 11h17
Message : #7
|
|
notfound
#!/usr/bin/env bash Messages : 687 Sujets : 47 Points: 272 Inscription : Sep 2012 |
RE: [C] Local Computation
Bon ok. En fait le code est tout pourri.
(J'ai réussi a compiler et exec + avoir le bon résultat, j'finis mon inter et j'poste ça) Edit en cours... |
|
22-08-2014, 11h23
Message : #8
|
|
Junky
Snorky Master Messages : 228 Sujets : 35 Points: 204 Inscription : Mar 2013 |
RE: [C] Local Computation
Fait nous un diff
Pour la sécurité, sous linux, le principal soucis est l'interface chaise/clavier
|
|
22-08-2014, 11h40
(Modification du message : 22-08-2014, 12h20 par notfound.)
Message : #9
|
|
notfound
#!/usr/bin/env bash Messages : 687 Sujets : 47 Points: 272 Inscription : Sep 2012 |
RE: [C] Local Computation
Chose promise, chose dûe. Comme dit plus haut (post que j'aurai pu éditer si ce vieux c*n de Junky n'avait pas brisé le thread :p) le code est fucked up de partout, même fibo ne marchait pas...
Bref, voici un code qui compile et qui fonctionne : Code C :
Exec : Code BASH :
Juste un petit soucis quand je veux afficher fib(<lim>); ça fout 0. J'vous laisse chercher pourquoi. |
|
22-08-2014, 12h04
Message : #10
|
|
ark
Psyckomodo! Messages : 1,033 Sujets : 48 Points: 317 Inscription : Sep 2011 |
RE: [C] Local Computation
(22-08-2014, 11h40)notfound a écrit : Juste un petit soucis quand je veux afficher fib(<lim>); ça fout 0. J'vous laisse chercher pourquoi. Je sais pas si j'ai bien compris, pour moi, tu veux faire : printf("%d\n", fib(lim)); Si c'est ca, ma réponse serait: parce qu'il y a pas de valeur de retour parce que ça n'est pas une fonction, du coup il print le truc qui est dans RAX, ce qui fout potentiellement la merde ouais. Accessoirement, en l'état, ca ne compile pas, j'ai été obligé de virer le ';' a la fin de la macro pour pouvoir compiler de cette manière. Alors du coup, je viens de tester de rajouter ça à la fin de la macro : Code C :
Mais lors de la compilation, gcc affiche un message d'erreur comme quoi il ne doit PAS y avoir de valeur de retour. Ensuite, pour modifier eax un peu indirectement, je me suis dit que je pouvais call une fonction pour faire en sorte qu'elle return la bonne valeur, et comme RAX ne serait pas modifié entre temps, on pourrait le return. Sauf que la aussi, meme message d'erreur a la compilation. Pour le coup, ce code fonctionne : Code C :
En revanche, celui ci ne compiles pas: Code C :
|
|
29-08-2014, 18h27
Message : #11
|
|
eax64
Newbie Messages : 8 Sujets : 0 Points: 13 Inscription : Nov 2012 |
RE: [C] Local Computation
Plop,
dans la macro, en remplacent Code C :
par Code C :
ça marche et c'est moins moche. Ce qui donne: Code C :
|
|
29-08-2014, 19h14
Message : #12
|
|
b0fh
Membre actif Messages : 210 Sujets : 17 Points: 309 Inscription : Jul 2012 |
RE: [C] Local Computation
Je crois qu'on n'a pas les mêmes critères de lisibilité Ce type de gadget peut dysfonctionner de manière subtile et non-intuitive (je me demande combien ici ont vraiment testé ce code...) par exemple:
Code C :
for(lim = 1; lim < 10; ++lim) { ne marchera pas, parce que lim est modifié pendant le contenu de l'appel a fibonacci, un comportement contre-intuitif car impossible avec une fonction classique. En supposant qu'on corrige la macro pour éviter ça, en faisant une copie de l avant exécution, Code : int lim = 1; serait également sémantiquement équivalent à la première boucle si fibonacci était une fonction classique, mais peut donner un truc différent suivant l'implémentation de la macro, si l'argument est évalué plusieurs fois. De manière générale, les macros en C sont dangereuses et contre-intuitives, sauf si on respecte les contraintes suivantes, plutôt contraignantes: - parenthèses autour de l'expression top-level - parenthèses autour de tous les arguments - évaluation de chaque argument une et une seule fois (et donc pas de boucles avec un argument dans le corps, ou de branches if/else avec un nombre d'appels différents aux arguments dans chaque branche) Il y a des limitations supplémentaires: comportement bizarre en cas de shadowing, ou d'aliasing de plusieurs arguments, impossibilité de prendre un pointeur vers la fonction... Les macros sont une relique d'une décennie antérieure. Il n'y en a pas dans les langages modernes. Même C++ s'en était déja largement débarassé au profit d'une alternative type-safe, les templates. Les compilos modernes savent inliner les fonctions courtes. Conclusion: chaque fois que vous utilisez une macro la ou une alternative existe, Dieu tue un chaton ! alors soyez gentils avec les chatons. |
|
« Sujet précédent | Sujet suivant »
|
Utilisateur(s) parcourant ce sujet : 12 visiteur(s)