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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2006-03-29 13:41:14

  adi - Użytkownik

adi
Użytkownik
Zarejestrowany: 2006-03-29

przekazanie wskaznika do funkcji

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

 

#2  2006-03-29 15:51:30

  sznury - Członek DUG

sznury
Członek DUG
Skąd: Trzebnica
Zarejestrowany: 2005-10-27

Re: przekazanie wskaznika do funkcji

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

 

#3  2006-03-29 16:04:32

  etilen - Użytkownik

etilen
Użytkownik
Skąd: Gdańsk
Zarejestrowany: 2005-11-21

Re: przekazanie wskaznika do funkcji

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

 

#4  2006-03-31 02:05:24

  adi - Użytkownik

adi
Użytkownik
Zarejestrowany: 2006-03-29

Re: przekazanie wskaznika do funkcji

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

 

#5  2006-04-04 12:35:05

  adi - Użytkownik

adi
Użytkownik
Zarejestrowany: 2006-03-29

Re: przekazanie wskaznika do funkcji

Juz jest OK. Problemem jednak bylo to ze czesci nie wiedzialem => czesci nie rozumialem. Jednak kurs ze stronki nie zastapi lektury dobrej ksiazki :(.

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)