Skocz do zawartości

Naruszenie Ochrony Pamięcie :-|


MitS

Rekomendowane odpowiedzi

#include <iostream>
#include <cstdlib>

using namespace std;

const int K=26*2*2*2+1;          // znaki ASCII + polskie litery + spacja
int shift[K];
int i;

int indeks(char c)
{
switch(c)
{
case ' ':  return 0;        // spacja = 0
case 'a':  return 1;
case 'b':  return 2;
case 'c':  return 3;
case 'd':  return 4;
case 'e':  return 5;
case 'f':  return 6;
case 'g':  return 7;
case 'h':  return 8;
case 'i':  return 9;
case 'j':  return 10;
case 'k':  return 11;
case 'l':  return 12;
case 'm':  return 13;
case 'n':  return 14;
case 'o':  return 15;
case 'p':  return 16;
case 'q':  return 17;
case 'r':  return 18;
case 's':  return 19;
case 't':  return 20;
case 'v':  return 21;
case 'w':  return 22;
case 'u':  return 23;
case 'x':  return 24;
case 'y':  return 25;
case 'z':  return 26;
case 'A':  return 27;
case 'B':  return 28;
case 'C':  return 29;
case 'D':  return 30;
case 'E':  return 31;
case 'F':  return 32;
case 'G':  return 33;
case 'H':  return 34;
case 'I':  return 35;
case 'J':  return 36;
case 'K':  return 37;
case 'L':  return 38;
case 'M':  return 39;
case 'N':  return 40;
case 'O':  return 41;
case 'P':  return 42;
case 'Q':  return 43;
case 'R':  return 44;
case 'S':  return 45;
case 'T':  return 46;
case 'V':  return 47;
case 'W':  return 48;
case 'U':  return 49;
case 'X':  return 50;
case 'Y':  return 51;
case 'Z':  return 52;
case 'ą':  return 53;
case 'ź':  return 54;
case 'ż':  return 55;
case 'ę':  return 56;
case 'ś':  return 57;
case 'ć':  return 58;
case 'ń':  return 69;
case 'ó':  return 60;
case 'ł':  return 61;
case 'Ż':  return 62;
case 'Ź':  return 63;
case '':  return 64;
case 'Ś':  return 65;
case 'Ć':  return 66;
case 'Ń':  return 67;
case 'Ó':  return 68;
case 'Ł':  return 69;

default:
if(islower(c))            // 'c’ jest małą literą ?
 return c-'a'+1;
else
 return c-'A'+27;
}
}

void init_shifts(char *w)
{
int k, M=strlen(w);
for(i=0; i<k; i++)
 shift[i]=M;
for(i=0; i<M; i++)
 shift[indeks(w[i])]=-i-1;
}

int bm(char *w, char *t)
{
init_shifts(w);
int j,N=strlen(t),M=strlen(w);
for(i=M-1 , j=M-1; j >0; i-- , j--)
while(t[i]!=w[j])
{
 int x = shift[indeks(t[i])];
 if(M-j>x)
    i+=M-j;
 else
    i+=x;
 if (i>=N)
    return -1;
    j=M-1;
}
return i;
}

int main(int argc, char *argv[])
{
char *t="Z pamiętnika młodej lekarki";
cout << "Wynik poszukiwan = " << bm("lek",t) << endl;

return EXIT_SUCCESS;
}

 

to jest kod ....

Odnośnik do komentarza
Udostępnij na innych stronach

Witam

 

W funkcji void init_shifts(char *w) nie zauwazylem, zeby wartosc zmiennej k byla gdzies podana. Powoduje to, ze system bierze jakas wartosc losowa, ktora niekoniecznie jest sensowna.

 

Widzialem juz duzo podrecznikow programowania w C, ale takiej konstrukcji jeszcze w zadnym z nich nie widzialem:

for(i=M-1 , j=M-1; j >0; i-- , j--)

Moze jednak lepiej zrobic to normalnie i podzielic na dwie oddzielne petle.

 

Co do fragmentu return EXIT_SUCCESS;, to zamiast niego mozna po prostu napisac return 0;

 

Nie jestem pewien, czy to poprawi sytuacje, ale te fragmenty kodu uwazam za dziwne.

 

Tak z ciekawosci sie spytam: z jakiego podrecznika/kursu korzystasz uczac sie pisania w C??

 

Pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, poświęciłem chwilę na ten wątek. Co prawda u mnie żadnego naruszenia ble_ble nie ma, jednak jest to wynikiem czegoś innego i tym się sugerować nie można ;)

 

Być może systemowi nie podoba się któraś z definicji bibliotecznych, skompiluj z opcją -pedantic i poczytaj warningi.

Odnośnik do komentarza
Udostępnij na innych stronach

Cholera cały czas występuje naruszenie pamięci :(

Jeśli chodzi o komende -pedantic razem z kompilacją programu to nic nie pomaga.

 

Jeżeli zaś chodzi o

for(i=M-1 , j=M-1; j >0; i-- , j--)

 

to ja ten algorytm pisałem razem z książką to tam taka pętla była.

I dalej występuje naruszenie pamieci :(

Odnośnik do komentarza
Udostępnij na innych stronach

A nie można po prostu użyć do tego porządnego debugera? Jeśli mi coś takiego wyskakuje, to wrzucam program do ddd ( nakładka na gdb) i uruchamiam. Zazwyczaj ddd zatrzymuje się w miejscu gdzie jest babol. Ponadto kursor jest w miejscu gdzie jest babol. Praca u podstaw :-)

Odnośnik do komentarza
Udostępnij na innych stronach

A wstaw linijke:

cout << k << endl;

przed pierwsza instrukcja for w funkcji void init_shifts(char *w). Jesli wyswietlona liczba bedzie wieksza od 208, to masz odpowiedz na pytanie "gdzie jest blad?".

 

Ustanowiles wielkosc tablicy shift na 26*2*2*2+1=209 (o ile sie nie pomylilem), a potem przypisujesz wartosci tej tablicy az do elementu shift[k]. Jesli k jest za duze, to przekraczasz zakres tablicy i bardzo czesto skutkuje to wlasnie "Naruszeniem ochrony pamieci".

 

Zwracalem juz uwage na ten blad, ale bede sie go dalej czepial, bo uwazam, ze to jest przyczyna wywalania sie programu.

 

//EDIT: poprawilem wartosci liczb!

Edytowane przez KozaK
Odnośnik do komentarza
Udostępnij na innych stronach

HA HA Kozak masz racje :)

Wyświetlona liczba to: 134516744

 

i tak jak mówisz prawdopodobnie tu jest pie pogrzebany ...

Kolejnym błędem było to miejsce: case '': return 64; <- i zmniejszyłem wszystko o jeden.

 

A liczba 26*2*2*2+1=209

 

a jak próbuje zmienić np. na 25*2*2*2+6 = 206 to nic nie pomaga ...

 

Help me !!

Odnośnik do komentarza
Udostępnij na innych stronach

A liczba 26*2*2*2+1=209

 

a jak próbuje zmienić np. na 25*2*2*2+6 = 206 to nic nie pomaga ...

 

Help me !!

Nie bardzo wiem po co chcesz to koniecznie zmieniac na 206. Pisalem (_przecierz_ → przecież) ORT, ze moglem sie pomylic w liczeniu (w pamieci na szybko liczylem). 209 jest liczba rownie dobra jak 206. Co innego, gdybys przekroczyl zakres typu int,ale to jest dosc duza liczba - kilka rzedow wielkosci wieksza niz 209. Chodzi o to, zebys wreszcie przypisal jakas wartosc zmiennej k, taka ze max k bedzie mniejsze niz 209.

 

Prawde mowiac nie bardzo wiem do czego sluzy ta zmienna i jaka powinna miec wartosc.

 

Wiesz co? Tyle juz gadamy o tym programie i szukamy w nim bledow, ze moze w koncu sprobuje go przynajmniej u mnie na komputerze skompilowac, a nie szukac bledow tylko przegladajac kod.

 

Pozdrawiam

 

//EDIT: poprawilem wartosci liczb w poprzednim poscie - teraz przynajmniej nie wyglada to tak jakbym nie umial liczyc :P

Edytowane przez KozaK
Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...