www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Spreminjanje zunanjega niza v funkciji

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
sortaj
Član
Član



Pridružen-a: Sre 23 Jul 2008 21:51
Prispevkov: 812
Aktiv.: 3.95
Kraj: Med Vipavo in Štanjelom

PrispevekObjavljeno: Pon Avg 27, 2012 11:07 pm    Naslov sporočila:  Spreminjanje zunanjega niza v funkciji Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
RUros
Član
Član



Pridružen-a: Čet 09 Mar 2006 22:26
Prispevkov: 1031
Aktiv.: 4.39

PrispevekObjavljeno: Pon Avg 27, 2012 11:33 pm    Naslov sporočila:   Odgovori s citatom

Č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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
sortaj
Član
Član



Pridružen-a: Sre 23 Jul 2008 21:51
Prispevkov: 812
Aktiv.: 3.95
Kraj: Med Vipavo in Štanjelom

PrispevekObjavljeno: Pon Avg 27, 2012 11:39 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
xfce
Član
Član



Pridružen-a: Čet 28 Jul 2011 8:06
Prispevkov: 521
Aktiv.: 3.08

PrispevekObjavljeno: Tor Avg 28, 2012 12:32 am    Naslov sporočila:   Odgovori s citatom

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 Smile
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Tor Avg 28, 2012 1:20 am    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
sdomen
Član
Član



Pridružen-a: Pet 10 Jul 2009 13:09
Prispevkov: 11
Aktiv.: 0.06
Kraj: Ljubljana

PrispevekObjavljeno: Tor Avg 28, 2012 8:27 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 3.04
Kraj: Ljubljana

PrispevekObjavljeno: Tor Avg 28, 2012 8:29 am    Naslov sporočila:   Odgovori s citatom

Ž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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
RUros
Član
Član



Pridružen-a: Čet 09 Mar 2006 22:26
Prispevkov: 1031
Aktiv.: 4.39

PrispevekObjavljeno: Tor Avg 28, 2012 4:43 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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