Bonjour, j'essaye de réaliser un programme (via Visual C++) qui réalise sur un tableau de char (vu comme des octets) une permutation donnée par un tableau.

Je me casse la tête en vain depuis des heures pour le faire fonctionner. Si quelqu'un peut examiner ces quelques lignes de code et m'aider, il deviendrait immédiatement mon dieu.

Dans mon main, j'essaie de permuter "Pourquoi" (8 octets) et j'obtiens un tableau de 4 octets à la fin. Autrement dit la taille de mon tableau varie au cours de l'execution et je ne vois pas pourquoi!

Le changement de taille intervient au 40ème passage dans la boucle de permute:
for (int i=0;i<8*taille;i++)
bitset(tableau,i,bitget(tmp,tableau_permute-1));

A priori tous les modules fonctionnent excepté permute.

Toute proposition d'amélioration est la bienvenue! Je débute en programmation, ça vous sautera sans doute aux yeux en lisant mon programme. ^^


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
int *char2tableau (unsigned char caractere){
int *adr;
adr=(int *)malloc(8*sizeof(int));
int temp=(int)caractere;
for (int compteur=0;compteur<8;compteur++)
{
adr[7-compteur]= temp%2;
temp=temp/2;
}
return adr;
}

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
unsigned char tableau2char (int *tableau){
int temp=tableau[0];
for (int compteur=1;compteur<8;compteur++)
{
temp=tableau[compteur]+2*temp;
}
unsigned char caractere=(unsigned char)temp;
return caractere;
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
int bitget(unsigned char tableau[],int position){
int * adr;
adr=char2tableau(tableau[position/8]);
return adr[position%8];
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
int bitset(unsigned char tableau[],int position, int bit)
{
int * adr;
adr=(int *)malloc(strlen((char *) tableau));
adr=char2tableau(tableau[position/8]);
adr[position%8]=bit;
tableau[position/8]=tableau2char(adr);
return 0;
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
void permute (unsigned char tableau[],int tableau_permute[]){
int taille=(int)strlen((char *) tableau);
unsigned char *tmp=(unsigned char*)malloc(taille);
for (int i=0;i<taille;i++)
tmp=tableau;
for (int i=0;i<8*taille;i++)
bitset(tableau,i,bitget(tmp,tableau_permute-1));
}

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
void affichage (unsigned char tableau[])
{
int * adr;
adr=(int *)malloc(8*strlen((char *)tableau));
for (unsigned int position=0;position<8*strlen((char *)tableau);position++)
{
if (position!=0 && position%8==0)
cout << " ";
cout << bitget(tableau,position);
}
cout<<endl;
}


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
int main ()
{
static int ip[] = {
58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6,
64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1,
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5,
63, 55, 47, 39, 31, 23, 15, 7
};//ip(40)-1=0, hasard ou fatalité?
unsigned char exemple[]="Pourquoi";
affichage(exemple);
permute(exemple,ip);
cout<<"Apres avoir permute, on obtient: "<< endl;
affichage(exemple);
return 0;
}