Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#126 Le 09/06/2011, à 20:01

grim7reaper

Re : /* Topic des codeurs couche-tard [5] */

Pylade a écrit :
grim7reaper a écrit :

[…]
Genre le mec veut le prog en interactif, tu lis bien la valeur et paf, t'es interrompu avant l'affectation effective. Bah dans ton handler tu vas considérer que t'es pas en interactif, alors qu'en fait tu l'étais. Après, ça ne te pose peut‑être pas de problème selon le traitement que tu fais, mais ça reste craignos comme type de code…

Ben si je choppe un signal avant d’avoir fait l’affectation, il aura l’action par défaut, vu que je n’aurai pas encore installé mon propre handler.

Oui, dans ton cas c'est OK.
Je voulais juste dire que même tu lis ta variable juste une fois puis c'est read‑only après, bah ça casse la réentrance quand même.

Surtout que c'est moyen moyen quoi : suffit d'inverser 2 lignes n'ont pas de relation directe (positionner un handler et récupérer une valeur globale), ou du moins qui n'ont pas de raison d'en avoir, et paf le programme devient foireux hmm


Pylade a écrit :

Mouais, enfin je me vois mal faire cohabiter plusieurs contexte pour le moment. Mais je sais, on ne peut pas prévoir comment va évoluer un code et devrait toujours s’arranger pour être le plus maintenable possible.

Oui je sais que y a peu de chance que ça arrive dans le CLFB, mais comme d'hab (et comme tu le dis) on sait jamais comment le code va évoluer donc si on peut éviter de s'imposer des limites bah autant l'éviter.

Pylade a écrit :
grim7reaper a écrit :
Pylade a écrit :

Et quand on y pense, ça ne change rien à la réentrence, puis que de toutes façons la fonction ira chercher ses informations par le pointeur vers la structure de contexte…

Au contraire, ça change tout.
La fonction sera réentrante si elle utilise un pointeur sur la structure plutôt qu'une globale (dans le handler t'auras pas accès au pointeur de la structure que tu utilises dans le programme, donc tu risques pas de la lire/modifier).

int plop(int* p)
{
  return *p;
}

int main(void)
{
  int i;
  int* p = &i;
  i = 42;
  printf("%d\n", plop(p));
  i = 1337;
  printf("%d\n", plop(p));
  return 0;
}

Soit je n’ai pas compris ce qu’était une fonction réentrante, soit plop n’est pas réentrante… et pourtant elle utilise un pointeur passé en argument…

Hum, en fait le concept de réentrance n'intervient pas dans ton exemple (tu vires l'essence même du problème : l'exécution asynchrone) donc il ne démontre rien.
Au passage, si tu avais raison ça voudrais dire que seule les fonctions qui prennent leurs arguments par valeur seraient réentrante. Fichtrement restrictif… :-/

Voilà un court exemple (stupide, comme beaucoup d'exemple) :
Version globale :

/* include kivonbien */

int i;

void my_handler(int sig)
{
    /* … */
   plop();
   /* … */
}

void plop(void)
{
   ++i;
}

int main(void)
{
  /* mise en place du handler. */
  plop();
  printf("%d\n", i);
  plop();
  printf("%d\n", i);
  return 0;
}

Ce code n'est pas déterministe (car pas réentrant), tu ne sais pas ce qu'il va t'afficher (ça dépend du nombre de fois où tu es interrompu).

Version avec pointeur

/* include kivonbien */

void my_handler(int sig)
{
    /* Bah là tu peux bien faire appel à plop, tu ne vas pas bousiller le reste
     * car tu n'as pas acces au i du main (ou de tout autre fonction qui utilise plop),
    * tu peux même interrompre plop et aller dans le handler, la première « instance » de
    * de plop ne sera pas perturbé pas ton appel de plop() dans le handler, contrairement à
    * la version avec globale. */
}

void plop(int* i)
{
   ++(*i);
}

int main(void)
{
  int i = 0;
  /* mise en place du handler. */
  plop(&i);
  printf("%d\n", i);
  plop(&i);
  printf("%d\n", i);
  return 0;
}

Cette fois c'est réentrant smile. Le code affichera toujours 1 puis 2 quoiqu'il arrive.

Dernière modification par grim7reaper (Le 09/06/2011, à 21:16)

Hors ligne

#127 Le 09/06/2011, à 21:12

Sir Na Kraïou

Re : /* Topic des codeurs couche-tard [5] */

Plæp.


Descendant de Charlemagne.
Bleu, en l'hommage d'un truc bleu. :'(
C'est pas du bleu.
C'est pas le lac de Genève, c'est le Lac Léman.

Hors ligne

#128 Le 09/06/2011, à 21:22

Pylades

Re : /* Topic des codeurs couche-tard [5] */

Ouais mais il y a un truc que je ne comprends pas : dans la version avec pointeur, comment tu peux appeler plop, puisque par définition tu ne peux passer que le numéro du signal au handler (donc tu ne peux pas passer de pointeur à plop) ?


Sinon, la réentrance, ce n’est pas la propriété d’une fonction qui, appelée avec les mêmes arguments, produira toujours le même résultat ?


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#129 Le 09/06/2011, à 21:48

grim7reaper

Re : /* Topic des codeurs couche-tard [5] */

Pylade a écrit :

Ouais mais il y a un truc que je ne comprends pas : dans la version avec pointeur, comment tu peux appeler plop, puisque par définition tu ne peux passer que le numéro du signal au handler (donc tu ne peux pas passer de pointeur à plop) ?

Bah tu peux l'appeler, mais pas avec un pointeur utilisé ailleurs (sauf s'il est global, mais là on en revient à global = pas réentrant‑friendly).

Pylade a écrit :

Sinon, la réentrance, ce n’est pas la propriété d’une fonction qui, appelée avec les mêmes arguments, produira toujours le même résultat ?

Non, ça c'est la transparence référentielle.
Mais je ne sais pas si une fonction réentrante est obligatoirement reférentiellement transparente.

Édit : bah non, c'est bien ce que je pensais. Contre‑exemple : time() est réentrante mais pas reférentiellement transparente.

Dernière modification par grim7reaper (Le 09/06/2011, à 22:41)

Hors ligne

#131 Le 09/06/2011, à 22:24

The Uploader

Re : /* Topic des codeurs couche-tard [5] */

#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_framerate.h>
/*
 * 
 */
int main(void) {
    /* INIT SDL*/
    SDL_Surface*  ecran;
    SDL_Surface* sprites;
    SDL_Surface* decor;
    SDL_Event event;
    Uint8 *touches;
    if(SDL_Init(SDL_INIT_VIDEO) == -1){
        printf("Unable to init SDL: %s", SDL_GetError());
    }
    FPSmanager FPSmanager;
    SDL_initFramerate(&FPSmanager);
    SDL_setFramerate(&FPSmanager,15);
    ecran = SDL_SetVideoMode(800, 600, 24, SDL_HWSURFACE|SDL_DOUBLEBUF); /* INIT FENETRE SDL */
    /* INIT SPRITES */
    if((sprites = SDL_LoadBMP("sprites.bmp"))!=NULL){
        SDL_SetColorKey(sprites, SDL_SRCCOLORKEY,sprites->format->Bmask|sprites->format->Rmask);}
    else{
        return -1;}
    SDL_MapRGB(sprites->format, 186, 254, 202); /* couleur transparence */
    // L'arrière-plan (vue de dessus).
    if((decor = SDL_LoadBMP("decor.bmp"))==NULL){
        return -1;}
    /* FIN INIT SPRITES */

    touches = SDL_GetKeyState(NULL); /* INIT CLAVIER */

    SDL_Rect rcDeco; /*BOUT DU NIVEAU SOUS PACMAN*/

    SDL_Rect rcPacman={12, 176, 25, 25}; /*SPRITE DE PACMAN*/
    
    /*Boucle de jeu*/
    Sint16 quit = 0;
    while(!quit){
        /*Sous-boucle pour savoir si on quitte ou pas*/
        while(SDL_PollEvent(&event)){
                quit = (event.type == SDL_QUIT);
        }                      
        /*on joue!*/
        if(!quit){
            rcDeco.w = decor->w;
            rcDeco.h = decor->h;
            SDL_BlitSurface(decor, &rcDeco, ecran, NULL);
            SDL_BlitSurface(sprites, &rcPacman, ecran, &rcDeco);
            SDL_Flip(ecran);
        }
    }
    return (EXIT_SUCCESS);
}

