PDA

Tam Sürümünü Görmek İçin : Debug Asseriton Failed!


canadanali
04/12/2005, 22:53
aşağıdaki kodu visual c++ 6.0 da programı çalıştırınca aşagıdaki menü geliyor

1-Mesaji sifrele...
2-Sifrelenmis mesaji cozum
3-Programdan cik
seciminiz giriniz...:

örneğin seçimi 1 girince "Debug Asseriton Failed!" hatası veriyor..



//sifre.cpp
#include <iostream>
using namespace std;

//Vigenere tablosu (ingiliz alfabesine göre düzenlenmiş)
int secim;
const char tablo[26][26] = {
{ 'A','B','C','D','E','F','G','H','I','J','K','L','M ','N','O','P','Q','R','S','T','U','V','W','X','Y', 'Z' },
{ 'B','C','D','E','F','G','H','I','J','K','L','M','N ','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'A' },
{ 'C','D','E','F','G','H','I','J','K','L','M','N','O ','P','Q','R','S','T','U','V','W','X','Y','Z','A', 'B' },
{ 'D','E','F','G','H','I','J','K','L','M','N','O','P ','Q','R','S','T','U','V','W','X','Y','Z','A','B', 'C' },
{ 'E','F','G','H','I','J','K','L','M','N','O','P','Q ','R','S','T','U','V','W','X','Y','Z','A','B','C', 'D' },
{ 'F','G','H','I','J','K','L','M','N','O','P','Q','R ','S','T','U','V','W','X','Y','Z','A','B','C','D', 'E' },
{ 'G','H','I','J','K','L','M','N','O','P','Q','R','S ','T','U','V','W','X','Y','Z','A','B','C','D','E', 'F' },
{ 'H','I','J','K','L','M','N','O','P','Q','R','S','T ','U','V','W','X','Y','Z','A','B','C','D','E','F', 'G' },
{ 'I','J','K','L','M','N','O','P','Q','R','S','T','U ','V','W','X','Y','Z','A','B','C','D','E','F','G', 'H' },
{ 'J','K','L','M','N','O','P','Q','R','S','T','U','V ','W','X','Y','Z','A','B','C','D','E','F','G','H', 'I' },
{ 'K','L','M','N','O','P','Q','R','S','T','U','V','W ','X','Y','Z','A','B','C','D','E','F','G','H','I', 'J' },
{ 'L','M','N','O','P','Q','R','S','T','U','V','W','X ','Y','Z','A','B','C','D','E','F','G','H','I','J', 'K' },
{ 'M','N','O','P','Q','R','S','T','U','V','W','X','Y ','Z','A','B','C','D','E','F','G','H','I','J','K', 'L' },
{ 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z ','A','B','C','D','E','F','G','H','I','J','K','L', 'M' },
{ 'O','P','Q','R','S','T','U','V','W','X','Y','Z','A ','B','C','D','E','F','G','H','I','J','K','L','M', 'N' },
{ 'P','Q','R','S','T','U','V','W','X','Y','Z','A','B ','C','D','E','F','G','H','I','J','K','L','M','N', 'O' },
{ 'Q','R','S','T','U','V','W','X','Y','Z','A','B','C ','D','E','F','G','H','I','J','K','L','M','N','O', 'P' },
{ 'R','S','T','U','V','W','X','Y','Z','A','B','C','D ','E','F','G','H','I','J','K','L','M','N','O','P', 'Q' },
{ 'S','T','U','V','W','X','Y','Z','A','B','C','D','E ','F','G','H','I','J','K','L','M','N','O','P','Q', 'R' },
{ 'T','U','V','W','X','Y','Z','A','B','C','D','E','F ','G','H','I','J','K','L','M','N','O','P','Q','R', 'S' },
{ 'U','V','W','X','Y','Z','A','B','C','D','E','F','G ','H','I','J','K','L','M','N','O','P','Q','R','S', 'T' },
{ 'V','W','X','Y','Z','A','B','C','D','E','F','G','H ','I','J','K','L','M','N','O','P','Q','R','S','T', 'U' },
{ 'W','X','Y','Z','A','B','C','D','E','F','G','H','I ','J','K','L','M','N','O','P','Q','R','S','T','U', 'V' },
{ 'X','Y','Z','A','B','C','D','E','F','G','H','I','J ','K','L','M','N','O','P','Q','R','S','T','U','V', 'W' },
{ 'Y','Z','A','B','C','D','E','F','G','H','I','J','K ','L','M','N','O','P','Q','R','S','T','U','V','W', 'X' },
{ 'Z','A','B','C','D','E','F','G','H','I','J','K','L ','M','N','O','P','Q','R','S','T','U','V','W','X', 'Y' } };


//Mesaj sınıfı değişken ve metodlarının deklarasyonu
class Mesaj
{
private:
char* pCMesaj;
char* pSMesaj;
char* pAnahtar;

public:
Mesaj();
void MesajAl();
void AnahtarAl();
void MesajSifrele();
void MesajCozumle();
void Menu();
~Mesaj();

};


//Varsayılan Kurucu
Mesaj::Mesaj()
{
}

// Mesajı al...
void Mesaj::MesajAl()
{
char *pGecici=new char[256];

cin.getline(pGecici,256,'\n');
cout<<endl;

pCMesaj = new char[strlen(pGecici)+1];
strcpy(pCMesaj, pGecici);

pSMesaj = new char[strlen(pGecici)+1];
strcpy(pSMesaj,pGecici);
delete[] pGecici;
}

//Anahtarı al...
void Mesaj::AnahtarAl()
{
char *pGecici = new char[32];

cout<<"Anahtari giriniz ve enter tusuna basiniz..." <<endl;
cin.getline(pGecici, 32, '\n');
cout<<endl;

pAnahtar = new char[strlen(pCMesaj)+1];
strcpy(pAnahtar,pCMesaj);

int i, j;

for(i = 0, j = 0; i < strlen(pCMesaj), j < strlen(pCMesaj); i++, j++)
{
if(pGecici[j] && pAnahtar[i])
{
pAnahtar[i] = pGecici[j];
}
else if(pGecici[j] == '\0')
{
j = -1;
i--;
}
else
break;
}

delete[] pGecici;
}

//Mesajı şifrele....
void Mesaj::MesajSifrele()
{
int saga, asagiya;
int i, j;


cout << "Mesaj sifrelendi..." << endl;
cout << endl <<pCMesaj<<endl<<pAnahtar << endl << endl;
for(j = 0; j < strlen(pSMesaj); j++)
{
for(i = 0; i < 26; i++)
{
if( !(isalpha(pCMesaj[j])))
{
saga = 30;
break;
}

if( ( toupper(pCMesaj[j]) == tablo[0][i]))
{
saga = i;
break;
}
}

for(i = 0; i < 26; i++)
{
if( !(isalpha(pCMesaj[j])))
{
asagiya = 30;
break;
}

if( ( toupper(pAnahtar[j]) == tablo[i][0]))
{
asagiya = i;
break;
}
}

if(saga != 30 && asagiya != 30)
pSMesaj[j] = tablo[asagiya][saga];
}
cout << pSMesaj << endl << endl;
}


//Mesajı çözümle....
void Mesaj::MesajCozumle()
{
int asagiya, saga, i, j;

cout << "Mesaj cozumlendi..." << endl;
cout << endl << pSMesaj << endl << pAnahtar << endl << endl;

for(j = 0; j < strlen(pSMesaj); j++)
{
for(i = 0; i < 26; i++)
{
if( !(isalpha(pAnahtar[j])))
{
saga = 30;
break;
}

if( ( toupper(pAnahtar[j]) == tablo[0][i]))
{
saga = i;
break;
}
}

for(i = 0; i < 26; i++)
{
if( !(isalpha(pSMesaj[j])))
{
asagiya = 30;
break;
}

if( ( toupper(pSMesaj[j]) == tablo[i][saga]))
{
asagiya = i;
break;
}
}

if(asagiya != 30)
pCMesaj[j] = tablo[asagiya][0];
}

cout << pCMesaj << endl;
}

void Mesaj::Menu()
{
cout<<"1-Mesaji sifrele..."<<endl;
cout<<"2-Sifrelenmis mesaji cozumle ..."<<endl;
cout<<"3-Programdan cik"<<endl;
cout<<"seciminiz giriniz...:";
cin>>secim;
}

//Yıkıcı
Mesaj::~Mesaj()
{
delete[] pCMesaj;
delete[] pSMesaj;
delete[] pAnahtar;
}


//Main fonksiyonu
int main()
{
//Mesaj sınfından mesaj nesnesi oluşturuldu...
Mesaj mesaj;
mesaj.Menu();



if(secim==1){
cout<<"Sifrelemek istediginiz mesaji giriniz ve enter tusuna basiniz...";
mesaj.MesajAl();
//mesaj.AnahtarAl();
//mesaj.MesajSifrele();
}
else if(secim==2){
cout<<"Cozumlemek istediginiz mesaji giriniz ve enter tusuna basiniz....";
mesaj.MesajAl();
mesaj.AnahtarAl();
mesaj.MesajCozumle();
}
else if(secim==3)
{
exit(0);
}

else
cout<<"aaaaaaaaaa";
return 0;
}


acehreli
04/12/2005, 23:44
Kodunda cok temel hatalar var; bunlardan hangilerinin hataya neden oldugunu bilmiyorum. Cok kisaca:

1) Global nesne kullanma. Bu programda 'secim'in global olmasi icin hicbir neden goremiyorum

2) Sihirli sabitler kullanma. 32, 26, gibi sayilar kodun anlasilmasin guclestiriyorlar.

