Tchae

Untitled

Feb 3rd, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.14 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5.  
  6.  
  7. typedef struct Doublet {void * car ; struct Doublet * cdr ;} * list ;       // la structure de base ; list est un pointeur sur un doublet
  8.  
  9. #define car(doublet) ((doublet)->car)        // macro plutôt que fonction, pour pouvoir écrire car(x)
  10. #define cdr(doublet) ((doublet)->cdr)
  11.  
  12. list cons(void *,  list, size_t taille) ;              // prototype de la fonction cons
  13.  
  14.  
  15.  
  16. int main(int argc, char * argv[]){
  17. // *********************
  18.     // Construire en C une liste L à quatre éléments dans le code du programme à l'aide de cons.
  19.     // Testez car(L), car(cdr(L), car(cdr(cdr L)), car(cdr(cdr(cdr L))), en affichant leur résultat.
  20. // *********************
  21.     long d = 1, e=2, f=3, g=4;
  22.     list L = cons(&d, cons(&e, cons(&f, cons(&g, NULL, sizeof(long)), sizeof(long)),sizeof(long)),sizeof(long));
  23.  
  24.     printf("car(L) : %lu\n", *(long*) car(L) );
  25.     printf("car(cdr(L)) : %lu\n", *(long *) car(cdr(L)) );
  26.     printf("car(cdr(cdr (L))) : %lu\n", *(long *) car(cdr(cdr (L))) );
  27.     printf("car(cdr(cdr(cdr (L)))) : %lu\n", *(long *) car(cdr(cdr(cdr (L)))));
  28.  
  29.  
  30. // avec une chaine :
  31.     char * c1="Bonjour", * c2="John_", *c3 = "ça", *c4=" va ?";
  32.     printf("%lu\n", strlen(c1));
  33.     list L2 = cons(c1, cons(c2, cons(c3, cons(c4, NULL, strlen(c4)), strlen(c3)), strlen(c2)), strlen(c1));
  34.     printf("car(cdr(L2)): %s\n", (char*) car( (cdr (L2))));
  35.  
  36.  
  37.  
  38.  
  39. // temp test
  40.         int a = 1, b=2, c=3;
  41.  
  42.         list LL = cons( &a, cons( &b, cons(&c, NULL, sizeof(int)), sizeof(int)), sizeof(int));
  43.  
  44.     printf("car(LL) : %d\n", *(int *) car(cdr(LL)) );
  45.  
  46.  
  47. float af = 1.33, bf=2.254, cf=3.214;
  48.  
  49.         list LF = cons( &af, cons( &bf, cons(&cf, NULL, sizeof(float)), sizeof(float)), sizeof(float));
  50.  
  51.     printf("car(LF) : %f\n", *(float *) car(cdr(LF)) );
  52.  
  53.     return 0 ;
  54. }
  55.  
  56.  
  57. // Définition de la fonction cons ; elle renvoie un pointeur sur un doublet
  58. list cons(void * elt, const list L, size_t taille){
  59.     list Cons = malloc(sizeof(struct Doublet)) ;
  60.     void * dest=malloc(taille);
  61.     memcpy(dest, elt, taille);                                  // allocation mémoire d'un doublet
  62.     car(Cons) = elt ;
  63.     cdr(Cons) = L ;
  64.     return Cons ; }
Advertisement
Add Comment
Please, Sign In to add comment