"Run failed", hum... Ma boucle de jeu est pourrie.

Bah de toute façon j'ai fait ça vite fait, et j'ai même pas encore les graphismes vraiment faits.. tongue
(oui je suis revenu au  C.. le D ce sera pour un projet plus gros)

Dernière modification par The Uploader (Le 09/06/2011, à 22:32)


- Oldies PC : Intel Pentium 3 @ 800 Mhz sur CM ASUS P2B-F, GeForce 4 Ti4800 SE, Disque Dur Hitachi 160 Go, 512 Mo de RAM, 3DFX Voodoo 2, Sound Blaster 16 ISA PnP, Windows 98 SE / XP)
- Desktop : Intel Core i7 6700K @ 4 GHz sur CM ASUS Z170-P, GeForce GTX 1070, SSD Samsung 850 EVO 1 To, 16 Go de RAM, Disque Dur Seagate Barracuda 3 To, Windows 10

Hors ligne

#132 Le 09/06/2011, à 22:26

Elzen

Re : /* Topic des codeurs couche-tard [5] */

Et pour les néophytes comme moi, vous pourriez expliquer en quelques mots ce qu'est censé signifier « réentrance » ?

:!pakman a écrit :

Ça y est, le problème est résolu avec une liste, merci !
Validé XHTML !

Ç'largement mieux, hein ? ^^

Hors ligne

#133 Le 09/06/2011, à 22:38

grim7reaper

Re : /* Topic des codeurs couche-tard [5] */

tshirtman a écrit :

et random() ? tongue

random n'est pas réentrant (elle utilise un état global), mais random_r l'est.
J'ai pas testé si elle était référentiellement transparente, mais si c'est comme rand_r elle l'est (tant que tu lui donnes la même graine, rand_r renvoie le même nombre donc elle est bien référentiellement transparente)



The Uploader a écrit :

(oui je suis revenu au  C.. le D ce sera pour un projet plus gros)

\o/
Perso, le D n'apporte pas suffisament d'originalité/nouveautés par rapport à d'autres langages pour que je m'y intéresse (du moins à première vue…).



