Langage C

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 10 Déc 2013, 22:27

Je crois que je me pose trop de question, j'arrive à comprendre plus ou moins la syntaxe maintenant (et depuis que j'ai linux les man de fonctions systèmes me débloquent pas mal aussi faut dire =)) mais je suis jamais sur de moi; je devrais tester plus par moi même et poser un peu moins de question parfois, désolé.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 10 Déc 2013, 22:37

Je pense aussi que tu te poses beaucoup de question. En programmation, la seule façon de bien comprendre c'est de tester, tester, tester, ...., est-ce que j'ai déjà dit testé ? ^^

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 10 Déc 2013, 22:45

ampholyte a écrit:Je pense aussi que tu te poses beaucoup de question. En programmation, la seule façon de bien comprendre c'est de tester, tester, tester, ...., est-ce que j'ai déjà dit testé ? ^^



Non tu l'as écris ! Ok je sors -->[]

Plus sérieusement; au moins avec ce topic; ça va faire une sorte d'archive pour toutes les questions que l'on peut se poser dans l'apprentissage du C. Je ne suis pas suffisamment crédule pour penser avoir tout vu, mais à partir ou on arrive à se dépatouiller avec les pointeurs et les fichiers je pense qu'un gros morceau est traité.
Restera peut être à voir comment faire les programme en dehors de la console; mais c'est déjà un peu ce qu'on fait avec des fichiers.


Bref je divague ;)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 10 Déc 2013, 23:13

Que veux-tu dire par faire des programmes en dehors de la console ?

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 10 Déc 2013, 23:27

Et bien faire en sorte de les exécuter dans une fenêtre; faire en sorte de pouvoir intéragir avec ta souris etc etc.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 10 Déc 2013, 23:40

Ha faire une interface graphique, ce n'est pas le plus compliqué, il existe des librairies graphiques faites pour cela =).

Toutefois je te recommande plutôt le C++ pour les interfaces graphiques (quand tu y seras :p)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 10 Déc 2013, 23:43

Enfin bref de toute façon je n'en suis pas encore là ;)

Je trouve ce projet que l'on nous as confié plutôt intéressant; car il doit se rapprocher de ce que l'on pourrait nous demander un jour de faire je pense. Le sujet est assez farfelu et il faut le décrypter. Il n'y a donc pas qu'une partie de simple codage à faire.

Je vais en baver mais je devrais en ressortir fortifié dans la maîtrise du langage je pense.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 10 Déc 2013, 23:49

Rockleader a écrit:Enfin bref de toute façon je n'en suis pas encore là ;)

Je trouve ce projet que l'on nous as confié plutôt intéressant; car il doit se rapprocher de ce que l'on pourrait nous demander un jour de faire je pense. Le sujet est assez farfelu et il faut le décrypter. Il n'y a donc pas qu'une partie de simple codage à faire.

Je vais en baver mais je devrais en ressortir fortifié dans la maîtrise du langage je pense.


C'est le but du projet =).

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 11 Déc 2013, 10:20

Je suis désolé j'ai encore une question è_é

Est il possible avec fopen ou une autre fonction d'ouvrir uniquement un dossier ?

D'autre part; j'essaie de faire quelque chose mais le compilo n'aime pas; et j'aurais voulu savoir s'il y avait un moyen pour le faire.

Voici l'erreur que je prend:

Code: Tout sélectionner
r5_defines.c:13:35: error: expected ‘)’ before string constant
   *g_disk.storage[k]=fopen(adresse"/d%d,k","r");
                                   ^
r5_defines.c:13:35: error: too few arguments to function ‘fopen’
In file included from r5_defines.c:1:0:
/usr/include/stdio.h:272:14: note: declared here
 extern FILE *fopen (const char *__restrict __filename,


Sachant que la structure de base est:

Code: Tout sélectionner
typedef struct virtual_disk_s {
    inode_table_t inodes;
    int ndisk;
    int raidmode;
    FILE *storage[NUMBER_OF_DISKS];
} virtual_disk_t;


J'ai crée une variable globale virtual_disk_t g_disk;


Et voici le code;

Code: Tout sélectionner
void init_disk_raid5(char* adresse)
{
   g_disk.ndisk=NUMBER_OF_DISKS;
   g_disk.raidmode=5;
   int k;
   for (k=0;k<NUMBER_OF_DISKS;k++)
   {
      *g_disk.storage[k]=fopen(adresse"/d%d,k","r"); /*en fait je voudrais 'essayer' de concaténer
les noms de fichiers à l'adresse qui ne contient qu'un nom de dossier; à moins qu'il n'y ait
une fonction pour ouvrir un dossier seulement*/
   }

}
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 11 Déc 2013, 10:26

Rockleader a écrit:Je suis désolé j'ai encore une question è_é

Est il possible avec fopen ou une autre fonction d'ouvrir uniquement un dossier ?



Oui c'est possible, il faut te renseigner du côté de : http://fr.openclassrooms.com/informatique/cours/parcourir-les-dossiers-avec-dirent-h (par exemple)


D'autre part; j'essaie de faire quelque chose mais le compilo n'aime pas; et j'aurais voulu savoir s'il y avait un moyen pour le faire.

Voici l'erreur que je prend:

Code: Tout sélectionner
r5_defines.c:13:35: error: expected ‘)’ before string constant
   *g_disk.storage[k]=fopen(adresse"/d%d,k","r");
                                   ^
