IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Algorithme de défragmentation (FAT16)


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 2
    Points
    2
    Par défaut [Problèmes divers] Structures, fichier en-tete (post #13)
    Bonjour à tous,

    Voila le probleme: j'ai un projet à réaliser en C portant sur la simulation d'un système de fichier (en l'occurence FAT16).

    Les fonctions que je dois réaliser sont les suivantes:
    - création de la FAT (nb et taille des clusters);
    - création du root directory (en simplifié);
    - ajout/suppression de fichiers;
    - défragmentation de la FAT;
    - bien sur une interface graphique pour tout sa et une visualisation du disque (style défragmenteur win XP). Je ne sais pas encore si il faudra visualiser en temps réel le processus de défragmentation.

    Nous sommes un groupe à bosser dessus et je m'occupe de la partie défragmentation; mon problème porte donc sur l'algorithme de défragmentation: je ne sais pas trop comment m'y prendre, par ou commencer (dans la fat je veux dire), quels segments déplacer en premier...

    Si vous avez des idées ou une idée de l'endroit ou je pourrais trouver des idées je vous serais bien reconnaissant!

    Merci, j'apporterais bien entendu toutes les précisions que vous souhaiterez si besoin est

    Edit: je ne sais pas si c'est le bon endroit pour poster sa, puisque mon probleme est quelque peu inhérent au code utilisé; déplacez le post si vous pensez que c'est nécessaire

  2. #2
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    Si je me souviens bien, de la FAT est lue cluster par cluster, je pense qu'il suffit donc de repositionner des fichiers de sorte à ce chacun d'entre eux utilise le moins de clusters possible (dans un espace contigu).
    Beaucoup de doc sur le net et dans la Bible de Programmation Système.

    Bon courage !!
    Wer nicht probiert, verliert !!

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse, mais c'est justement ces infos là qui m'intéressent: la doc sur le net! a quoi penses tu?
    et qu'est ce que c'est la bible de programmation système dont tu parles?

    Je précise, ce n'est pas de la doc sur le système Fat dont j'ai besoin (sa c'est bon j'en ai assez) mais bien sur la manière de défragmenter.
    Par exemple, est-ce qu'on commence par analyser le début de la fat ou la fin; est-ce qu'on déplace chaque élément trouvé ou est-ce qu'on les recense puis on détermine un ordre de mouvements afin qu'ils soient le moins nombreux possibles (les mvts),...

    Mecri à tous ceux qui m'aideront (et déjà à toi je®ome)

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Sans vouloir te décourager, ce qui fait la valeur et l'efficacité d'un logiciel de défragmentation c'est justement son algorithme.
    Je doute qu'on te communique facilement quelque chose de réellement performant

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Mais je ne veux pas quelque chose d'optimal, c'est simplement pour faire une simulation, dans le cadre des cours.
    Mais effectivement j'ai du mal à trouver des infos, et surement parce qu'il y a un business autour de cela...

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    La théorie est simple : assembler les morceaux des fichiers fractionnés (répartis sur plusieurs clusters) de manière à minimiser les temps d'accès.
    Il faut donc, fichier par fichier, déplacer les morceaux du fichier en cours de traitement sur un espace contigu suffisant.

    Reste l'essentiel : optimiser à la fois la défragmentation et l'utilisation du disque ensuite.
    Est-il préférable de déplacer d'abord les petits fichiers ? Les gros ? Ceux du début du disque ? De la fin ? (sans oublier que la représentation visuelle n'a qu'un rapport approximatif avec l'emplacement réel)
    Comment faut-il placer les fichiers sur le disque ?
    etc.

    Bon courage

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Merci pour le "bon courage"

    Sinon c'est exactement les infos que j'aurais aimé trouvé en fait. Mais bon si tu me dis que je trouverais pas je crois que j'ai plus qu'à mettre les mains dans le cambouis!

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Bon bah je me suis lancé et j'ai une erreur toute bete d'apparence mais dont je trouve pas la cause; voila le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define NbClus 1200
    #define TailleClus 32000
    #define NbMaxFichier 512
     
    void main(){
    	struct fichier{
    		char nom[8];
    		char ext[3];
    		int pos;
         };
     
    	struct Fat{
    		int NbCluster;
    		int TailleCluster;
    		int tab[NbClus];
    	};
     
    	//Déclaration du Root directory
    	struct fichier ROOT[NbMaxFichier];
    	//Déclaration de la Fat
    	struct Fat fat1;
    	fat1.NbCluster = NbClus;
    	fat1.TailleCluster = TailleClus;
    	//Remplissage des valeurs réservées de la Fat
    	fat1.tab[0]=1;
    	fat1.tab[1]=1;
    	int k;
    	if(fat1.NbCluster>65519){
    		for(k=65520;k<fat1.NbCluster;k++) fat1.tab[k]=1;
    	}
    }
    et l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Compiling...
    main.c
    E:\_--Etudes\Cours3a\Matières\Info\Projet_C\main.c(32) : error C2143: syntax error : missing ';' before 'type'
    E:\_--Etudes\Cours3a\Matières\Info\Projet_C\main.c(34) : error C2065: 'k' : undeclared identifier
    La ligne 32 est la ligne avec "int k;"

    Merci de vos réponses!

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Les standards C précédant C99 n'autorisent pas à déclarer une variable en milieu de bloc: Toutes les déclarations doivent être regroupées au début du bloc...

    PS: main() retourne un int. Toujours.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Merci ça marche! Pour le main j'ai douté...maintenant je doute plus!

    J'ai remplacé le nom du tableau ROOT par tabFich parce que ça doit être réservé.
    Mais maintenant j'ai un warning sur cette fonction:
    " warning C4101: 'tabFich' : unreferenced local variable" sur la ligne ou je le déclare.

    Une idée?

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est normal, puisque tu ne l'utilises pas.

    Si le code posté n'est qu'un début, tu l'utiliseras sans doute quand tu auras ajouté le code qui manque...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Ah ok. Merci alors!

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Bon alors maintenant j'ai un autre soucis: quand je déclare les prototypes de mes fonctions dans le header de mon programme, j'ai des erreurs que je n'arrive pas à résoudre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    //Fichier defrag.h
    #include <stdio.h>
    #include <stdlib.h>
     
    #define NbClus 1200
    #define TailleClus 32000
    #define NbMaxFichier 512
     
    struct fichier{
    		char nom[9];
    		char ext[4];
    		int pos;
         };
     
    struct Fat{
    		int NbCluster;
    		int TailleCluster;
    		int tab[NbClus];
    	};
     
    int defrag(struct Fat fat1 *,struct fichier tabFich[]);
    int ClustUtil(struct Fat fat1);
    int prochFichier(struct Fat fat1, int posAct);
    int getFin(int pos_deb,int tab[]);
    Ce que je veux faire dans ma fonction defrag() c'est passer un pointeur sur une structure Fat (pour la modifier) et passer un tableau d'éléments de type fichier (tableau que je souhaite modifier également).

    Voici les codes d'erreurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Compiling...
    main.c
    e:\_--etudes\cours3a\matières\info\projet_c\defrag.h(20) : error C2143: syntax error : missing ')' before '*'
    e:\_--etudes\cours3a\matières\info\projet_c\defrag.h(20) : error C2143: syntax error : missing '{' before '*'
    e:\_--etudes\cours3a\matières\info\projet_c\defrag.h(20) : error C2059: syntax error : ','
    e:\_--etudes\cours3a\matières\info\projet_c\defrag.h(20) : error C2059: syntax error : ')'
    Des idées?

  14. #14
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int defrag(struct Fat fat1 *,struct fichier tabFich[]);
    Je pense que c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int defrag(struct Fat * fat1,struct fichier tabFich[]);
    qu'il faut lire (caractere * avant non de paramètre, pas apres)

    Autre chose, quand je voie ce prototype, j'ai peur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int prochFichier(struct Fat fat1, int posAct);
    En effet, tu passe une structure "struct fat" par valeur (1er paramètre). Cette structure fait à vue de nez 4800 octets (et des poussières). Je pense qu'il vaut mieux la passer par adresse. Cela sera plus efficace.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse, en effet c'était tout simplement "struct Fat *fat1".

    Pour le reste je me demande si je peux accéder aux valeurs de ma structure fat1 si je la passe par adresse...et alors comment faire?
    Parce que effectivement ce serait bien plus léger.


    Autre question: Je déclare une structure ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct fichier{
    		char nom[8+1];
    		char ext[3+1];
    		int pos;
         };
    Ensuite j'essaye d'initialiser les parametres d'une variable fichier ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     struct fichier f1;					
    	f1.ext[4] = "txt";
    	f1.nom[9] = "f1";
    	f1.pos=2;
    Il ne me semble pas que sa soit la bonne méthode pour les chaînes de caractère, en effet quand ensuite je teste avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("nom de f1 %s",f1.nom);
    Il m'affiche n'importe quoi.
    Je ne comprends pas ou est l'erreur.

  16. #16
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par -*Saham Rayas*-
    ... Pour le reste je me demande si je peux accéder aux valeurs de ma structure fat1 si je la passe par adresse...et alors comment faire?
    En utilisant l'opérateur -> comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    struct fichier{
    		char nom[8+1];
    		char ext[3+1];
    		int pos;
         };
    <...>
    void foo( struct fichier *p_monFichier )
    {
        /* Affectation d'une valeur à pos (10) */
        p_monFichier->pos=10; 
        /* Ou alors ...*/
        (*p_monFichier).pos=10;
    }
    Citation Envoyé par -*Saham Rayas*-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     struct fichier f1;					
    	f1.ext[4] = "txt";
    	f1.nom[9] = "f1";
    	f1.pos=2;
    Pour copier des chaînes de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <string.h>
    <...>
    strcpy(f1.ext,"txt");
    @++
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Merci! nickel, j'avais complètement oublié la fonction strcpy...honte à moi! en plus j'ai déja eu ce problème. en tout cas merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Formalisation graphique des algorithmes
    Par David R. dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 08/12/2012, 10h21
  2. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/09/2002, 14h25
  3. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18
  4. Recherche de documentation complète en algorithmes
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/03/2002, 12h09
  5. Algorithme génétique
    Par Stephane.P_(dis Postef) dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 15/03/2002, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo