Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Moze mala pomoc,oko pokazivaca,ne vidim gresku!

[es] :: C/C++ programiranje :: Moze mala pomoc,oko pokazivaca,ne vidim gresku!

[ Pregleda: 3787 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

IvanBeograd
Kladza
Beograd

Član broj: 83376
Poruke: 379
*.ppp-bg.sezampro.yu.

Sajt: www.dza-bu-drz-ne-daj.com


Profil

icon Moze mala pomoc,oko pokazivaca,ne vidim gresku!15.03.2006. u 22:05 - pre 219 meseci
Ne vidim gde je greska,f-ja brisi bi trebalo da obrise svaki znak iz stringa S koji odgovara bilo kom znaku u stringu T.
npr S="prva",T="drug", da neko novo N="pva"!Znam da je neka glupa greska,ali me je izmucila.

Code:

#include<stdio.h>

void brisi(char *s,char *t,char *v)
{
  for( ; *s!='\0' ; s++){
   for( ; *t!='\0' && *t!=*s ; t++);
    if(*t=='\0') *v++=*s;
   }
  *v='\0';
}

void main()
{
  char p[]="prva",d[]="drug",n[10];
  brisi(p,d,n);
  printf("Nova niska je : %s\n",n);

  getchar();
}


Hvala na odgovorima,pozdrav!
SERVIA NOSTRUM REGNUM!
 
Odgovor na temu

Pharos
Pančevo

Član broj: 20664
Poruke: 1029
80.93.240.*



+2 Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!15.03.2006. u 22:33 - pre 219 meseci
Greška je u drugoj for petlji.
Jednom dođeš do kraja niza i više se ne vraćaš na početak.
Probaj ovako:
Code:

#include<stdio.h>

void brisi(char *s,char *t,char *v)
{
    int pozicija = t;
  for( ; *s!='\0' ; s++){
   for(t=pozicija ; *t!='\0' && *t!=*s ; t++);
    if(*t=='\0') *v++=*s;
   }
  *v='\0';
}

void main()
{
  char p[]="prva",d[]="druag",n[10];
  brisi(p,d,n);
  printf("Nova niska je : %s\n",n);

  getchar();
}


[Ovu poruku je menjao Pharos dana 15.03.2006. u 23:42 GMT+1]
77 77 77 2E 65 73 6E 69 70 73 2E 63 6F 6D
 
Odgovor na temu

IvanBeograd
Kladza
Beograd

Član broj: 83376
Poruke: 379
*.adsl.sezampro.yu.

Sajt: www.dza-bu-drz-ne-daj.com


Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!15.03.2006. u 22:52 - pre 219 meseci
Cek malo,kako mozes da kazes :
Code:

 int pozicija = t;

???Mislim da to tvoje nece raditi!!!Ipak hvala na pokusaju!

SERVIA NOSTRUM REGNUM!
 
Odgovor na temu

Pharos
Pančevo

Član broj: 20664
Poruke: 1029
80.93.240.*



+2 Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!15.03.2006. u 23:00 - pre 219 meseci
Aj ti to lepo kompajliraj pa reci dal radi ili ne radi.
Malo pre sam objasnio zašto. Ako ti nije jasno, pokazacu ti na nekom prostijem primeru.

pOz
77 77 77 2E 65 73 6E 69 70 73 2E 63 6F 6D
 
Odgovor na temu

WEXY
Beograd

Član broj: 33948
Poruke: 163
*.smin.sezampro.yu.

ICQ: 166638118


+7 Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!15.03.2006. u 23:01 - pre 219 meseci
Code:
char *pozicija = t;


Mislim da je ovako korektnije i očiglednije.
"Nutri-matik je konstruisala i izradila Sirijuska kibernetska korporacija čije odeljenje za žalbe sada prekriva sve glavne kopnene mase prve tri planete zvezde Tau iz sistema Sirijusa"
 
Odgovor na temu

IvanBeograd
Kladza
Beograd

Član broj: 83376
Poruke: 379
*.smin.sezampro.yu.

Sajt: www.dza-bu-drz-ne-daj.com


Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!15.03.2006. u 23:10 - pre 219 meseci
Pa pogresio si covece ne mozes da mesas babe i zabe!
Code:

int pozicija = t;

pozicija je integer,a t je string!Necu ni da probam da kompajliram!Sta da mi expoldira racunar??? :-)
Hvala WEXY,radi!
Hvala puno na pomoci,kontam gde sam pogresio,pozzzz!

[Ovu poruku je menjao IvanBeograd dana 16.03.2006. u 00:11 GMT+1]
SERVIA NOSTRUM REGNUM!
 
Odgovor na temu

WEXY
Beograd

Član broj: 33948
Poruke: 163
*.smin.sezampro.yu.

ICQ: 166638118


+7 Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!15.03.2006. u 23:21 - pre 219 meseci
Um.. pa.., t nije string već pokazivač na char (sadrži adresu jednog podatka tipa char).
Radilo bi ti i ovo što je Pharos napisao međutim ne mora int da bude 4 bajta uvek (može da bude 2 ili 4 zavisno od kompajlera), a na 64bitnoj mašini, pošto se adresira sa 8bajtova ne možeš u int da smestiš celu adresu, zato je bolje da koristis ono što sam ja rekao čisto zbog portabilnosti, a i očiglednije je.

[Ovu poruku je menjao WEXY dana 16.03.2006. u 00:24 GMT+1]
"Nutri-matik je konstruisala i izradila Sirijuska kibernetska korporacija čije odeljenje za žalbe sada prekriva sve glavne kopnene mase prve tri planete zvezde Tau iz sistema Sirijusa"
 
Odgovor na temu

Pharos
Pančevo

Član broj: 20664
Poruke: 1029
80.93.240.*



+2 Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!16.03.2006. u 09:49 - pre 219 meseci
Ivane, Ivane...
Ne znam kako ja to mešam babe i žabe. Vidim da opet ne razumeš.
Ajde ipak da ti pojasnim.
s ti je niz karaktera {'p', 'r', 'v', 'a', '\0'}, jel tako?
t ti je niz karaktera {'d', 'r', 'u', 'g', '\0'}, jel tako?
Zatim imaš prvu for petlju koja se šeta kroz niz dok ne dođe do kraja niza (*s!='\0' pošto je 0 oznaka za kraj niza).
To si isto mogao napisati pomoću while petlje.
Code:

while(*s!='\0'){
// Ovde ide kod druge for petlje

s++;
}


Drugom for petljom ideš do kraja niza na isti način kao i prvom for petljom petljom.
To isto predstavljeno pomoću while petlje bi izgledalo ovako:
Code:

while(*t!='\0' && *t!=*s){
if(*t=='\0')*v++=*s;
t++;
}


Sad sve to zajedno izgleda ovako:

Code:

while(*s!='\0'){
while(*t!='\0' && *t!=*s){
if(*t=='\0')*v++=*s;
t++;
}
s++;
}


Kako to radi? Idemo korak po korak.
Prvo se pročita prvi karakter iz prvog niza. Zatim se pokreće druga while petlja. Iz druge petlje se išcitava karakter po karakter i ako se poklope 2 ista karakter vrši se "brisanje". Zašto pod znacima navoda? Pa zato što je drugi niz prazan. Novi element se dodaje iz niza s samo ako se taj isti element na nalazi u nizu t. Mislim da je to jasno.
E sad, pošto si završio sa drugom while petljom, vraćaš se na početak prve while petlje. Čita se sledeci element iz niza s i pokreće se druga while petlja. Kao što vidimo, pokazivač *t se nalazi na poslednjem elementu u nizu. U našem primeru to je slovo (karakter) g. I tako sve do kraja.

Izlaz programa je:
Code:

Nova niska je : prva

Dakle, niz je ne promenjen zato što se u nizu s na mestu prvog elementa u nizu ne nalazi elemnt koji jednak nekom od elemenata iz niza t, a na ostalim mestima u nizu s se ne nalazi ni jedan element koji je jednak poslednjem elementu u nizu t.
Probajmo na mesto poslednjeg elementa u nizu t staviti neki karakter iz niza s i uporedite rezultat.

U čemu je greška gorepomenutog koda? U tome što se pokretanjem druge while petlje, svaki put mora poći od početka niza, odnosno pogrešno je ispitivati samo poslednji element niza. Kako reći drugoj while petlji da počne s ispitivanjem od početka niza?
Pre pokretanja while petlje moramo zapamtiti adresu prvog elementa niza. To prosto uradimo ovako:
Code:

const long adresa = t;

Naš program bi izgledao ovako.
Code:

const long adresa = t;
while(*s!='\0'){
t = adresa;
while(*t!='\0' && *t!=*s){
if(*t=='\0')*v++=*s;
t++;
}
s++;
}


Sad sve to isto kompletirano i uradeno preko for petlji izgleda ovako:
Code:

#include<stdio.h>

void brisi(char *s,char *t,char *v)
{
    const long adresa = t;
  for( ; *s!='\0' ; s++){
   for(t=adresa; *t!='\0' && *t!=*s ; t++);
    if(*t=='\0') *v++=*s;
   }
  *v='\0';
}

void main()
{
  char p[]="prva",d[]="druag",n[10];
  brisi(p,d,n);
  printf("Nova niska je : %s\n",n);

  getchar();
}


Ako nekom i dalje nije jasno, predlažem da malo prelista Ricijevu knjigu programski jezik C, gde je odlično opisan rad s pointerima.

edit:

Namerno nije rađeno sa
char* adresa = t;
odnosno const char* adresa = t;
kako bi trebalo, već je odrađeno onako kako sam napisao.
Zašto? Čovek očigledno ne zna da barata sa pointerima. Poenta je da vidi kako to radi.
char *t;
*t je pokazivač na neki podatak tipa char, a samo t je adresa tog podatka u memoriji.
Prihvatam WEXY-jevu kritiku da ne radim sa int već sa long, međutim nikad nisam imao problema.
Radi savršeno, a uvek radim s jednim kompajlerom i na jednoj platformi, no ako ćemo ići u detalje... :D
Toliko od mene. Milsim da je dosta. Nauči ti to lepo, pa tek kad naučiš onda ispravljaj i reci da mešam babe i žabe.

pOz

[Ovu poruku je menjao Pharos dana 16.03.2006. u 11:14 GMT+1]
77 77 77 2E 65 73 6E 69 70 73 2E 63 6F 6D
 
Odgovor na temu

IvanBeograd
Kladza
Beograd

Član broj: 83376
Poruke: 379
*.adsl.sezampro.yu.

Sajt: www.dza-bu-drz-ne-daj.com


Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!16.03.2006. u 11:59 - pre 219 meseci
Ajde molim te iskompajliraj ono tvoje sto si prvo napisao,a moze i ovo drugo!
Mozda zato sto ja koristim borlandov c kompajler,a nece ni u trubo c-u da radi tvoj primer!
Kontam ja tebe sve!Ali ti mene ne kontas!Samo iskompajliraj!Ono sto je WEXY napisao to radi!
Hvala ti ipak puno,greska je bila moja!
SERVIA NOSTRUM REGNUM!
 
Odgovor na temu

Pharos
Pančevo

Član broj: 20664
Poruke: 1029
80.93.240.*



+2 Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!16.03.2006. u 12:34 - pre 219 meseci
Iskompajlirano pomoću VS 2003 i Dev C++ final version.
Zaključak, radi.
Naravno da je mnogo pravilnije ono što je napisao WEXY i tako se radi.
Kao što rekoh, namerno sam onako napisao da shvatiš šta se dešava i gde je greška.

77 77 77 2E 65 73 6E 69 70 73 2E 63 6F 6D
Prikačeni fajlovi
 
Odgovor na temu

IvanBeograd
Kladza
Beograd

Član broj: 83376
Poruke: 379
*.smin.sezampro.yu.

Sajt: www.dza-bu-drz-ne-daj.com


Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!16.03.2006. u 12:47 - pre 219 meseci
Pa kontam ja ono sve stp si napisao,greska je bila u for petlji,i pogresno sam se izrazio bio,a ne u sustini pokazivaca
i kretanja kroz for petlju!Jednostavno sam zaboravi da treba da zapamtim pocetnu poziciju,jer sam ranije radio to preko nizova,a ne preko pokazivaca!
Primer koji ne radi u borlandovom c builder-u,meni nista ne vredi ako on radi u VS 2003 i Dev C++.Meni koliko treba C,jeste samo onoliko,koliko,primere koje ja napisem,treba da rade u borlandovom c builder-u!
Zato sam ti i rekao da nemesas baba i zabe zato sto sam mislio da ne moze,a izgleda da moze! :)Nadam se da me sad kontas!Hvala puno na odgovorima!Pozdrav!

[Ovu poruku je menjao IvanBeograd dana 16.03.2006. u 13:56 GMT+1]
SERVIA NOSTRUM REGNUM!
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
..81.static.gus.vf.siwnet.net.

Sajt: dejan.lekic.org


+2 Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!16.03.2006. u 13:02 - pre 219 meseci
Ako zelite da sve radi kako valja, slusacete wexy-ja i staviti char *pozicija = t; tamo gde treba. :)

Sto se Pharaos-a tice:
Citat:

Namerno nije rađeno sa
char* adresa = t;
odnosno const char* adresa = t;
kako bi trebalo, već je odrađeno onako kako sam napisao.
Zašto? Čovek očigledno ne zna da barata sa pointerima. Poenta je da vidi kako to radi.
char *t;

Nakon citanja tvog koda on je jos vise bio zbunjen. Dakle taj pristup nije dobar iz bar dva razloga - prvi je taj sto covek nije nista naucio, samo je jos vise bio zbunjen, a drugi je da tvoj kod nece raditi svuda kako treba.

[Ovu poruku je menjao leka dana 16.03.2006. u 14:08 GMT+1]
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Pharos
Pančevo

Član broj: 20664
Poruke: 1029
80.93.240.*



+2 Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!16.03.2006. u 13:29 - pre 219 meseci
A jel ti čitaš malo?
Ponavljaš ono što je napisano već x puta.
Pišem zadnji put.
Ide char *pozicija=t; tamo gde treba. Tako bi trebalo da se radi jer je pravilnije.
Pokazivač vraćaš na početak niza i sve radi. Kompajleri se ne bune. Ja sam to uradio na drugi način koji se ne preporučuje i to sam naglasio u svakom postu. Sad što to neko kapira, a neko ne kapira, ili što jedan kompajler uredno kompajlira, a drugi ne, nije moj problem. Hteo sam čoveku da skrenem pažnju na algoritamsku grešku.
Uvek pišite char * pozicija = t, umesto const long int = t; U redu?

Izvinjavam se svima koje sam zbunio i one koji će zbog mene napustiti C! :D

edit:

Greške u mom kodu nema, samo što se tako ne bi trebalo raditi iz gorepomenutih razloga sa š kompajlerima.
Ako napišeš char *pozicija = t; Koji je pozicija tip podatka? I gde je greška?
A zašto jedan kompajler kompajlira uredno, a drugi ne, i koji kompajler je bliži standardu, a koji ne, mislim da nije tema ovog posta.


[Ovu poruku je menjao Pharos dana 16.03.2006. u 14:43 GMT+1]
77 77 77 2E 65 73 6E 69 70 73 2E 63 6F 6D
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
..81.static.gus.vf.siwnet.net.

Sajt: dejan.lekic.org


+2 Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!16.03.2006. u 13:54 - pre 219 meseci
To sto se nesto moze iskompajlirati bez greske ne znaci da greske ne moze biti...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

darkon
Darko Novakovic
Istrazivac, IMP
Beograd

Član broj: 13647
Poruke: 166
*.rcub.bg.ac.yu.

Jabber: darkon@elitesecurity.org


+1 Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!17.03.2006. u 09:49 - pre 219 meseci
Čemu dve for petlje?
Funkcija radi sasvim lepo i ovako:
Code:
void brisi(char *s, char *t, char *v)
{
  for( ; *s!='\0'; s++, t++)
    if(*s!=*t)
        *v++=*s;
  *v='\0';
}


[Ovu poruku je menjao darkon dana 17.03.2006. u 10:51 GMT+1]
"Verovatno da preko nje mnoge sile kontrolišu mnogo šta..." - GANDOR
"Kada bi ljudski mozak bio tako jednostavan da bismo mogli da ga shvatimo, onda bismo mi bili toliko glupi da ga ipak ne bismo mogli shvatiti."
 
Odgovor na temu

WEXY
Beograd

Član broj: 33948
Poruke: 163
*.smin.sezampro.yu.

ICQ: 166638118


+7 Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!20.03.2006. u 23:25 - pre 219 meseci
Ne radi sasvim lepo jer ne upoređuje svaki znak iz prvog stringa sa svakim znakom iz drugog stringa. Upoređuje samo tekuće karaktere.

Za ulazne podatke p[] = "psva" i d[] = "vsua" dobija se "pv", a treba samo "p".
"Nutri-matik je konstruisala i izradila Sirijuska kibernetska korporacija čije odeljenje za žalbe sada prekriva sve glavne kopnene mase prve tri planete zvezde Tau iz sistema Sirijusa"
 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
*.powernet.bg.

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: Moze mala pomoc,oko pokazivaca,ne vidim gresku!21.03.2006. u 15:58 - pre 219 meseci
Pamcenje char* je moguce sa long int (ako se bas mora) i ostalim sredstvima koja raspolazu istom ili vecom kolicinom memorije ali zasto kada je najprostiji char* lepo dostupan. Inace preporucujem koriscenje const:

Code:
void brisi(const char *s,const char *t,char *v)
{
    const char *tt;
    
    while(*s)
    {
        for(tt=t;*tt;tt++)
        {
            if(*tt == *s) break;
        }

        if(!*tt)
        {
            *(v++) = *s;
        }

        s++;
    }

    *v = 0;
}

Ipak se ++uje.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Moze mala pomoc,oko pokazivaca,ne vidim gresku!

[ Pregleda: 3787 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.