Ecrire sur une position donnée

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

par Rockleader » 07 Jan 2014, 16:11

Oki; je m'attaque donc à l'écriture d'une bande constitué de nbBlock.
cad l'écriture de n Bloc à la même position sur une liste de fichiers.

Code: Tout sélectionner
int k;
   for(k=0;k<g_disk.ndisk;k++) //parcours du nombre de fichiers
   {
      if (g_disk.storage[k] != NULL) //si le fichier existe
      {
         fseek(g_disk.storage[k],BLOCK_SIZE,pos); //on se place à la position dans le fichier
         char block[BLOCK_SIZE]={0};
         if (k != compute_parity_index(numBande)) /*si on est pas sur le block de parité*/
         {
            printf("Quel block voulez vous entrer:");
            scanf("%s",block);
            fwrite( block , sizeof(block[0]) , sizeof(block)/sizeof(block[0]) , g_disk.storage[k]);//on écrit le bloc
         }
         if (k == compute_parity_index(numBande))  /*si on est sur le block de parité*/
         {
            /*ecriture block de parité avec les xor */
         }
      }
   }


Pour le cas de la seconde condition je ne fais rien parce que j'ai pas encore trouvé comment écrire ça; l'idée c'est surtout le fait d'écrire à la suite sur les fichiers.

Qu'en pensez vous ?
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 » 07 Jan 2014, 16:14

Cela me paraît être la bonne solution.

En revanche pourquoi n'utilise pas else plutôt que de refaire un if ?

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

par Rockleader » 07 Jan 2014, 16:20

ampholyte a écrit:Cela me paraît être la bonne solution.

En revanche pourquoi n'utilise pas else plutôt que de refaire un if ?



Je ne sais pas moi même; je crois que ce sont des restes de mauvaises habitudes de windows; à chaque fois que je voulais mettre un else sur code blocks ça me faisait passer en C++ du coup j'avais pris l'habitude de mettre que des if...

M'enfin c'est vrai qu'avec mon nouvel éditeur je pourrais faire un effort x)
M'enfin au point ou j'en suis je sais que je rendrais pas mon projet fini si j'arrive à en faire la moitié en 24h je trouve ça déjà pas mal :marteau:
Encore heureux je m'étais un tant soit peu avancé...

Merci pour votre aide !



EDIT




Ce qui me pose le plus de soucis dans ce projets c'est de construire le bloc de parité avec les xor


Pour cela je dois utiliser une fonction qui prendra en entrée un tableau de block (Une bande en fait)

Et donc si j'ai bien compris mon énoncé je dois exprimer tout mes bloc en fonction des autres avec les xor

Par exemple si j'ai un tableau B0 B1 B2 BP

Bp=B0^B1^B2
B0=Bp^B1^B2
B1=B0^Bp^B2
B2=B0^B1^Bp


Mais va savoir pourquoi lorsqu'il faut que je passe à B..N je n'arrive pas à généraliser l'exemple; c'est assez frustrant surtout que sans ça le raid5 il sert à que dalle :mur:
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 15:31

par joel76 » 07 Jan 2014, 17:58

Rockleader a écrit:Je ne sais pas moi même; je crois que ce sont des restes de mauvaises habitudes de windows; à chaque fois que je voulais mettre un else sur code blocks ça me faisait passer en C++ du coup j'avais pris l'habitude de mettre que des if...
:wrong:

Pour cela je dois utiliser une fonction qui prendra en entrée un tableau de block (Une bande en fait)

Et donc si j'ai bien compris mon énoncé je dois exprimer tout mes bloc en fonction des autres avec les xor

Par exemple si j'ai un tableau B0 B1 B2 BP

Bp=B0^B1^B2
B0=Bp^B1^B2
B1=B0^Bp^B2
B2=B0^B1^Bp


Mais va savoir pourquoi lorsqu'il faut que je passe à B..N je n'arrive pas à généraliser l'exemple; c'est assez frustrant surtout que sans ça le raid5 il sert à que dalle :mur:

Si j'ai bien compris ton problème tu peux peut-être t'en sortir avec une double boucle :
Je suppose que tab est un tableau de N Bi
Code: Tout sélectionner
for (i = 0; i < N; i++)
{
    B = tab[i];
    for (j = 0; j < N; j++)
       if (j != i)
          B ^= tab[j]
   tab[i] = B;
}

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

par Rockleader » 07 Jan 2014, 19:09

Avec les accolades ça donne quoi ?

Je me demandais à quel niveau tu plaçais tab[i] = B;

Tu déclares bien B en tant que char* ou tu précises la taille ?

EDIT

En adaptant avec mes variables je l'ai faites comme ça

Code: Tout sélectionner
void compute_parity(char block[BLOCK_SIZE])
{
   int k;
   int j;
   char* B={0};
   for (k = 0; k < g_disk.ndisk; k++)
   {
       B[k] = block[k];
       for (j = 0; j < g_disk.ndisk; j++)
       {
             if (j != k)
             {
                B[k] ^= block[j];
             }
   block[k] = B[k];
      }
   }
}


Sous réserves que les accolades soit bien placé; comme ça ça passe bien au compilo mais je suis pas sur du résultat.
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 » 07 Jan 2014, 19:41

Tu fais des choses très curieuses et tu fais un peu n'importe quoi avec ton char* B.

Dans ton cas block[k] correspond au caractère k de la chaine block donc tu auras plutôt :

Code: Tout sélectionner
int i = 0;
int j = 0;
char c = 0;
/* On parcourt tous les caractères du block */
for (i = 0; i < strlen(block); i++) {
    c = block[i]; /* On stocke dans c le caractère correspondant à l'indice i */

    /* Boucle du xor */
    for (j = 0; j < strlen(block); j++) {
        if (j != i) {
            c ^= block[j];
        }
    }
    /* On met le résultat dans block[i] */
    block[i] = c;
}

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

par Rockleader » 07 Jan 2014, 19:59

Oui mais non ;) ou alors je suis encore à coté

Quand on calcule le bloc de parité En faisant la boucle On passe en argument non pas un block de caractère
mais une bande de block

Il faut donc parcourir dans un premier temps les block et seulement ensuite les caractères.

Or avec ce code on parcourt directement les caractères !
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 » 07 Jan 2014, 20:04

Pourtant ce que tu passes en paramètre est une chaine de caractère et non un tableau de chaine.

Il te suffira d'appeler de boucler sur ta fonction.

Code: Tout sélectionner
for (int i = 0; i < blablaba; i++) {
     compute_parity(montableaudeblock[i]);
}


Du coup il faut boucler dans la fonction jusqu'à strlen(block) (j'ai édité plus haut).

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

par Rockleader » 07 Jan 2014, 20:27

Ah super l'idée d'utiliser la longueur du mot; j'aurais du y penser !!! :mur:


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

 

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