Forums de discussions
• Entraide » Code source
Discussion originellement initiée par Zolotaya
Sujet copié/collé dans le cadre de la migration du forum phpbb3 vers phpboost.
Hello,
afin de diversifier l'activité sur ce forum, je vous propose un petit jeu : le "que fait ce code"
Tout est dans le titre, on donne code non commenter et les gens doivent expliquer ce qu'il fait. Je vous donnerez la réponse (si personne n'a trouvé) lundi prochain.
Code :
le point h
Code :
le make file :
Code :
Normalement tout y est!! En cas de problème prévenez moi sur le forum
Ça serait marrant que tout le monde présente le travail effectué de cette façon, cela permet de faire travailler et réfléchir tout le monde.
Bon courage à tous,
Zolotaya
exeral:
zolotaya:
faelar:
Sujet copié/collé dans le cadre de la migration du forum phpbb3 vers phpboost.
Hello,
afin de diversifier l'activité sur ce forum, je vous propose un petit jeu : le "que fait ce code"
Tout est dans le titre, on donne code non commenter et les gens doivent expliquer ce qu'il fait. Je vous donnerez la réponse (si personne n'a trouvé) lundi prochain.
Code :
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include "pingpong.h"
int main ( int argc, char *argv[]){
create_ctx(16384, f_pong, NULL);
create_ctx(16384, f_ping, NULL);
yield();
exit(EXIT_SUCCESS);
}
void f_ping(void *args)
{
while(1)
{
printf("A") ;
yield();
printf("B") ;
yield();
printf("C") ;
yield();
}
}
void f_pong(void *args)
{
while(1)
{
printf("1") ;
yield();
printf("2") ;
yield();
printf("3") ;
yield();
}
}
int init_ctx(struct ctx_s *ctx, int stack_size, func_t f, void *args)
{
ctx->stack = malloc(stack_size);
if (!ctx->stack) return 0;
ctx->esp = (void *)((unsigned char*)ctx->stack + stack_size - 4 );
ctx->ebp = (void *)((unsigned char*)ctx->stack + stack_size - 4 );
ctx->f = f;
ctx->args = args;
ctx->etat=INITIAL;
ctx->ctx_magic = CTX_MAGIC;
}
void switch_to_ctx(struct ctx_s *ctx)
{
assert(ctx->ctx_magic==CTX_MAGIC);
assert(ctx->etat!=FINI);
if (current_ctx)
asm("movl %%esp, %0" "\n" "movl %%ebp, %1"
:"=r"(current_ctx->esp),
"=r"(current_ctx->ebp)
);
current_ctx=ctx;
asm("movl %0, %%esp" "\n" "movl %1, %%ebp"
:
:"r"(current_ctx->esp),
"r"(current_ctx->ebp)
);
if (current_ctx->etat == INITIAL)
{
start_current_ctx();
}
}
void start_current_ctx(void)
{
current_ctx->etat=ACTIF;
current_ctx->f(current_ctx->args);
current_ctx->etat=FINI;
free(current_ctx->stack);
exit(EXIT_SUCCESS);
}
int create_ctx(int stack_size, func_t f, void *args)
{
struct ctx_s *new_ctx_s = (struct ctx_s *)malloc(sizeof(struct ctx_s));
if (! new_ctx_s) return 0;
init_ctx(new_ctx_s, stack_size, f, args);
if ( (!current_ctx) && (!first_ctx))
{
new_ctx_s->next = new_ctx_s;
first_ctx = new_ctx_s;
}
else if (current_ctx)
{
new_ctx_s->next = current_ctx->next;
current_ctx->next = new_ctx_s;
}
else
{
new_ctx_s->next = first_ctx->next;
first_ctx->next = new_ctx_s;
}
}
void yield(void)
{
if (current_ctx)
switch_to_ctx(current_ctx->next);
else
switch_to_ctx(first_ctx);
}
le point h
Code :
#ifndef _PINGPONG_H_
#define _PINGPONG_H_
#define EXIT_SUCCESS 0
#define CTX_MAGIC 0xDEADBEEF
enum ctx_state_e {FINI, ACTIF, INITIAL};
typedef void (func_t)(void *);
struct ctx_s {
void *esp;
void *ebp;
void *args;
void *stack;
enum ctx_state_e etat;
func_t *f;
unsigned int ctx_magic;
struct ctx_s *next;
};
struct ctx_s *current_ctx = NULL;
struct ctx_s *first_ctx = NULL;
void f_ping(void *arg);
void f_pong(void *arg);
void switch_to_ctx(struct ctx_s *ctx);
void start_current_ctx(void);
void yield(void);
int init_ctx(struct ctx_s *ctx, int stack_size, func_t f, void *args);
int create_ctx(int stack_size, func_t f, void* args);
#endif
le make file :
Code :
all: pingpong
pingpong: pingpong.o
gcc -o pingpong pingpong.o
pingpong.o: pingpong.c
gcc -c pingpong.c
Normalement tout y est!! En cas de problème prévenez moi sur le forum

Ça serait marrant que tout le monde présente le travail effectué de cette façon, cela permet de faire travailler et réfléchir tout le monde.
Bon courage à tous,
Zolotaya
Réponses des membres du forum phpboost provisoire
exeral:
un pingpong ?
sémarké-dan-le-fichié
keskejégagné ?
sémarké-dan-le-fichié

keskejégagné ?
zolotaya:
Le droit d'expliquer comment on y joue 

faelar:
Quotation:
asm( ... );
Il fait vomir
"que fait ce code"
asm( ... );
Il fait vomir

____________________
Tant qu'on désire on peut se passer d'être heureux ; on s'attend à le devenir : si le bonheur ne vient point, l'espoir se prolonge, et le charme de l'illusion dure autant que la passion qui le cause. [...]
Malheur à qui n'a plus rien à désirer ! Rousseau, La Nouvelle Héloïse (1761)
Tant qu'on désire on peut se passer d'être heureux ; on s'attend à le devenir : si le bonheur ne vient point, l'espoir se prolonge, et le charme de l'illusion dure autant que la passion qui le cause. [...]
Malheur à qui n'a plus rien à désirer ! Rousseau, La Nouvelle Héloïse (1761)
• Entraide » Code source
1 Utilisateur en ligne :: 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne: Aucun membre connecté
Utilisateur en ligne: Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie












