Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Witam,
Gdzie ponizej jest blad?
01:main()
02:{
03: char *aaa,bbb[MAX];
04: int iii;
05: iii=fun1(aaa,bbb,"xyz","zyx");
06:}
07:
08:int fun1(char *a,char *b,char *c,char *d)
09:{
10: char *a_tmp,*e_tmp;
11: int i;
12: a=b+strlen(c);
13: a_tmp=a;
14: e_tmp=ststr(b,d);
15: return i=fun2(a_tmp,e_tmp-2);
16:}
17:
18:int fun2(char *a,char *b)
19:{
20: int i=0;
21: while(a!=b)
22: {
23: a++;
24: i++;
25: }
26: return i;
27:}
Przy kompilacji gcc nic nie pokazuje, natomiast przy uruchomieniu "Naruszenie ochrony pamięci".
Jakas podpowiedz bo juz nie wiem o co chodzi, chyba problemem jest przekazanie do funkcji wskaznikow do napisow, ale nie wiem jak to rozwiazac. Gdy kod funkcji fun1 umieszczony jest w main wszystko dziala OK.
ZMIANA 30.04.2006 23:50 - dodalem numeracje wierszy aby bylo wygodniej
Offline
Witam,
int fun1(char *a,char *b,char *c,char *d)
{
char *a_tmp,*e_tmp;
int i;
a=b+strlen(c);
a_tmp=a;
e_tmp=ststr(b,d);
return i=fun2(a_tmp,e_tmp-2);
}
int fun2(char *a,char *b)
{
int i=0;
while(a!=b)
{
a++;
i++;
}
return i;
}
Przy kompilacji gcc nic nie pokazuje, natomiast przy uruchomieniu "Naruszenie ochrony pamięci".
Jakas podpowiedz bo juz nie wiem o co chodzi, chyba problemem jest przekazanie do funkcji wskaznikow do napisow, ale nie wiem jak to rozwiazac. Gdy kod funkcji fun1 umieszczony jest w main wszystko dziala OK.
Wywala sie za kazdym razem, niezaleznie co bedzie w bbb ?
A co zwroci fun1 jak nie znajdzie w lanuchu przechowywanym w tablicy bbb lancucha wskazywanego przez d ? NULL oczywiscie.
return i=fun2(a_tmp,e_tmp-2) wiec co bedzie z tym wywolaniem ?
Offline
Hej
Kolejno
> a=b+strlen(c);
zakaładam że MAX >strlen(c) bo jak nie to masz wyciek pamięci.
> e_tmp=ststr(b,d);
> return i=fun2(a_tmp,e_tmp-2);
Czy nie miałeś na myśli strstr()?
Jeśli w b nie ma podciągu d to do e_tmp wędruje NULL. Wtedy e_tmp-2 daje Ci ujemny adress. Hmm paskudne przeadresowanie, nie chciałbym mieć czegoś takiego w domu.
Pozrdawiam
Offline
to sznury:
>A co zwroci fun1 jak nie znajdzie w lanuchu przechowywanym w tablicy bbb lancucha wskazywanego przez d ? NULL oczywiscie.
Jezeli dochodzi do wywolania funkcji fun1 to NA PEWNO w tablicy bbb jest substring d jak rowniez i c.
>return i=fun2(a_tmp,e_tmp-2) wiec co bedzie z tym wywolaniem ?
W rzeczywistosci mialem i mam:
return i=fun2(a_tmp,e_tmp);
Sorki za wprowadzenie w blad - to z pospiechu :(.
to etilen:
>zakaładam że MAX >strlen(c) bo jak nie to masz wyciek pamięci.
Tak tu dobrze zakladasz. Tym zajmuje sie wczesniej instrukcja warunkowa.
>Czy nie miałeś na myśli strstr()?
Tak. W wierszu 14 jest strstr(b,d). Sorry za pomylke.
>return i=fun2(a_tmp,e_tmp-2);
j/w
Male wyjasnienie:
fun2(a_tmp,e_tmp); - zwraca ilosc elementow z zakresu podanego w argumentach.
fun1(aaa,bbb,"xyz","zyx"); - zwraca to samo co fun2() ;), ale jej zadaniem najwazniejszym jest odpowiednie ustawienie wskaznika aaa
aaa - jest wskaznikiem do poczatku ciagu znakow ktory mnie interesuje(o dlugosc zwracanej przez fun1())
bbb - tablica ciagu znakow o dlugosci MAX
c - ciag znakow zawarty NA PEWNO w bbb(mozna to okreslic jako lewy margines ciagu aaa)
d - ciag znakow zawarty NA PEWNO w bbb(prawy margines)
Po wykonaniu fun1() chcialbym zeby aaa wskazywalo mi na element(pierwszy mnie interesujacy) w tablicy bbb, ale tak nie jest.
Miedzy wierszem W11 a W12 wsk. "a" ma taka wartosc jak wsk. "aaa" przed wywolaniem funkcji.
Miedzy wierszen W14 a W15 wsk. "a" ma zmieniona wartosc, czyli do tego momentu jest tak jak chcialbym zeby bylo.
A po zakonczeniu fun2 wsk "aaa" ma wartosc jak na poczatku. A mialem nadzieje ze bedzie zmieniony.
Jeszcze sprawdze dzisiaj tablice wskaznikow do char. Ale czy fun2() dzialala by poprawnie. Albo czegos nie rozumiem albo o czyms nie wiem.
Offline
Juz jest OK. Problemem jednak bylo to ze czesci nie wiedzialem => czesci nie rozumialem. Jednak kurs ze stronki nie zastapi lektury dobrej ksiazki :(.
Offline