r5_defines.c:13:35: error: too few arguments to function ‘fopen’
In file included from r5_defines.c:1:0:
/usr/include/stdio.h:272:14: note: declared here
 extern FILE *fopen (const char *__restrict __filename,




L'erreur est pourtant compréhensible, tu as trop d'arguments dans ta fonction fopen.

Code: Tout sélectionner
FILE * fopen(const char * restrict path, const char * restrict mode);


Dans ton cas ton premier paramètre n'est pas un char, tu as un problème dans tes guillements.

Code: Tout sélectionner
file = fopen("dossier/sous-dossier/mon_fichier", "r");



[quote]
Sachant que la structure de base est:

Code: Tout sélectionner
typedef struct virtual_disk_s {
    inode_table_t inodes;
    int ndisk;
    int raidmode;
    FILE *storage[NUMBER_OF_DISKS];
} virtual_disk_t;


J'ai crée une variable globale virtual_disk_t g_disk;


Et voici le code;

[CODE]void init_disk_raid5(char* adresse)
{
g_disk.ndisk=NUMBER_OF_DISKS;
g_disk.raidmode=5;
int k;
for (k=0;k pour ouvrir un dossier et parcourir ce dossier pour rechercher les fichiers.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 11 Déc 2013, 10:44

Après avoir lu cette page je me demandais: http://fr.openclassrooms.com/informatique/cours/parcourir-les-dossiers-avec-dirent-h/manipuler-des-fichiers-a-l-interieur-d-un-dossier


Une fois que l'on a ouvert un dossier; est on obligé de repasser par les fonctions décrites dans cette page ou on peut simplement utiliser des fopen classique pour ouvrir les fichiers présent dans le dossier ?

en gros faire un opendir(rep) qui s'enchainerait avec un fopen(fich)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 11 Déc 2013, 11:07

Et bien une fois ton dossier ouvert, tu as besoin de le parcourir pour récupérer le nom des tes fichiers contenus dans ce dossier.

La première page te donne toutes les solutions pour réussir à gérer ton fichier.

Code: Tout sélectionner
int main()
{
    DIR* rep = NULL;
    FILE *file = NULL;
    struct dirent* fichierLu = NULL; /* Déclaration d'un pointeur vers la structure dirent. */
    rep = opendir("D:\\Mes Documents\\JaKy");
    if (rep == NULL)
        exit(1);

    /* On ouvre le fichier à lire */
    while ((fichierLu = readdir(rep)) != NULL) {
        /* On ouvre chaque fichier : fopen(fichierLu->d_name, "r"); */
        /* On fait le traitement */
    }

    if (closedir(rep) == -1)
        exit(-1);

    return 0;
}

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 11 Déc 2013, 11:29

ampholyte a écrit:Et bien une fois ton dossier ouvert, tu as besoin de le parcourir pour récupérer le nom des tes fichiers contenus dans ce dossier.

La première page te donne toutes les solutions pour réussir à gérer ton fichier.

Code: Tout sélectionner
int main()
{
    DIR* rep = NULL;
    FILE *file = NULL;
    struct dirent* fichierLu = NULL; /* Déclaration d'un pointeur vers la structure dirent. */
    rep = opendir("D:\\Mes Documents\\JaKy");
    if (rep == NULL)
        exit(1);

    /* On ouvre le fichier à lire */
    while ((fichierLu = readdir(rep)) != NULL) {
        /* On ouvre chaque fichier : fopen(fichierLu->d_name, "r"); */
        /* On fait le traitement */
    }

    if (closedir(rep) == -1)
        exit(-1);

    return 0;
}


Oki dac comme cela c'est clair. Ce qui me perturbait c'est que pour ouvrir un fichier il parlait d'une bibliothèque SDL.
Code: Tout sélectionner
/* Imaginons que d_name = "image.bmp" */
img = SDL_LoadBMP(fichierLu->d_name);


Mais je viens de comprendre que ce n'était peut être que parce qu'il s'agissait d'une image :marteau:
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 11 Déc 2013, 11:30

En fait la librairie SDL est une librairie graphique permettant de réaliser des interfaces graphiques, des jeux, ....

Tu n'en as pas besoin ici.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 11 Déc 2013, 12:03

J'ai donc fait mon code qui compile et s'exécute sans erreur; mais je ne suis sur à 100% qu'il fasse bien ce qu'il devrait faire.

Je ne ferme pas les dossiers et fichier car le but de la procédure est justement de les ouvrir.

Code: Tout sélectionner
void init_disk_raid5(char* adresse)
{
   g_disk.ndisk=NUMBER_OF_DISKS;
   g_disk.raidmode=5;
   DIR* rep = NULL;
    struct dirent* fichierLu = NULL; /* Déclaration d'un pointeur vers la structure dirent. */
    rep = opendir(adresse);
    if (rep == NULL)
        exit(1);
    while ((fichierLu = readdir(rep)) != NULL)
    {
      int k;
      for (k=0;k<NUMBER_OF_DISKS;k++)
      {
         g_disk.storage[k]=fopen("d%d,k","r");
      }
   }
}


lorsque j'exécute la procédure en lui donnant en argument la chaine de caractère du dossier en question tout s'exécute sans problème.

Mais lorsque je fais un ls pour voir dans quel répertoire je suis; je ne me suis pas déplacé dans le répertoire en question, je me demandais si c'était normal ou pas; dans la mesure ou je n'ai pas "fermé" le dossier ni les fichiers.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 11 Déc 2013, 12:08

Je ne comprends vraiment pas ce que tu cherches à faire. Pourquoi fais-tu un "d%d,k" dans ton fopen ? Ce n'est pas comme un printf. Il va essayer d'ouvrir le fichier "d%d,k" dans ton repertoire courant.

Ce n'est pas ce que tu veux, tu veux ouvrir le nombre de fichier qui se trouve dans le dossier donc :

Code: Tout sélectionner
int k = 0
while ((fichierLu = readdir(rep)) != NULL) {
    /* On vérifie qu'il ne s'agit pas de . et .. */
    if (strcmp(fichierLu->d_name, ".") == 0 || strcmp(fichierLu->d_name, "..") == 0) {
        continue;
    }
    g_disk.storage[k]=fopen(fichierLu->d_name,"r");
    k ++;
}



Bien sûr ce test, n'est pas complet du tout, il manque des conditions et des tests pour être sûr que fichierLu->d_name est bien un fichier et non un sous dossier =)

Il faut également vérifier de ne passer le tableau de FILE * avec l'indice k.

Que se passe-t'il si tu as plus de fichier que de place dans ton tableau ?

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 11 Déc 2013, 12:14

Ben en fait sachant que j'ai 4 fichier nommé d0 d1 d2 d3 je voulais trouvé un moyen de ne pas me mettre une ligne pour ouvrir chaque fichier.


Que se passe-t'il si tu as plus de fichier que de place dans ton tableau ?


Ce cas là est impossible vu que k s'incrémente jusqu'à la constante du nombre de fichier.

Et cette constante est elle même à l'origine de la création des fichiers dans un script fourni.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 11 Déc 2013, 13:14

Rockleader a écrit:Ben en fait sachant que j'ai 4 fichier nommé d0 d1 d2 d3 je voulais trouvé un moyen de ne pas me mettre une ligne pour ouvrir chaque fichier.




Ce cas là est impossible vu que k s'incrémente jusqu'à la constante du nombre de fichier.

Et cette constante est elle même à l'origine de la création des fichiers dans un script fourni.


Rien ne t'empêche de construire toi-même la chaine de ton fichier.

Code: Tout sélectionner
char buffer[255 + 1] = {0};
int i = 0;

for (i = 0; i < 10; i++) {
    sprintf(buffer, "mon_fichier_%d", i);
    fprintf(stdout, "%s\n", buffer);
}


Je ne vois pas le rapport à ce moment là avec l'ouverture d'un dossier. Que veux-tu faire avec le dossier ?

PS : n'oublie pas que tu peux ouvrir un fichier se trouvant dans un dossier : fopen("mon_dossier/mon_sous_dossier/monfichier", "r"); fonctionne

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 11 Déc 2013, 16:30

Sa va être un peu chaud d'expliquer tout ce que je dois faire et pourquoi je le fais sans mettre la totalité de mon sujet du projet ;) surtout qu'il est tout à fait possible que je comprenne de travers certaines choses...

Je le mettrais peut être.

En ce qui concerne sprintf j'y avais pensé; mais à priori ça ne "concatène" que des chaines du coup je pense pas que ta solution fonctionne, mais je vais tout de même tenter.


EDIT;

Je vais quand même tenter d'expliquer le projet autrement je me rend compte que c'est vachement flou tout ce que je dis.


Le but est de simuler un système RAID5. (Je peux vous donner des infos dessus si vous voulez).

Pour simuler ce système on dispose de 4 fichiers possédant la même capacité en octet. d0 d1 d2 d3.
Ces fichiers représenteront les disques durs du système RAID5.

Au début ces fichiers sont crées avec un script fourni qui crée automatiquement des dossiers de même taille En l'occurance les miens ont une taille de 500 000 octet.

Cf un ptit copié collé du pdf qui montre comment c'est construit.

Les technologies RAID (pour Redundant Array of Independent Disks) permettent de r ;)epartir les
donn ;)ees sur plusieurs disques durs afin d’am ;)eliorer la tol ;)erance aux pannes, la s ;)ecurit ;)e des donn ;)ees,
ou les performances d’acc`es. Ces technologies sont aussi capable de combiner ces diff ;)erents crit`eres
pour offrir un espace de stockage sˆ
ur, r ;)esistant aux pannes et rapide d’acc`es. Les technologies RAID sont identifi ;)ee par un num ;)ero indiquant les crit`eres support ;)es. Nous nous int ;)eressons ici `a la technologie RAID 5, qui permet `
a la fois un fonctionnement r ;)esistant aux pannes et une grande perfor-
mance lors de la lecture de fichiers. Une introduction synth ;)etique `a ces technologies est disponible `a l’url
http://fr.wikipedia.org/wiki/RAID_(informatique).
L’objectif de ce projet est de d ;)evelopper en langage C une version simplifi ;)ee de la technologie RAID 5.








