 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
sortaj Član


Pridružen-a: Sre 23 Jul 2008 21:51 Prispevkov: 812 Aktiv.: 3.95 Kraj: Med Vipavo in Štanjelom
|
Objavljeno: Pon Avg 27, 2012 11:07 pm Naslov sporočila: Spreminjanje zunanjega niza v funkciji |
|
|
Pozdravljeni!
Zadnjo uro me muči naslednja zadeva. Rad bi napisal funkcijo, ki bi prejela znakovni niz in ga poljubno spremenila. Da pojasnim natančneje:
Koda: |
void funkcija(char *zbirka)//Funkcija, ki na primer v niz zbirka vpiše "Serbus!".
{
//Tisto, kar mi manjka
}
|
Funkcijo bi nato klical:
Koda: |
char niz[]="Stajerski pozdrav!";
funkcija(niz);
izpisi(niz); //Na primer izpiše "Serbus!"
|
Nekako se ne morem domisliti, kako to narediti na kratko.
Znam samo z "uporabo sile":
Koda: |
void funkcija(char *zbirka)
{
char zacasna_zbirka[]="Serbus!";
int stevec=0;
for(; zacasna_zbirka[stevec]!=0; stevec++)
{
zbirka[stevec]=zacasna_zbirka[stevec];
}
}
|
Vsaj pričakoval bi, da se da bolj na kratko.
Pogledal sem v dve knjigi(O programiranju mikroračunalnikov v C-ju) in nisem našel odgovora.
Kakšni predlogi?
lp _________________ Svet je bil analogen, dokler ni Planck vsega zafrknil... |
|
Nazaj na vrh |
|
 |
RUros Član


Pridružen-a: Čet 09 Mar 2006 22:26 Prispevkov: 1031 Aktiv.: 4.39
|
Objavljeno: Pon Avg 27, 2012 11:33 pm Naslov sporočila: |
|
|
Če bi delal s kazalci tudi drugje v programu, potem lahko samo spremniš kazalec na drugi niz. Se pravi v tvoji funkciji samo dodeliš nov naslov kam naj kazalec kaže. |
|
Nazaj na vrh |
|
 |
sortaj Član


Pridružen-a: Sre 23 Jul 2008 21:51 Prispevkov: 812 Aktiv.: 3.95 Kraj: Med Vipavo in Štanjelom
|
Objavljeno: Pon Avg 27, 2012 11:39 pm Naslov sporočila: |
|
|
Pozdravljen!
Ne razumem te najbolje...
Torej tistemu nizu "Serbus!" spreminjam naslov?
Nekako tako?
Koda: |
void funkcija(char *zbirka)
{
char zbirka[]="Serbus!";
niz=zbirka;
}
|
Ker ta način ne deluje...
Lahko malo bolj pojasniš, kaj si mislil?
lp _________________ Svet je bil analogen, dokler ni Planck vsega zafrknil... |
|
Nazaj na vrh |
|
 |
xfce Član

Pridružen-a: Čet 28 Jul 2011 8:06 Prispevkov: 521 Aktiv.: 3.08
|
Objavljeno: Tor Avg 28, 2012 12:32 am Naslov sporočila: |
|
|
Nekako se ne morem domisliti, kako to narediti na kratko.
Znam samo z "uporabo sile":
Koda: |
void funkcija(char *zbirka)
{
char zacasna_zbirka[]="Serbus!";
int stevec=0;
for(; zacasna_zbirka[stevec]!=0; stevec++)
{
zbirka[stevec]=zacasna_zbirka[stevec];
}
}
|
Pomojem ne gre drugače. Sicer bi lahko še ponostavil zanko za kopiranje. Lahko pogledaš kako je v string.h narejena funkcija strcpy... .Ubistvo lahko za kopiranje stringa uporabiš funkcijo Strcpy();
http://faculty.edcc.edu/paul.bladek/c_string_functions.htm
RUros je pa vrjetno mislil pointer na pointer. Kjer lahko spreminjaš naslov pointerja, da ta kaže na drug niz  |
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Tor Avg 28, 2012 1:20 am Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
sdomen Član

Pridružen-a: Pet 10 Jul 2009 13:09 Prispevkov: 11 Aktiv.: 0.06 Kraj: Ljubljana
|
Objavljeno: Tor Avg 28, 2012 8:27 am Naslov sporočila: |
|
|
Imaš več možnosti, prva je:
Koda: |
void funckcija(char *zbirka)
{
char zacasna_zbirka[] = "Serbus!";
strncpy(zbirka, zacasna_zbirka, sizeof(zacasna_zbirka));
}
|
Druga je zelo podobna, le da namesto strncpy uporabiš memcpy:
Koda: |
void funckcija(char *zbirka)
{
char zacasna_zbirka[] = "Serbus!";
memcpy(zbirka, zacasna_zbirka, sizeof(zacasna_zbirka));
}
|
Tretja, meni najlubša, ker je časovno najmanj potratna je:
Definiraj globalno začasno zbirko, ker kakor je omenil že Kroko, lokalnih variabel ne moreš pošiljati ven iz funkcije.
Koda: |
char *zacasna_zbirka = "Serbus!"; |
Funkcija naj izgleda tako:
Koda: |
void funckcija(char **zbirka)
{
*zbirka = zacasna_zbirka;
}
|
Nato kličeš funkcijo na nasleden način:
Koda: |
char *niz = "stajerski pozdrav";
funckcija(&niz); |
Upam, da je bilo v pomoč, če ne pa prašaj za kako detjlno razlago.
LP
Nazadnje urejal/a sdomen Tor Avg 28, 2012 8:30 am; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
gregoral Član

Pridružen-a: Pet 24 Nov 2006 9:42 Prispevkov: 688 Aktiv.: 3.04 Kraj: Ljubljana
|
Objavljeno: Tor Avg 28, 2012 8:29 am Naslov sporočila: |
|
|
Živjo!
Funkcija ki jo iščeš je strcpy, strncpy ali memcpy odvisno od primera.
Ampak primer kot si ga zastavil je problematičen:
1) kot parameter si uporabil samo kazalec torej znotraj funkcije ne veš koliko znakov lahko vpišeš na to lokacijo.
(če dolžine nikoli ne boš povečal to morda ni problem, v nasprotnem primeru moraš prenesti tudi dolžino)
2) v primeru si v funkcijo prenesel naslov konstantnega niza znakov.
Odvisno od operacijskega sistema in prevajalnika je možno da je ta del pomnilnika zaščiten pred pisanjem! (program se bo nepričakovano končal)
3) če imaš sledečo kodo:
Koda: |
char osebaA[]="ime osebe";
char osebaB[]="ime osebe";
funkcija(osebaA); |
Ti bo klic funkcije (če bo uspel) zelo verjetno spremenil obe spremenljivki, saj kažeta na isto lokacijo v pomnilniku.
Tako na hitro nekaj pripomb.
LP, Gregor |
|
Nazaj na vrh |
|
 |
RUros Član


Pridružen-a: Čet 09 Mar 2006 22:26 Prispevkov: 1031 Aktiv.: 4.39
|
Objavljeno: Tor Avg 28, 2012 4:43 pm Naslov sporočila: |
|
|
Kot so že povedali pred mano. Lokalne spremenljivke ne boš mogel pošiljati ven, zato moraš definirati globalne nize. V tvojem primeru je en niz že takšen.
Se pravi ustvariš dva niza:
char test_prvi[]="prvi";
char test_drugi[]="drugi";
Nato ustvariš dva kazalca, ki bosta kazala na niza:
char *ptr_1, *ptr_2;
Dodeliš jima naslov nizov:
ptr_1=test_prvi; //kar pomeni da kaže na prvi element v tem nizu, in je isto kot: ptr_1=&test_prvi[0].
ptr_2=test_drugi;
V kodi uporabljaš ptr_1 za klicanje posameznih elemenotv niza ali celega niza, npr:
znak= *ptr_1; //vrne prvi znak v nizu test_prvi, torej "p"
znak= *(ptr_1+1); //vrne drugi znak v nizu test_prvi, torej "r"
Kot sem te razumel, hočeš ti prvemu nizu spremeniti vrednosti. Če je to ustrezno potem lahko ptr_1, ki ga uporabljaš v programu, spremeniš naslov tako, da bo kazal na drugi niz z željenimi vrednostmi:
ptr_1=ptr_2;
ali brez uporabe drugega kazalca:
ptr_1=test_drugi; |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|