@ArkSeth : grosso modo, une fonction est réentrante si elle peut‑être interrompu avant la fin de son exécution et réappelé de manière sûre. On retrouve ce cas de figure dans 3 situations :
- récursivité
- ISR ou handler
- multithreading (bien qu'être thread‑safe ne signifie pas nécessairement être réentrant).



Bon bah BN World!

Dernière modification par grim7reaper (Le 09/06/2011, à 22:45)

Hors ligne

#134 Le 09/06/2011, à 23:17

tshirtman

Re : /* Topic des codeurs couche-tard [5] */

ok, bonne nuit smile

ajouté la gestion de trainées au animations dans usf tongue et le PPA devrait mieux marcher aussi, tout en étant un peu moin illégal (fix de la plupart des licences dans le pacquet deb ^^)

Hors ligne

#135 Le 09/06/2011, à 23:39

samυncle

Re : /* Topic des codeurs couche-tard [5] */

.


Hello world

Hors ligne

#136 Le 10/06/2011, à 00:18

nesthib

Re : /* Topic des codeurs couche-tard [5] */

plop

Dernière modification par nesthib (Le 10/06/2011, à 02:47)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#137 Le 10/06/2011, à 01:33

Pylades

Re : /* Topic des codeurs couche-tard [5] */

Tiens, j’ai propré le code de la fonction aux huit return que j’ai posté l’autre jour.
Maintenant elle n’en a plus que six. tongue


Bon, je ne suis pas du tout sûr que ça gagne en perfs, mais c’est plus lisible. Et puis si le compilo est un peu malin, il ne va pas perdre en perfs.


Et plouf.

Dernière modification par Pylade (Le 10/06/2011, à 02:07)


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#138 Le 10/06/2011, à 02:00

Кຼزດ

Re : /* Topic des codeurs couche-tard [5] */

plop


dou

Hors ligne

#139 Le 10/06/2011, à 02:16

cm-t

Re : /* Topic des codeurs couche-tard [5] */

'Nuit;


Actu Ubuntu            ☺/
Pauses Ubuntu sur Paris            \_< -t
[(π)] La Quadrature du net

Hors ligne

#140 Le 10/06/2011, à 06:42

Compteur du TdCCT

Re : /* Topic des codeurs couche-tard [5] */

Scores totaux, depuis le début :

1) 3457    nesthib
2) 3084    samuncle
3) 2933    Pylade
4) 2204    Кຼزດ
5) 1709+5  grim7reaper /* ./viewtopic.php?pid=3486252#p3486252 */
6) 1683    cm-t
7) 1303    na kraïou
8) 866    helly
9) 862    \\Ouranos//
10) 659    gnuuat
11) 601    tshirtman
12) 565    Lagierl
13) 429    Rolinh
14) 368    nathéo
15) 361    The Uploader
16) 263    Kanor
17) 196    Askelon
18) 189    :!pakman
19) 121    ǤƦƯƝƬ
20) 99    kamui57
21) 93    petifrancais
22) 78    edge_one
22) 78    pierguiard
24) 70    gulp
25) 42    sakul
26) 39    Le Rouge
27) 37    ilagas
28) 34    xapantu
29) 30    keny
30) 26    gustare
30) 26    d10g3n
32) 25    GentooUser
32) 25    Morgiver
34) 24    ไ୦บเઢ'
34) 24    Steap
36) 20    CROWD
37) 18    Ph3nix_
38) 16    kouskous
39) 15    timsy
40) 12    stratoboy
40) 12    sailing
42) 11    alexises
42) 11    Crocoii
44) 10    Toineo
44) 10    NutMotion
44) 10    pseudovingtcinqcaracteres
44) 10    pfriedZ
44) 10    CasseTaTele
44) 10    Zeibux
44) 10    THS`
51) 8    Mornagest
52) 7    Vista
53) 6    ubuntlin
53) 6    asma.geek
55) 5    tendances-tdct
55) 5    kinouchou
57) 4    danychou56
57) 4    Neros
57) 4    Biaise
57) 4    totoflute
57) 4    pinballyoda ㋛
57) 4    NLS le pingouin
57) 4    ceric
57) 4    Dice-Man
65) 3    Revan26914
65) 3    raspouillas
65) 3    sweetly
68) 2    SoJaS
69) 1    geenux
69) 1    ArzhurBZH

RépartitionPosts/heure


Codez-vous trop tard le soir ?
Demandez au Compteur du TdCCT pour le savoir !

J’ai été généreusement codé par tshirtman ; d’ailleurs, voici mon code source. TdCCT CEP : ./viewtopic.php?pid=3493579#p3493579 (p3492608).

Hors ligne

#141 Le 10/06/2011, à 06:42

Compteur du TdCCT

Re : /* Topic des codeurs couche-tard [5] */

Scores de la période en cours :

1) 90    Pylade
2) 53    nesthib
3) 52    Кຼزດ
4) 46    cm-t
5) 41    samuncle
6) 28    tshirtman
7) 24    na kraïou
8) 23    :!pakman
9) 20    nathéo
10) 16    grim7reaper
11) 13    The Uploader
12) 10    Rolinh
13) 4    \\Ouranos//
13) 4    kamui57
15) 1    xapantu

Codez-vous trop tard le soir ?
Demandez au Compteur du TdCCT pour le savoir !

J’ai été généreusement codé par tshirtman ; d’ailleurs, voici mon code source. TdCCT CEP : ./viewtopic.php?pid=3493579#p3493579 (p3492608).

Hors ligne

#142 Le 10/06/2011, à 09:24

tshirtman

Re : /* Topic des codeurs couche-tard [5] */

Pylade a écrit :

Tiens, j’ai propré le code de la fonction aux huit return que j’ai posté l’autre jour.
Maintenant elle n’en a plus que six. tongue


Bon, je ne suis pas du tout sûr que ça gagne en perfs, mais c’est plus lisible. Et puis si le compilo est un peu malin, il ne va pas perdre en perfs.


Et plouf.

bah, compare la sortis ASM tongue

Hors ligne

#143 Le 10/06/2011, à 17:21

Pylades

Re : /* Topic des codeurs couche-tard [5] */

Bon, j’ai regardé, Clang semble effectuer toutes les optimisations avant l’assemblage (d’ailleurs, pour l’assemble il se contente d’appeler as, non ?) ; GCC doit probablement faire pareil.

Donc ouais, je vais regarder.


Au fait, ce n’était pas plus que six return, mais plus que cinq en fait. big_smile


Résultat : ouais, ben c’est la même à la virgule près. GCC est un bon optimiseur.

Dernière modification par Pylade (Le 10/06/2011, à 17:24)


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#144 Le 10/06/2011, à 17:27

Rolinh

Re : /* Topic des codeurs couche-tard [5] */

:!pakman a écrit :

Si vous voulez voir l'évolution du truc :
www.tunix.fr

(Ahlala, la pub gratuite tongue)

Tu te fais un site perso?

Arf, vivement que j'ai finis mes examens pour que je puisse me mettre sur mon projet de site en rails. J'ai foule de choses à faire cet été!

Hors ligne

#145 Le 10/06/2011, à 17:50

Pylades

Re : /* Topic des codeurs couche-tard [5] */

Quel con, j’ai oublié que le code assembleur n’est pas affiché sur la sortie standard par défaut. Bon, en fait ouais, il y a des différences. Et comme je ne lis pas l’assembleur, bah ça ne m’évoque rien. L’ancienne version est légèrement plus longue, c’est tout ce que je vois…


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#146 Le 10/06/2011, à 18:23

grim7reaper

Re : /* Topic des codeurs couche-tard [5] */

Hello World!

Je viens vers vous en ces temps troublé pour vous faire partager 2 récentes découvertes (2 sites en fait) :
- Dr Dobb's Journal
- The C++ Source : on y retrouve des articles rédigés par Bjarne Stroustrup, Andrew Koenig (koenig lookup (aussi connu sous le nom d'ADL) ça vous parle ?), Herb Sutter, Scott Meyers et Andrei Alexandrescu (auteur de Loki), Jim Coplien (son nom ne vous est peut‑être pas inconnu non plus :]), etc.

Ce sont des sites qui traitent de techniques et de sujet assez avancé et le niveau y est très bon, pour ne pas dire excellent (en même temps, vu les pointures…). Du moins pour les articles sur le C++ que j'ai lu, mais je suppose que le reste est du même acabit.

Dernière modification par grim7reaper (Le 10/06/2011, à 18:23)

Hors ligne

#147 Le 10/06/2011, à 23:13

nathéo

Re : /* Topic des codeurs couche-tard [5] */

;


C'est rarement par le sarcasme qu'on élève son âme.
Le jus de la vigne clarifie l'esprit et l'entendement.
De quoi souffres-tu ? De l'irréel intact dans le réel dévasté ?
La liberté n'est qu'un vain fantôme, quand une classe d'hommes peut affamer l'autre impunément. timezone[America/Bogota]

Hors ligne

#148 Le 11/06/2011, à 00:00

Sir Na Kraïou

Re : /* Topic des codeurs couche-tard [5] */

æ


Descendant de Charlemagne.
Bleu, en l'hommage d'un truc bleu. :'(
C'est pas du bleu.
C'est pas le lac de Genève, c'est le Lac Léman.

Hors ligne

#149 Le 11/06/2011, à 00:13

cm-t

Re : /* Topic des codeurs couche-tard [5] */

'Nuit;


Actu Ubuntu            ☺/
Pauses Ubuntu sur Paris            \_< -t
[(π)] La Quadrature du net

Hors ligne

#150 Le 11/06/2011, à 01:13

Кຼزດ

Re : /* Topic des codeurs couche-tard [5] */

hopida


dou

Hors ligne