C'est un peu plus détaillé sur mon pdf mais je vous passe les détails (à moins que cela ne vous intéresse vraiment :lol3: )

A partir de là; on m fournit également le fichier header que j'ai du vous mettre plus haut mais que je vais remettre au cas où:

Code: Tout sélectionner
#ifndef __R5_DEFINES__
#define __R5_DEFINES__

#define NUMBER_OF_DISKS 4
#define BLOCK_SIZE 4
#define FILENAME_MAX_SIZE 32
#define MAX_FILES 100
#define MAX_FILE_SIZE (50*1024)

#include

typedef unsigned int uint;
typedef unsigned char uchar;

/* Type of a block of data */
typedef struct block_s{
    uchar data[BLOCK_SIZE];
} block_t;

/* Type of the pseudo-inode structure */
typedef struct inode_s{
  char filename[FILENAME_MAX_SIZE];
  uint size;
  uint nblock; // nblock = (size+BLOCK_SIZE-1)/BLOCK_SIZE
  uint block_id;
} inode_t;

/* Type of the inode table */
typedef inode_t inode_table_t[MAX_FILES];

/* Type of the virtual disk system */
typedef struct virtual_disk_s {
    inode_table_t inodes;
    int ndisk;
    int raidmode;
    FILE *storage[NUMBER_OF_DISKS];
} virtual_disk_t;



