LorDjidane GT & PSN ID : Lordji | Bonjour à tous.
Je dois réaliser un programme qui simule la gestion de mémoire d'un ordinateur, via liste chaînée.
Avec ce que j'ai fait, j'ai pu créer un processus. Mais dès que j'en crée un, il m'est impossible d'en créer un autre sans avoir de plantage au milieu. De plus, quand je veux afficher ma liste, j'ai un plantage lorsque j'ai créé un processus, sinon ça va (mais bon, sans processus, ça me fait un bloc à afficher, pas trop utile).
Je soupçonne mes pointeurs de se ballader un peu comme ils veulent, malheureusement, j'ai beau refaire le cheminement de mon programme sur une feuille de papier, je ne comprends pas ce qui se passe. De fait, une aide serait la bienvenue svp.
Voici le code (sans toutes les fonctions, uniquement celles utilisées) :
Code :
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- typedef struct {
- int numero, debut, taille;
- char *tache;
- char *utilisateur; } ELEMENT;
- typedef struct chainon {
- ELEMENT val;
- struct chainon *suiv; } CHAINON, *LISTE;
- LISTE creer(void)
- {
- char utilisateur[]="---";
- char tache[]="---";
- LISTE init = malloc(sizeof(init));
- if (init) init->suiv = NULL;
- else printf("Erreur ! Memoire insuffisante !" );
- init->val.debut=0;
- init->val.utilisateur = malloc(strlen(utilisateur));
- init->val.tache = malloc(strlen(tache));
- strcpy(init->val.utilisateur,utilisateur);
- strcpy(init->val.tache,tache);
- return init;
- }
- int listevide(LISTE l){
- if (l->suiv == NULL) return(1);
- else return(0);
- }
- LISTE ajouter(LISTE l, ELEMENT e){
- LISTE p;
- p=l;
- while (((e.taille) > (p->val.taille)) && ((p->val.numero) != 0))
- p=p->suiv;
- if (p == NULL)
- {
- printf("Taille de tache trop grande ou pas de bloc libre disponible.\n" );
- return(l);
- }
-
- else
- {
- if ((e.taille) == (p->val.taille))
- { /* Taille du bloc = taille du processus a ajouter */
- p->val.numero=e.numero;
- p->val.tache=malloc(sizeof(e.tache));
- p->val.utilisateur=malloc(sizeof(e.utilisateur));
- strcpy(p->val.tache,e.tache);
- strcpy(p->val.utilisateur,e.utilisateur);
- return(l);
- }
- else {
- /* Taille du bloc > taille du processus a ajouter */
- /* Creation de bloc supplementaire */
- LISTE g;
- g = malloc(sizeof(CHAINON));
- g->suiv=p->suiv;
- g->val.numero=0;
- g->val.taille=((p->val.taille)-(e.taille));
- g->val.debut=((p->val.debut)+(e.taille));
- p->suiv=g;
- p->val.numero=e.numero;
- p->val.taille=e.taille;
- p->val.tache=malloc(sizeof(e.tache));
- p->val.utilisateur=malloc(sizeof(e.utilisateur));
- strcpy(p->val.tache,e.tache);
- strcpy(p->val.utilisateur,e.utilisateur);
- return(l);
- }
- }
- }
- LISTE rechercheou(LISTE l, ELEMENT e){
- LISTE p;
- p=l;
- /* d'abord les tests numeriques */
- printf("p->val.numero = %d\n",p->val.numero);
- printf("e.numero = %d",e.numero);
- if (listevide(l) == 1) {return(p); printf("\nArret 1bis ok\n" ); }
- else while ((p->val.numero != e.numero) || (p->val.debut != e.debut) || (p->val.taille != e.taille) || (strcmp(p->val.tache,e.tache) != 0) || (strcmp(p->val.utilisateur,e.utilisateur) != 0 ))
- {
- p=p->suiv;
- printf("\nArret 2bis ok\n" );
- }
- printf("\nArret 3bis ok\n" );
- return(p); /* On retourne p, qui indiquera soit l'element trouve, soit NULL si pas de resultat */
- }
- void affiche(LISTE l){
- printf("Bloc Numero : %d\n",l->val.numero);
- printf("Taille : %d\n",l->val.taille);
- printf("Debut : %d\n",l->val.debut);
- printf("Utilisateur : %s\n",l->val.utilisateur);
- printf("Tache : %s\n",l->val.tache);
- printf("------------------\n" );
- }
- void afficheliste(LISTE l){
- LISTE p;
- p=l;
- while (p != NULL){
- affiche(p);
- p=p->suiv;
- }
- }
- /* Après définition de ces fonctions de gestion de listes chainées, on va coder les fonctions de gestion de la mémoire */
- LISTE bloclibre(LISTE mem,int taille){
- LISTE p;
- int ok=0;
- ELEMENT e;
- e.numero=0;
- e.taille=mem->val.taille;
- printf("\nArret 1 ok\n" );
- while (ok != 1){
- p=rechercheou(mem,e);
- printf("\nArret 2 ok\n" );
- if (listevide(p) == 1){
- return(p);
- ok=1;
- }
- printf("\nArret 3 ok\n" );
- if (p->val.taille >= taille){
- p=p->suiv;
- printf("\nArret 4 ok\n" );
- bloclibre(p,taille);
- }
- else {
- ok=1;
- printf("\nArret 5 ok\n" );
- return(p);
- }
- }
- }
- ELEMENT allouebloc(int taille, int numero, int debut, char *u, char *t){
- ELEMENT e;
- e.taille=taille;
- e.numero=numero;
- e.debut=debut;
- e.utilisateur = malloc(strlen(u));
- e.tache = malloc(strlen(t));
- strcpy(e.utilisateur,u);
- strcpy(e.tache,t);
- return(e);
- }
- LISTE nouvelletache(LISTE mem, int taille, int numero, int debut, char *u, char *t){
- ELEMENT e;
- e=allouebloc(taille,numero,debut,u,t);
- ajouter(mem,e);
- }
- int numeroprocess(int k){
- return(k+1);
- }
- int main(void){
- LISTE L,p;
- int k=0;
- int action,taille,num;
- char utilisateur[20];
- char tache[20];
- L=creer();
- L->val.taille=512; /* taille de ma liste */
- printf("Bienvenue dans l'interpreteur de commande\n" );
- printf("Tapez 5 pour l'aide\n" );
- while(fin != 1){
- printf("Que voulez-vous faire?\n" );
- scanf("%d",&action);
- if (action == 1){
- printf("Fonction Ajouter\n" );
- printf("Utilisateur " );
- scanf("%s",utilisateur);
- printf("\nTache: " );
- scanf("%s",tache);
- printf("\nTaille: " );
- scanf("%d",&taille);
- p=bloclibre(L,taille);
- printf("\n Valeurs pour le bloc libre p : debut %d taille %d\n",p->val.debut,p->val.taille);
- printf("\nTache de %s intitulee %s de taille %d\n",utilisateur,tache,taille);
- nouvelletache(L,taille,numeroprocess(k),p->val.debut,utilisateur,tache);
- k++;
- }
- if(action == 3){
- printf("Fonction Affichage\n" );
- afficheliste(L);
- }
- }
- }
- return 0;
- }
|
(les printf("Arret" ); me servent à savoir, avec les tests ci-dessous, à quel niveau mon programme plante)
Quelques tests : Je ne crée rien et affiche directement la liste, aucun problème :
Citation :
Fonction Affichage
Bloc Numero : 0
Taille : 512
Debut : 0
Utilisateur : ---
Tache : ---
------------------
|
Je crée un processus uniquement, aucun problème :
Citation :
Fonction Ajouter
Utilisateur lordji
Tache: gaim
Taille: 50
Arret 1 ok
p->val.numero = 0
e.numero = 0
Arret 2 ok
Valeurs pour le bloc libre p : debut 0 taille 512
Tache de lordji intitulee gaim de taille 50
|
J'en crée un autre tout de suite après, j'ai droit à un freeze à la fin de ce qui s'affiche en dernier, le programme a l'air de boucler un peu, puis ma console (sous win) plante ("ce programme va se terminer (...)" ) :
Citation :
Fonction Ajouter
Utilisateur lordji
Tache: gcc
Taille: 120
Arret 1 ok
p->val.numero = 1
e.numero = 0
Arret 2bis ok
Arret 2bis ok
|
Quand, après avoir créé un seul processus, je demande l'affichage de ma liste, j'ai de même que ci-dessus, un freeze (avec tournage en rond avant) ; ce qui me surprend, c'est qu'il n'affiche pas les deux dernières chaînes de caractère :
Citation :
Fonction Affichage
Bloc Numero : 1
Taille : 50
Debut : 0
Utilisateur : lordji
Tache : gcc
------------------
Bloc Numero : 0
Taille : 462
Debut : 50
|
Voilà, c'est un peu long, désolé, mais c'est pour clarifier au maximum la chose.
D'avance merci.
|