Problème Access Violation dans une classe
J'ai le bout de code suivant qui fait une exception violation d'accès
dès sa création sans que BCB indique la ligne de code qui cause l'erreur. Il s'agit d'un
programme sur la cryptographie polyalphabétique
Code:
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
char alphabet[26]={'A','B'}//à Z
TPolyAlphabetique::TPolyAlphabetique(){
textclair=new char[255];textcrypte=new char[255];
chainecle=new char[255];cle=new char[255];
}
TPolyAlphabetique::~TPolyAlphabetique(){
delete textclair;delete textcrypte;delete chainecle;delete cle;
delete[] abaque;
}
void TPolyAlphabetique::fillAbaque(){
int i,j;
for(i=0;i<26;i++)
for(j=0;j<26;j++) abaque[i][j]=alphabet[(j+i)%26];
//en effet, le d‚calage de chaque ligne se fait … chaque i
//pas de -1 comme en JulesCesar car k=4 => commence par E ici
}
char TPolyAlphabetique::correspond(char clair,char cle){
int i,j;char brou;
for(j=0;j<26;j++){
if(clair==abaque[0][j]) break;
}
for(i=0;i<26;i++){
if(cle==abaque[i][0]) break;
}
brou=abaque[i][j];
return(brou);
}
char TPolyAlphabetique::correspond2(char cle,char crypt){
int i,j;char brou;
for(i=0;i<26;i++){
if(cle==abaque[0][i]) break;
}
for(j=0;j<26;j++){
if(crypt==abaque[j][i]) break;
}
brou=abaque[j][0];
return(brou);
}
void TPolyAlphabetique::crypter(){
//buildstrkey();
int L=strlen(textclair);char c;char * res=new char[255];
for(int i=0;i<L;i++){
c=correspond(textclair[i],chainecle[i]);
res[i]=c;
}
res[L]=0;strcpy(textcrypte,res);
}
void TPolyAlphabetique::decrypter(){
//buildstrkey();
int L=strlen(textcrypte);char c;char * res=new char[255];
for(int i=0;i<L;i++){
c=correspond2(chainecle[i],textcrypte[i]);
res[i]=c;
}
res[L]=0;strcpy(textclair,res);
}
void TPolyAlphabetique::buildstrkey(){
int lk=strlen(cle);int ltxt;char * tmp=new char[50];
chainecle="";
if (strlen(textclair)>strlen(textcrypte)) ltxt=strlen(textclair);
else ltxt=strlen(textcrypte);
int d=ltxt/lk;int m=ltxt%lk;
for(int i=0;i<d;i++) strcat(chainecle,cle);
if(m>0) strncpy(tmp,cle,m);
strcat(chainecle,tmp);
chainecle[ltxt]=0;//finir chainecle par le kre nul
} |
Voici le bouton pour l'appeler, la clé et le texte clair dans Edit2 et Edit1
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TPolyAlphabetique * P=new TPolyAlphabetique();
try{
P->fillAbaque();
P->textclair=Edit1->Text.c_str();
P->cle=Edit2->Text.c_str();
P->buildstrkey();
Label1->Caption.sprintf(P->chainecle);
P->crypter();
Edit3->Text.sprintf(P->textcrypte);
}
catch(...){
ShowMessage("Erreur");
}
//delete P;
} |
En fait, je voulais partager ce code, le mettre en ligne mais il plantouille!!!!