# CRO - TD 4 ###### tags: `CRO` `S2` ## Q1 Si je déclare un tableau d’entier : int Tab[5], Pourquoi est ce que ce n’est pas une Lvalue, ils est pourtant stocké en mémoire ? Un tableau n'est pas une Lvalue car il n'a pas qu'une seule adresse en mémoire ## Q2 ```cmake CFLAGS = -g -Wall -DDEBUG LDLAGS = -g -Wall -DDEBUG SOURCE = pointeur1.c pointeur2.c pointeur3.c pointeur1-bis.c OBJECT = $(SOURCE:.c=.o) TARGET = $(SOURCE:.c=) .INTERMEDIATE: $(OBJECT) #pegagogic plugin: if not there, make will use its #own implicit rules to compile the .c files #instead of mine all: $(TARGET) %: %.o gcc $< -o $@ %.o: %.c gcc $(TEST) -c $< -o $@ tar: cd ..; tar cvf TD4-code.tar code/pointeur*.c code/Makefile code/produitScalaireSol.c clean: \rm -rf *.o $(TARGET) *~ ``` $@ = nom de la cible de la regle $< = nom de la dernière dépendance Les regles avec des % sont des règles implicites. Elles sont éxécutées quand il n'y a pas de règles définies pour une source en particulier. ## Q3 $ ./pointeur1 output : *p = 3 p = 0x7FFF3C8F9F24 La valeur de p est l'adresse de i ## Q4 pointeur2.c ```c #include <stdio.h> int main() { int i = 3, j = 6; int *p1, *p2; p1 = &i; p2 = &j; *p1 = *p2; printf("i %d \n", i); printf("j %d \n", j); printf("p1 = 0x%lX \n",(long unsigned int)p1); printf("p2 = 0x%lX \n",(long unsigned int)p2); printf("*p1 %d \n", *p1); printf("*p2 %d \n", *p2); } ``` output : i 6 j 6 p1 = 0x7FFD0C93859C p2 = 0x7FFD0C938598 *p1 6 *p2 6 pointeur3.c ```c #include <stdio.h> int main() { int i = 3, j = 6; int *p1, *p2; p1 = &i; p2 = &j; p1 = p2; printf("i %d \n", i); printf("j %d \n", j); printf("p1 = 0x%lX \n",(long unsigned int)p1); printf("p2 = 0x%lX \n",(long unsigned int)p2); printf("*p1 %d \n", *p1); printf("*p2 %d \n", *p2); } ``` output i 3 j 6 p1 = 0x7FFFDB21A7C8 p2 = 0x7FFFDB21A7C8 *p1 6 *p2 6 ## Q5 Les valeurs des adresses changent à chaque execution du programme. Elles ne sont pas les memes à chaque fois, il étais plus interessant à la question précédente de voir l'effet des pointeurs p1 et p2 et non pas juste les adresses en elle-meme. ## Q6 ```c printf("p1 - p2 = %lX \n",(long unsigned int)(p1 - p2)); ``` NB : si on fait p2 - p1 il y a un overflow parce que c'est un unsigned int donc on trouve FFFFFFFFFFF. Sinon l'output p1 - p2 = 1. C'est normal car c'est uniquement l'adresse initiale en mémoire qui est déterminée au lancement du programme. Il s'execute ensuite dans une zone mémoire déterminée mais toujours de la meme facon. ## Q7 ```c int produit_scalaire(int A[N], int B[N]) { int i, res, *pa, *pb; pa = &A[0]; pb = &B[0]; res=0; for (i=0;i<N;i++) { *pa++; *pb++; res += *pa * *pb; // on peut aussi le faire de cette facon (plus propre) // res += *(pa+i) * *(pb+i); } return res; } ``` ## Q 8 ```c #include <stdio.h> #include <stdlib.h> #define N 5 int produit_scalaire(int *pa, int *pb) { int i, res; res=0; for (i=0;i<N;i++) { res += *(pa+i) * *(pb+i); } return res; } int main() { int *pa, *pb, i; pa=(int *)malloc(5*sizeof(int)); pb=(int *)malloc(5*sizeof(int)); if (pa==0) { fprintf(stderr,"Erreur d'allocation\n"); exit(-1); } for (i=0;i<5;i++) *(pa+i)=1; if (pb==0) { fprintf(stderr,"Erreur d'allocation\n"); exit(-1); } for (i=0;i<5;i++) *(pb+i)=1; // int A[N]={1,1,1,1,1}; // int B[N]={1,1,1,1,1}; printf("le produit scalaire vaut %d\n", produit_scalaire(pa, pb)); free(pb); free(pa); return 0; } ``` ## Q 9 Définition d'une structure de liste chainée ```c struct model_elem{ int val; struct model_elem *suivant; }; //typedef permet de definir la structure model_elem //comme un nouveau type ELEMLIST typedef struct model_elem ELEMLIST; ``` ## Q 10 Programme du pack parrain list.c ```c #include <stdio.h> #include <stdlib.h> #include "list.h" ELEMLIST *new_list(int val) { ELEMLIST *special_list = (ELEMLIST *)malloc(sizeof(ELEMLIST)); (*special_list).val = val; return special_list; } ``` list.h ```c #ifndef LIST_H #define LIST_H struct model_elem { int val; struct model_elem *suivant; }; typedef struct model_elem ELEMLIST; ELEMLIST *new_list(int val); #endif ``` main.c ```c #include <stdio.h> #include <stdlib.h> #include "list.h" int main() { int val = 5; ELEMLIST *ptr = new_list(val); printf("%d\n", (*ptr).val); return(0); } ``` Makefile ```cmake CFLAGS = -g -Wall -DDEBUG LDLAGS = -g -Wall -DDEBUG all: main main: main.o list.o gcc ${LDFLAGS} main.o list.o -o main main.o: main.c list.h gcc ${CFLAGS} -c main.c -o main.o clean: \rm -rf *.o main *~ ``` (c) Tim Sampoc