3) C turu dizgiler yerine std::string kullan

4) Her zaman icin "uc islevler kuralini" uygula: Eger su ozel uc islevden birisini yazmissan, her ucunu de en azindan bildir: bozucu, kopalayici, atama isleci. Mesaf sinifi kopyalanabiliyor ve atanabiliyor ama sonuc tanimsizdir

5) Su satirda virgul isleci yerine && mi kullanmak istedin acaba? Cunku birinci karsilastirmanin etkisi gozardi ediliyor. Parantez kullanmadigin icin ve ben islec oncelikleri tablosunu ezbere bilmedigim icin tam olarak ne islem yapmak istedigini anlayamiyorum.

for(i = 0, j = 0; i < strlen(pCMesaj), j < strlen(pCMesaj); i++, j++)

Ali

canadanali
05/12/2005, 00:11
kodu adım adım çaılştırsam belki hatayı bulabilirim. normalde program çalışıyordu.
(c:\>sifre -d veya sifre -e ile parametre verince)

//sifre.cpp
#include <iostream>
using namespace std;

//Vigenere tablosu (ingiliz alfabesine göre düzenlenmiş)
const char tablo[26][26] = {
{ 'A','B','C','D','E','F','G','H','I','J','K','L','M ','N','O','P','Q','R','S','T','U','V','W','X','Y', 'Z' },
{ 'B','C','D','E','F','G','H','I','J','K','L','M','N ','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'A' },
{ 'C','D','E','F','G','H','I','J','K','L','M','N','O ','P','Q','R','S','T','U','V','W','X','Y','Z','A', 'B' },
{ 'D','E','F','G','H','I','J','K','L','M','N','O','P ','Q','R','S','T','U','V','W','X','Y','Z','A','B', 'C' },
{ 'E','F','G','H','I','J','K','L','M','N','O','P','Q ','R','S','T','U','V','W','X','Y','Z','A','B','C', 'D' },
{ 'F','G','H','I','J','K','L','M','N','O','P','Q','R ','S','T','U','V','W','X','Y','Z','A','B','C','D', 'E' },
{ 'G','H','I','J','K','L','M','N','O','P','Q','R','S ','T','U','V','W','X','Y','Z','A','B','C','D','E', 'F' },
{ 'H','I','J','K','L','M','N','O','P','Q','R','S','T ','U','V','W','X','Y','Z','A','B','C','D','E','F', 'G' },
{ 'I','J','K','L','M','N','O','P','Q','R','S','T','U ','V','W','X','Y','Z','A','B','C','D','E','F','G', 'H' },
{ 'J','K','L','M','N','O','P','Q','R','S','T','U','V ','W','X','Y','Z','A','B','C','D','E','F','G','H', 'I' },
{ 'K','L','M','N','O','P','Q','R','S','T','U','V','W ','X','Y','Z','A','B','C','D','E','F','G','H','I', 'J' },
{ 'L','M','N','O','P','Q','R','S','T','U','V','W','X ','Y','Z','A','B','C','D','E','F','G','H','I','J', 'K' },
{ 'M','N','O','P','Q','R','S','T','U','V','W','X','Y ','Z','A','B','C','D','E','F','G','H','I','J','K', 'L' },
{ 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z ','A','B','C','D','E','F','G','H','I','J','K','L', 'M' },
{ 'O','P','Q','R','S','T','U','V','W','X','Y','Z','A ','B','C','D','E','F','G','H','I','J','K','L','M', 'N' },
{ 'P','Q','R','S','T','U','V','W','X','Y','Z','A','B ','C','D','E','F','G','H','I','J','K','L','M','N', 'O' },
{ 'Q','R','S','T','U','V','W','X','Y','Z','A','B','C ','D','E','F','G','H','I','J','K','L','M','N','O', 'P' },
{ 'R','S','T','U','V','W','X','Y','Z','A','B','C','D ','E','F','G','H','I','J','K','L','M','N','O','P', 'Q' },
{ 'S','T','U','V','W','X','Y','Z','A','B','C','D','E ','F','G','H','I','J','K','L','M','N','O','P','Q', 'R' },
{ 'T','U','V','W','X','Y','Z','A','B','C','D','E','F ','G','H','I','J','K','L','M','N','O','P','Q','R', 'S' },
{ 'U','V','W','X','Y','Z','A','B','C','D','E','F','G ','H','I','J','K','L','M','N','O','P','Q','R','S', 'T' },
{ 'V','W','X','Y','Z','A','B','C','D','E','F','G','H ','I','J','K','L','M','N','O','P','Q','R','S','T', 'U' },
{ 'W','X','Y','Z','A','B','C','D','E','F','G','H','I ','J','K','L','M','N','O','P','Q','R','S','T','U', 'V' },
{ 'X','Y','Z','A','B','C','D','E','F','G','H','I','J ','K','L','M','N','O','P','Q','R','S','T','U','V', 'W' },
{ 'Y','Z','A','B','C','D','E','F','G','H','I','J','K ','L','M','N','O','P','Q','R','S','T','U','V','W', 'X' },
{ 'Z','A','B','C','D','E','F','G','H','I','J','K','L ','M','N','O','P','Q','R','S','T','U','V','W','X', 'Y' } };


//Mesaj sınıfı değişken ve metodlarının deklarasyonu
class Mesaj
{
private:
char* pCMesaj;// bu degisken hem normal mesaji ve sifreli mesaji saklar.
char* pSMesaj;//sifrelenmis mesaji saklar
char* pAnahtar;//anahtar bilgisini saklar

public:
Mesaj();
void MesajSifrele();//girilen mesaji sifreler
void MesajCozumle();//sifrelenen mesaji cozumler
void MesajAl();//disaridan mesja girilmesini saglar
void AnahtarAl();//anahtar bilgisini alir
~Mesaj();

};


//Varsayılan Kurucu
Mesaj::Mesaj()
{}

// Mesajı al...
void Mesaj::MesajAl()
{
//mesaj bilgisini tutan 256 byte uzunlugunda gecici bir degisken tanimliyoruz
char* pGecici = new char[256];

//mesaji gecici degiskene aliyoruz
cin.getline(pGecici, 256, '\n');
cout << endl;

//pCMesaj degiskenine gecici mesajin icerigini aliyoruz
pCMesaj = new char[ strlen(pGecici) + 1 ];
strcpy(pCMesaj, pGecici);

//pSMesaj degiskenine gecici mesajin icerigini aliyoruz
pSMesaj = new char[ strlen(pGecici) + 1 ];
strcpy(pSMesaj, pGecici);

//gecici mesaj icin ayrilan alani serbest birakiyoruz
delete[] pGecici;
}

//Anahtarı al...
void Mesaj::AnahtarAl()
{
////anahtar bilgisini tutan 32 byte uzunlugunda gecici bir degisken tanimliyoruz
char* pGecici = new char[32];

cout << "Anahtari giriniz ve enter tusuna basiniz..." << endl;
////anahtarı gecici degiskene aliyoruz
cin.getline(pGecici, 32, '\n');
cout << endl;

//anahtar degiskeni icin pCMesaj degiskeni kadar yer ayiriyoruz
pAnahtar = new char[ strlen(pCMesaj) + 1 ];
//mesaj bilgisini gecici olarak ahantar degiskenine kopyaladık
strcpy(pAnahtar, pCMesaj);

int i, j;

//anahtar bilgisini mesaj bilgisi kadar tekrarladık
for(i = 0, j = 0; i < strlen(pCMesaj), j < strlen(pCMesaj); i++, j++)
{
if(pGecici[j] && pAnahtar[i])
{
pAnahtar[i] = pGecici[j];
}
else if(pGecici[j] == '\0')
{
//eger anahtar bilgisinin bütün harfleri kullanilmis ise
//döngüde 0 dan baslamasi icin j degiskenini -1 yap
j = -1;
//i degiskenini 1 azaltip mesaj bilgisindeki konumunu ayarla
i--;
}
else
//döngüyü ayril
break;
}

//gecici mesaj icin ayrilan alani serbest birakiyoruz
delete[] pGecici;
}

//Mesajı şifrele....
void Mesaj::MesajSifrele()
{
int saga, asagiya;
int i, j;


cout << "Mesaj sifrelendi..." << endl;
//mesaj ve anahtar bilgisi ekrana yazildi
cout << endl <<pCMesaj<<endl<<pAnahtar << endl << endl;
//sifrelenecek mesaj boyu kadar dongu calisacak
for(j = 0; j < strlen(pSMesaj); j++)
{
//i degiskeni alfabe uzunlugundan buyuk olamaz
for(i = 0; i < 26; i++)
{
//pCMesaj degiskenin elemaninin harf degil ise...
if( !(isalpha(pCMesaj[j])))
{
saga = 30;
break;
}

////pCMesaj degiskenin elemaninin harf ise...
if( ( toupper(pCMesaj[j]) == tablo[0][i]))
{
saga = i;
break;
}
}

//pCMesaj degiskenin elemaninin harf degil ise...
for(i = 0; i < 26; i++)
{
if( !(isalpha(pCMesaj[j])))
{
asagiya = 30;
break;
}
////pCMesaj degiskenin elemaninin harf ise...
if( ( toupper(pAnahtar[j]) == tablo[i][0]))
{
asagiya = i;
break;
}
}

//saga ve asagiya degiskenleri harf ise sifrelenen harf tablodan bulunur.
if(saga != 30 && asagiya != 30)
pSMesaj[j] = tablo[asagiya][saga];
}
cout << pSMesaj << endl << endl;
}


//Mesajı çözümle....
void Mesaj::MesajCozumle()
{
int asagiya, saga, i, j;

cout << "Mesaj cozumlendi..." << endl;
cout << endl << pSMesaj << endl << pAnahtar << endl << endl;

for(j = 0; j < strlen(pSMesaj); j++)
{
for(i = 0; i < 26; i++)
{
if( !(isalpha(pAnahtar[j])))
{
saga = 30;
break;
}

if( ( toupper(pAnahtar[j]) == tablo[0][i]))
{
saga = i;
break;
}
}

for(i = 0; i < 26; i++)
{
if( !(isalpha(pSMesaj[j])))
{
asagiya = 30;
break;
}

if( ( toupper(pSMesaj[j]) == tablo[i][saga]))
{
asagiya = i;
break;
}
}

if(asagiya != 30)
pCMesaj[j] = tablo[asagiya][0];
}

cout << pCMesaj << endl;
}

//Yıkıcı
Mesaj::~Mesaj()
{
//degiskenler icin ayrilan alani serbest birakiyoruz
delete[] pCMesaj;
delete[] pSMesaj;
delete[] pAnahtar;
}

//Main fonksiyonu
int main(int argc, char* argv[])
{
//Mesaj sınfından mesaj nesnesi oluşturuldu...
Mesaj mesaj;

//Eğer argüman sayısı 2 den az ise parametre girilmemiş demektir...
if(argc != 2)
{
cout<<"Sifrelemek istediginiz mesaji konsoldan encrypt -e yazarak sifreleyebilirsiniz"<<endl;
cout<<"Cozumlemek istediginiz mesaji ise konsoldan encrypt -d yazarak cozumleyebilirsiniz"<<endl;
cout << "Kullanimi: " << argv[0] << " -d or -e" << endl;
return 0;
}


//eğer kullanılan parametre 'e' ise yani konsoldan 'sifre -e' komutu yazılmış ise

if( !strcmp(argv[1], "-e"))
{
cout<<"Sifrelemek istediginiz mesaji giriniz ve enter tusuna basiniz..."<<endl;
mesaj.MesajAl();
mesaj.AnahtarAl();
mesaj.MesajSifrele();
}

//eğer kullanılan parametre 'd' ise yani konsoldan 'sifre -d' komutu yazılmış ise
if( !strcmp(argv[1], "-d"))
{
cout<<"Cozumlemek istediginiz mesaji giriniz ve enter tusuna basiniz...."<<endl;
mesaj.MesajAl();
mesaj.AnahtarAl();
mesaj.MesajCozumle();
}


return 0;
}