Avec cette base là; mon projet commence avec les questions que l'on me pose.


La première étant de créer une fonction pour allumer le système et une seconde pour l'éteindre.


D'où les deux procédures suivantes que j'ai réalisé;

g_disk / rep / fichierLu sont défini en global.
Code: Tout sélectionner
void init_disk_raid5(char* adresse)
{
   g_disk.ndisk=NUMBER_OF_DISKS;
   g_disk.raidmode=5;
    rep = opendir(adresse);
    if (rep == NULL)
        exit(1);
    while ((fichierLu = readdir(rep)) != NULL)
    { /*a remplacer par la boucle en sprintf si cela marche*/
      g_disk.storage[0]=fopen("d0","r");
      g_disk.storage[1]=fopen("d1","r");
      g_disk.storage[2]=fopen("d2","r");
      g_disk.storage[3]=fopen("d3","r");      
   }

}

void close_disk_raid5(char* adresse)
{

while ((fichierLu = readdir(rep)) != NULL)
    {
      fclose(g_disk.storage[0]);
      fclose(g_disk.storage[1]);
      fclose(g_disk.storage[2]);
      fclose(g_disk.storage[3]);      
   }
   closedir(rep);
}




Maintenant pour revenir sur ta question de pourquoi au début ouvrir seulement le dossier.

En lisant ma question; je comprend que le système est représenté par le dossier:

On consid`ere que notre syst`eme R AID 5 est repr ;)esent ;)e par la variable globale virtual disk t g disk ;.
Avant de pouvoir l’utiliser, il est n ;)ecessaire de l’initialiser `a partir du nom du r ;)epertoire contenant
;)
les disques virtuels format ;)es. Ecrire
la fonction init disk raid5 qui, `a partir du nom du r ;)epertoire,
initialise cette variable globale. Dans un premier temps, on n’initialisera pas la table d’inodes.
Lorsque notre syst`eme sera ” ;)eteint”, il sera n ;)ecessaire de s’assurer de l’absence de risque de perte
de donn ;)ees. Pour cela, ;)ecrire une fonction qui ” ;)eteint” notre syst`eme R AID 5.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 11 Déc 2013, 17:18

Rockleader a écrit:Sa va être un peu chaud d'expliquer tout ce que je dois faire et pourquoi je le fais sans mettre la totalité de mon sujet du projet ;) surtout qu'il est tout à fait possible que je comprenne de travers certaines choses...

Je le mettrais peut être.

En ce qui concerne sprintf j'y avais pensé; mais à priori ça ne "concatène" que des chaines du coup je pense pas que ta solution fonctionne, mais je vais tout de même tenter.


Le problème c'est que j'ai dû mal à savoir quel est ta vrai question et sur quel partie tu coinces. La fonction snprintf ne concatène pas des chaines mais permet d'en construire à partir de paramètres.

J'avoue avoir du mal à comprendre dans quel but as-tu besoin d'ouvrir un dossier.

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 5 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite