Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

program (zadatak)
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
zrinka
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 27. 06. 2006. (20:33:54)
Postovi: (7F)16
Spol: žensko
Sarma = la pohva - posuda
-73 = 10 - 83
Lokacija: Grad Zagreb

PostPostano: 20:40 sri, 5. 7. 2006    Naslov: program Citirajte i odgovorite

Ako bi mi netko mogao objasniti sljedeći program (naredbu po naredbu) i što se ispisuje? :?: :roll:

#include<stdio.h>
main(){
int x=2; y=5;
void z(int*, int*);
z(&x, &y);
printf("x=%d, y=%d\n", x, y);
}
void z(int*a, int*b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}

:happycow:
Ako bi mi netko mogao objasniti sljedeći program (naredbu po naredbu) i što se ispisuje? Question Rolling Eyes

#include<stdio.h>
main(){
int x=2; y=5;
void z(int*, int*);
z(&x, &y);
printf("x=%d, y=%d\n", x, y);
}
void z(int*a, int*b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}

Krava pleshe



_________________
ZRINKA
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
petrich
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 11. 2005. (22:23:35)
Postovi: (F6)16
Spol: žensko
Sarma = la pohva - posuda
18 = 20 - 2

PostPostano: 8:21 čet, 6. 7. 2006    Naslov: Citirajte i odgovorite

[quote="zrinka"]Ako bi mi netko mogao objasniti sljedeći program (naredbu po naredbu) i što se ispisuje? [/quote]
probat cu. :wink:
krenimo od f-ije:
[code:1]
void z(int*a, int*b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
[/code:1]
[code:1]void z(int*a, int*b){[/code:1]
znaci to je f-ije koju smo nazvali z. koja prima dva pokazivaca(odnosno dvije adrese) na int, a ne vraca nista u glavni program :shock: . znaci samo obavi neku radnju (btw ova ce zamjenit vrijednosti x i y). :wink:
[code:1]int temp;[/code:1]
deklarirali smo jedan pomocni int, da ne bi izgubili vrijednost jedne od varijabli koje hocemo zamjeniti.
[code:1]temp=*a;[/code:1]
prvo u tog pomocnog spremimo vrijednost koja je spremljena na adresi od a. [b]*[/b] znaci da uzimamo bas vrijednost koja se nalazi na toj adresi.
[code:1] *a=*b;[/code:1]
u ono sto pokazuje a, spremi ono sto pokazuje b.
[code:1]*b=temp;[/code:1]
i na kraju u b spremi ono sto je u pomocnom,a to je bas ono sto je na pocetku bilo u a. 8)
a sad program:
[code:1] int x=2; y=5;[/code:1]
pretpostavljam da je tu trebao biti ',' izmedju x i y, jer ovak kak si ti napisala, ne znamo sta je y(y nije deklariran). dakle [code:1]int x=2, y=5;[/code:1] postavlja vrijednosti 2 za x i 5 za y.
[code:1]void z(int*, int*);[/code:1]
moram priznat da nisam ziher dal to nesto uopce radi. :-k
mozda je to zato sto je f-ija nakon maina? ja inace stavim sve f-ije na vrh, a main na kraj pa to bas i ne koristim.. ;)
[code:1]z(&x, &y);[/code:1]
ovime pozivas f-iju z i dajes joj adrese od x i y. da joj nisi poslala adrese, vec vrijednosti, f-ija ne bi znala gdje staviti zamjenjene vrijednosti.
[code:1]printf("x=%d, y=%d\n", x, y);[/code:1]
na kraju ispisujes na ekran x=5 y=2. jer su sad, nakon izlaska iz f-ije njihove vrijednosti zamjenjene.
prodjimo jos jednom kroz f-iju z sa konkretno onime sto si joj poslala, dakle adresu od x i adresu od y:
[code:1]void z(int*a, int*b){ /*stavi da a pokazuje na x i da b pokazuje na y*/
int temp; /* deklariramo neki pomocni int*/
temp=*a; /*tom pomocnom pridruzimo ono sto se nalazi na mjestu na koje pokazuje a, a to je x=2, znaci temp=2*/
*a=*b; /* *a=5 */
*b=temp; /* *b=2 */
}[/code:1]
zrinka (napisa):
Ako bi mi netko mogao objasniti sljedeći program (naredbu po naredbu) i što se ispisuje?

probat cu. Wink
krenimo od f-ije:
Kod:

void z(int*a, int*b){
 int temp;
 temp=*a;
 *a=*b;
*b=temp;
}

Kod:
void z(int*a, int*b){

znaci to je f-ije koju smo nazvali z. koja prima dva pokazivaca(odnosno dvije adrese) na int, a ne vraca nista u glavni program Shocked . znaci samo obavi neku radnju (btw ova ce zamjenit vrijednosti x i y). Wink
Kod:
int temp;

deklarirali smo jedan pomocni int, da ne bi izgubili vrijednost jedne od varijabli koje hocemo zamjeniti.
Kod:
temp=*a;

prvo u tog pomocnog spremimo vrijednost koja je spremljena na adresi od a. * znaci da uzimamo bas vrijednost koja se nalazi na toj adresi.
Kod:
 *a=*b;

u ono sto pokazuje a, spremi ono sto pokazuje b.
Kod:
*b=temp;

i na kraju u b spremi ono sto je u pomocnom,a to je bas ono sto je na pocetku bilo u a. Cool
a sad program:
Kod:
 int x=2; y=5;

pretpostavljam da je tu trebao biti ',' izmedju x i y, jer ovak kak si ti napisala, ne znamo sta je y(y nije deklariran). dakle
Kod:
int x=2, y=5;
postavlja vrijednosti 2 za x i 5 za y.
Kod:
void z(int*, int*);

moram priznat da nisam ziher dal to nesto uopce radi. Think
mozda je to zato sto je f-ija nakon maina? ja inace stavim sve f-ije na vrh, a main na kraj pa to bas i ne koristim.. Wink
Kod:
z(&x, &y);

ovime pozivas f-iju z i dajes joj adrese od x i y. da joj nisi poslala adrese, vec vrijednosti, f-ija ne bi znala gdje staviti zamjenjene vrijednosti.
Kod:
printf("x=%d, y=%d\n", x, y);

na kraju ispisujes na ekran x=5 y=2. jer su sad, nakon izlaska iz f-ije njihove vrijednosti zamjenjene.
prodjimo jos jednom kroz f-iju z sa konkretno onime sto si joj poslala, dakle adresu od x i adresu od y:
Kod:
void z(int*a, int*b){   /*stavi da a pokazuje na x i da b pokazuje na  y*/
 int temp;      /* deklariramo neki pomocni int*/
 temp=*a;    /*tom pomocnom pridruzimo ono sto se nalazi na mjestu na  koje pokazuje a, a to je x=2, znaci temp=2*/
 *a=*b;        /*  *a=5  */
 *b=temp;     /*  *b=2  */
}




Zadnja promjena: petrich; 6:43 pet, 7. 7. 2006; ukupno mijenjano 1 put.
[Vrh]
Korisnički profil Pošaljite privatnu poruku
renata
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 26. 11. 2005. (20:25:12)
Postovi: (71)16
Sarma = la pohva - posuda
14 = 21 - 7

PostPostano: 13:33 čet, 6. 7. 2006    Naslov: Citirajte i odgovorite

Da ne otvaram novu temu, stavljam ovdje jedan riješeni zadatak koji mi nikako ne radi. Ako se nekome da potražiti grešku i objasniti, bila bih jako zahvalna.
Zadatak je sa roka 27.rujna 2004.
znak ! se prevodi u A,kombinacija ! i # u U (samo # se ne prevodi)
treba napisati funkciju koja prima string rijec od gornjih znakova (!,#)i prevodi ga. Rijec ne smije biti promijenjena, a za novi string treba alocirati tocno onoliko memorije koliko je potrebno.Ako rijec ne znamo prevesti, funkcija treba vratiti string ne znam.

#include <stdio.h>
#include<malloc.h>

char *prijevod(char *rijec){
char *novi,*ili="ne znam";
int br=0;

while (*rijec!='\0'){
if (*rijec=='!' && *(rijec+1)=='#'){
br++;
rijec=rijec+2;
}
else if (*rijec=='!' && *(rijec+1)!='#'){
br++;
rijec++;
}
else return ili;

}
novi=(char*)malloc((br+1)*sizeof(char));
while (*rijec!='\0'){
if (*rijec=='!' && *(rijec+1)=='#'){
*(novi)='U';
rijec=rijec+2;
}
else if (*rijec=='!' && *(rijec+1)!='#'){
*(novi)='A';
rijec++;
}
novi++;
}
return novi;
}

int main(){
char string[1000];

printf("ucitaj string: ");
gets(string);

printf("%s",prijevod(string));

scanf("%%");
return 0;
}
Da ne otvaram novu temu, stavljam ovdje jedan riješeni zadatak koji mi nikako ne radi. Ako se nekome da potražiti grešku i objasniti, bila bih jako zahvalna.
Zadatak je sa roka 27.rujna 2004.
znak ! se prevodi u A,kombinacija ! i # u U (samo # se ne prevodi)
treba napisati funkciju koja prima string rijec od gornjih znakova (!,#)i prevodi ga. Rijec ne smije biti promijenjena, a za novi string treba alocirati tocno onoliko memorije koliko je potrebno.Ako rijec ne znamo prevesti, funkcija treba vratiti string ne znam.

#include <stdio.h>
#include<malloc.h>

char *prijevod(char *rijec){
char *novi,*ili="ne znam";
int br=0;

while (*rijec!='\0'){
if (*rijec=='!' && *(rijec+1)=='#'){
br++;
rijec=rijec+2;
}
else if (*rijec=='!' && *(rijec+1)!='#'){
br++;
rijec++;
}
else return ili;

}
novi=(char*)malloc((br+1)*sizeof(char));
while (*rijec!='\0'){
if (*rijec=='!' && *(rijec+1)=='#'){
*(novi)='U';
rijec=rijec+2;
}
else if (*rijec=='!' && *(rijec+1)!='#'){
*(novi)='A';
rijec++;
}
novi++;
}
return novi;
}

int main(){
char string[1000];

printf("ucitaj string: ");
gets(string);

printf("%s",prijevod(string));

scanf("%%");
return 0;
}


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3557)16
Spol: zombi
Sarma = la pohva - posuda
852 = 1066 - 214
Lokacija: /sbin/init

PostPostano: 14:07 čet, 6. 7. 2006    Naslov: Citirajte i odgovorite

[quote="renata"] char *novi,*ili="ne znam";[/quote]

Ovo ne smijes napraviti, jer je [tt]ili[/tt] pointer na [tt]char[/tt] kojem nisi dala memoriju ([tt]malloc()[/tt]). :ccc:

Ne smijes staviti niti naizgled dobru varijantu: [tt]char ili[9] = "ne znam"[/tt] (pogodi zasto ne smijes ;) hint: stvar je u [tt]return[/tt]-u). :)

[quote="renata"] while (*rijec!='\0'){
if (*rijec=='!' && *(rijec+1)=='#'){
*(novi)='U';
rijec=rijec+2;
}
else if (*rijec=='!' && *(rijec+1)!='#'){
*(novi)='A';
rijec++;
}
novi++;
}
return novi;
}[/quote]

Sto vracas kao [tt]novi[/tt]? :-k Adresu nakon zadnjeg znaka u tom stringu?! :shock: Treba:
1. [tt]*novi = '\0';[/tt]
2. [tt]return novi - br;[/tt]

:w
renata (napisa):
char *novi,*ili="ne znam";


Ovo ne smijes napraviti, jer je ili pointer na char kojem nisi dala memoriju (malloc()). Ccc.... Sram te bilo...

Ne smijes staviti niti naizgled dobru varijantu: char ili[9] = "ne znam" (pogodi zasto ne smijes Wink hint: stvar je u return-u). Smile

renata (napisa):
while (*rijec!='\0'){
if (*rijec=='!' && *(rijec+1)=='#'){
*(novi)='U';
rijec=rijec+2;
}
else if (*rijec=='!' && *(rijec+1)!='#'){
*(novi)='A';
rijec++;
}
novi++;
}
return novi;
}


Sto vracas kao novi? Think Adresu nakon zadnjeg znaka u tom stringu?! Shocked Treba:
1. *novi = '\0';
2. return novi - br;

Wave



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Gost






PostPostano: 16:22 čet, 6. 7. 2006    Naslov: Citirajte i odgovorite

Rjesavala sam drugi zadatak grupe C,al neznam sto mi je krivo
:roll:
(pr. za string "Dosao 1 Perica u 12 sati." funkcija treba vratiti
".itas 21 u acire 1 oaso" )


#include<stdio.h>
#include<malloc.h>

char *pero(char *src){

int i=0,j,d,z=0;
char *rez;

while(src[i]!='\0') i++;
d=i;

for(j=0;j<i;j++)
if(('A'<=src[j]) && (src[j]<='Z'))d--;

rez=(char *)malloc((d+1)*sizeof(char));

for(j=i;j>0;j--)
if(('A'<=src[j]) && (src[j]<='Z'))
continue;
else rez[z]=src[j--];

rez[d]='\0';

return rez;
}
Rjesavala sam drugi zadatak grupe C,al neznam sto mi je krivo
Rolling Eyes
(pr. za string "Dosao 1 Perica u 12 sati." funkcija treba vratiti
".itas 21 u acire 1 oaso" )


#include<stdio.h>
#include<malloc.h>

char *pero(char *src){

int i=0,j,d,z=0;
char *rez;

while(src[i]!='\0') i++;
d=i;

for(j=0;j<i;j++)
if(('A'⇐src[j]) && (src[j]⇐'Z'))d–;

rez=(char *)malloc((d+1)*sizeof(char));

for(j=i;j>0;j–)
if(('A'⇐src[j]) && (src[j]⇐'Z'))
continue;
else rez[z]=src[j–];

rez[d]='\0';

return rez;
}


[Vrh]
mdoko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12)
Postovi: (71A)16
Spol: muško
Sarma = la pohva - posuda
199 = 237 - 38
Lokacija: Heriot-Watt University, Edinburgh

PostPostano: 17:01 čet, 6. 7. 2006    Naslov: Citirajte i odgovorite

[quote="vsego"][quote="renata"] char *novi,*ili="ne znam";[/quote]

Ovo ne smijes napraviti, jer je [tt]ili[/tt] pointer na [tt]char[/tt] kojem nisi dala memoriju ([tt]malloc()[/tt]). :ccc:
[/quote]
Koliko god to cudno zvucalo, ali - [i]vsego nisi u pravu[/i] :shock:

Ako se napise [code:1]char *s = "nesto"[/code:1] kompajler ce alocirati memorijski prostor potreban za pohranu stringa [tt]nesto[/tt], te ce postaviti pointer [tt]s[/tt] da pokazuje na pocetak tog stringa.

Ovo vrijedi samo prilikom inicijalizacije, tj.
[code:1]
char *s;
s = "nesto";
[/code:1]
nije ispravno jer memorija nije alocirana. Cak i da je alocirana, ovakvo pridruzivanje nije dozvoljeno, nego je potrebno koristiti funkciju [tt]strcpy[/tt].
vsego (napisa):
renata (napisa):
char *novi,*ili="ne znam";


Ovo ne smijes napraviti, jer je ili pointer na char kojem nisi dala memoriju (malloc()). Ccc.... Sram te bilo...

Koliko god to cudno zvucalo, ali - vsego nisi u pravu Shocked

Ako se napise
Kod:
char *s = "nesto"
kompajler ce alocirati memorijski prostor potreban za pohranu stringa nesto, te ce postaviti pointer s da pokazuje na pocetak tog stringa.

Ovo vrijedi samo prilikom inicijalizacije, tj.
Kod:

char *s;
s = "nesto";

nije ispravno jer memorija nije alocirana. Cak i da je alocirana, ovakvo pridruzivanje nije dozvoljeno, nego je potrebno koristiti funkciju strcpy.



_________________
Extraordinary claims require extraordinary evidence. – Carl Sagan
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
petrich
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 11. 2005. (22:23:35)
Postovi: (F6)16
Spol: žensko
Sarma = la pohva - posuda
18 = 20 - 2

PostPostano: 17:14 čet, 6. 7. 2006    Naslov: Citirajte i odgovorite

[code:1]for(j=i;j>0;j--)
if(('A'<=src[j]) && (src[j]<='Z'))
continue;
else rez[z]=src[j--]; [/code:1]

malo ti prepravih ovaj dio, sad radi 8) :
[code:1]
for(j=i-1;j>=0;j--){
if(('A'<=src[j]) && (src[j]<='Z')) continue;
else {
rez[z]=src[j];
printf("%c",rez[z]);
z++;
}
} [/code:1]
1. greska ti je bila sto si u for petlji izasla iz granica stringa.
2. falile su ti {} za for petlju.
3. za else-> ne trebas pomicati j, njega pomices for petljom, ali zato trebas pomaknuti z, jer inace ga on uvijek sprema u istog.
btw. ovaj printf sam stavila da vidim kaj ce ispisat. ;)

ostalo je ok. :ok:
Kod:
for(j=i;j>0;j--)         
if(('A'<=src[j]) && (src[j]<='Z'))
               continue;
         else rez[z]=src[j--]; 


malo ti prepravih ovaj dio, sad radi Cool :
Kod:

for(j=i-1;j>=0;j--){
           if(('A'<=src[j]) && (src[j]<='Z')) continue;
           else {
                rez[z]=src[j];
                printf("%c",rez[z]);
                z++;
           }
     }

1. greska ti je bila sto si u for petlji izasla iz granica stringa.
2. falile su ti {} za for petlju.
3. za else→ ne trebas pomicati j, njega pomices for petljom, ali zato trebas pomaknuti z, jer inace ga on uvijek sprema u istog.
btw. ovaj printf sam stavila da vidim kaj ce ispisat. Wink

ostalo je ok. O-kay!


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Gost






PostPostano: 19:21 čet, 6. 7. 2006    Naslov: Citirajte i odgovorite

Taman kad sam pomislio da nesto znam shvatio sam da sam na pocetku
:oops: :oops:
Naime u kodu

#include <stdio.h>
#include <string.h>

char *f(char *p){
static char s[20]={0};
strcpy(s,p);
return s;
}
int main(){
char *s=f("ABC");
printf("%s\n",s);
s=f("XY");
printf("%s\n",s+1);
scanf("%");
return 0;
}
nije mi jasno, ako je staticka lokalna varijabla,kako je ona vidljiva u funkciji main,i zar se ne bi trebala inicijalizirati samo prilikom prvog ulaska u blok?Vec dugo listam predavanja i skriptu prof. Juraka, ali izgleda da sam nesto krivo interpretirao,stoga ako mi netko moze molim vas objasniti sto se tocno dogadja u ovom zadatku tj.kako i kamo se pohranjuje string pri pozivu funkcije f :oops: :roll:
Taman kad sam pomislio da nesto znam shvatio sam da sam na pocetku
Embarassed Embarassed
Naime u kodu

#include <stdio.h>
#include <string.h>

char *f(char *p){
static char s[20]={0};
strcpy(s,p);
return s;
}
int main(){
char *s=f("ABC");
printf("%s\n",s);
s=f("XY");
printf("%s\n",s+1);
scanf("%");
return 0;
}
nije mi jasno, ako je staticka lokalna varijabla,kako je ona vidljiva u funkciji main,i zar se ne bi trebala inicijalizirati samo prilikom prvog ulaska u blok?Vec dugo listam predavanja i skriptu prof. Juraka, ali izgleda da sam nesto krivo interpretirao,stoga ako mi netko moze molim vas objasniti sto se tocno dogadja u ovom zadatku tj.kako i kamo se pohranjuje string pri pozivu funkcije f Embarassed Rolling Eyes


[Vrh]
petrich
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 11. 2005. (22:23:35)
Postovi: (F6)16
Spol: žensko
Sarma = la pohva - posuda
18 = 20 - 2

PostPostano: 19:50 čet, 6. 7. 2006    Naslov: Citirajte i odgovorite

[quote="Anonymous"]
nije mi jasno, ako je staticka lokalna varijabla,kako je ona vidljiva u funkciji main,i zar se ne bi trebala inicijalizirati samo prilikom prvog ulaska u blok?[/quote]
pa ona i nije bas lokalna varijabla, bas zbog tog static, ona se inicijalizira samo prilikom prvog ulaska u blok,i ostaje joj ta vrijednost.
mozda te zbunjuje sto ti ispisuje:
ABC
Y
to je zato sto u f-iji koristis strcpy(a,b), koji izbrise ono sto je u a :shock: i 'kopira' ono iz b u a. znaci kad drugi put zoves f-iju u s-u ti je 'ABC', ali strcpy to izbrise i spremi 'XY' u s. 8)
[quote]
kako i kamo se pohranjuje string pri pozivu funkcije f :oops: :roll:[/quote]
pa, tvoja f-ija vraca pokazivac na string, a to pridruzujes s-u u glavnom programu, tj. s ti sad pokazuje isto na taj string. 8)

hint. probaj:
1. strcpy zamjenit sa strcat, da vidis sta ce se dogodit (strcat(a,b) u a, na kraj doda b).
2. u 2.printf ostavi samo s
uglavnom, poigraj se malo s tim da vidis kak ti programcic dise. ;)

Edit: imas nesto o tom static-u u vjezbama 44_fibonacci_static.c i u singerovim predavanjima (br 9.) njih imas na http://web.math.hr/~singer/
Anonymous (napisa):

nije mi jasno, ako je staticka lokalna varijabla,kako je ona vidljiva u funkciji main,i zar se ne bi trebala inicijalizirati samo prilikom prvog ulaska u blok?

pa ona i nije bas lokalna varijabla, bas zbog tog static, ona se inicijalizira samo prilikom prvog ulaska u blok,i ostaje joj ta vrijednost.
mozda te zbunjuje sto ti ispisuje:
ABC
Y
to je zato sto u f-iji koristis strcpy(a,b), koji izbrise ono sto je u a Shocked i 'kopira' ono iz b u a. znaci kad drugi put zoves f-iju u s-u ti je 'ABC', ali strcpy to izbrise i spremi 'XY' u s. Cool
Citat:

kako i kamo se pohranjuje string pri pozivu funkcije f Embarassed Rolling Eyes

pa, tvoja f-ija vraca pokazivac na string, a to pridruzujes s-u u glavnom programu, tj. s ti sad pokazuje isto na taj string. Cool

hint. probaj:
1. strcpy zamjenit sa strcat, da vidis sta ce se dogodit (strcat(a,b) u a, na kraj doda b).
2. u 2.printf ostavi samo s
uglavnom, poigraj se malo s tim da vidis kak ti programcic dise. Wink

Edit: imas nesto o tom static-u u vjezbama 44_fibonacci_static.c i u singerovim predavanjima (br 9.) njih imas na http://web.math.hr/~singer/




Zadnja promjena: petrich; 20:04 čet, 6. 7. 2006; ukupno mijenjano 1 put.
[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3557)16
Spol: zombi
Sarma = la pohva - posuda
852 = 1066 - 214
Lokacija: /sbin/init

PostPostano: 22:04 čet, 6. 7. 2006    Naslov: Citirajte i odgovorite

[quote="mdoko"]Ako se napise [code:1]char *s = "nesto"[/code:1] kompajler ce alocirati memorijski prostor potreban za pohranu stringa [tt]nesto[/tt], te ce postaviti pointer [tt]s[/tt] da pokazuje na pocetak tog stringa.[/quote]

:shock: Taj comipler zna nesto i sam napraviti?! :shock: :lol:

Hvala na ispravci; mislio sam da to radi samo za [tt]char x[...] = "..."[/tt]. :oops:
mdoko (napisa):
Ako se napise
Kod:
char *s = "nesto"
kompajler ce alocirati memorijski prostor potreban za pohranu stringa nesto, te ce postaviti pointer s da pokazuje na pocetak tog stringa.


Shocked Taj comipler zna nesto i sam napraviti?! Shocked Laughing

Hvala na ispravci; mislio sam da to radi samo za char x[...] = "...". Embarassed



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
venovako
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 11. 2002. (22:46:38)
Postovi: (2F9)16
Sarma = la pohva - posuda
56 = 65 - 9

PostPostano: 22:57 čet, 6. 7. 2006    Naslov: Citirajte i odgovorite

[quote="mdoko"][code:1]char *s;
s = "nesto";[/code:1]
nije ispravno jer memorija nije alocirana. Cak i da je alocirana, ovakvo pridruzivanje nije dozvoljeno, nego je potrebno koristiti funkciju [tt]strcpy[/tt].[/quote]

Ne bih bas isao s tako strogim nedozvoljavanjem.
Ispravi me ako grijesim, no nisu li string konstante dostupne citavo vrijeme i, do na vidljivost, u citavom tijelu programa (tj. ne sprema li ih kompajler u neku readonly sekciju)?

Kada bi gornji kod deklarirao [tt]s[/tt] kao [tt]const char*[/tt], bio bi perfektno legalan dok god netko ne bi pozelio preko [tt]s[/tt]-a pisati po stringu "nesto", ali receni string ne bi ispario nakon izlaska iz bloka:
[code:1]#include <stdio.h>
#include <stdlib.h>

static const char *nesto(void) {
const char *s;
s = "Hm...";
return s;
}

int main(void) {
printf("%s\n", nesto());
return EXIT_SUCCESS;
}[/code:1]

Naravno, lako je zaboraviti se i poceti pisati po readonly memoriji, pa je zgodno ipak stvari kopirati, kako si i napomenuo.

[size=10]edit: primjer i detalji[/size]
mdoko (napisa):
Kod:
char *s;
s = "nesto";

nije ispravno jer memorija nije alocirana. Cak i da je alocirana, ovakvo pridruzivanje nije dozvoljeno, nego je potrebno koristiti funkciju strcpy.


Ne bih bas isao s tako strogim nedozvoljavanjem.
Ispravi me ako grijesim, no nisu li string konstante dostupne citavo vrijeme i, do na vidljivost, u citavom tijelu programa (tj. ne sprema li ih kompajler u neku readonly sekciju)?

Kada bi gornji kod deklarirao s kao const char*, bio bi perfektno legalan dok god netko ne bi pozelio preko s-a pisati po stringu "nesto", ali receni string ne bi ispario nakon izlaska iz bloka:
Kod:
#include <stdio.h>
#include <stdlib.h>

static const char *nesto(void) {
  const char *s;
  s = "Hm...";
  return s;
}

int main(void) {
  printf("%s\n", nesto());
  return EXIT_SUCCESS;
}


Naravno, lako je zaboraviti se i poceti pisati po readonly memoriji, pa je zgodno ipak stvari kopirati, kako si i napomenuo.

edit: primjer i detalji


[Vrh]
Korisnički profil Pošaljite privatnu poruku
mdoko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12)
Postovi: (71A)16
Spol: muško
Sarma = la pohva - posuda
199 = 237 - 38
Lokacija: Heriot-Watt University, Edinburgh

PostPostano: 8:33 pet, 7. 7. 2006    Naslov: Citirajte i odgovorite

[quote="venovako"]
Ne bih bas isao s tako strogim nedozvoljavanjem.
Ispravi me ako grijesim, no nisu li string konstante dostupne citavo vrijeme i, do na vidljivost, u citavom tijelu programa (tj. ne sprema li ih kompajler u neku readonly sekciju)?
[/quote]
U pravu si. Nisam htio komplicirati, ali kao obicno pojednostavljivanje vodi nepreciznosti. :-)
venovako (napisa):

Ne bih bas isao s tako strogim nedozvoljavanjem.
Ispravi me ako grijesim, no nisu li string konstante dostupne citavo vrijeme i, do na vidljivost, u citavom tijelu programa (tj. ne sprema li ih kompajler u neku readonly sekciju)?

U pravu si. Nisam htio komplicirati, ali kao obicno pojednostavljivanje vodi nepreciznosti. Smile



_________________
Extraordinary claims require extraordinary evidence. – Carl Sagan
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
Hiroaki
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 16. 11. 2002. (23:50:56)
Postovi: (D)16
Sarma = la pohva - posuda
= 1 - 0

PostPostano: 18:38 pon, 24. 7. 2006    Naslov: Citirajte i odgovorite

[quote="venovako"]
Kada bi gornji kod deklarirao [tt]s[/tt] kao [tt]const char*[/tt], bio bi perfektno legalan dok god netko ne bi pozelio preko [tt]s[/tt]-a pisati po stringu "nesto", ali receni string ne bi ispario nakon izlaska iz bloka...
[/quote]

Sve bi bilo dobro da nije sramne odluke iz nastanka C-a kojom se dozvoljava preusmjeravanje non-const pointera na string literal...
venovako (napisa):

Kada bi gornji kod deklarirao s kao const char*, bio bi perfektno legalan dok god netko ne bi pozelio preko s-a pisati po stringu "nesto", ali receni string ne bi ispario nakon izlaska iz bloka...


Sve bi bilo dobro da nije sramne odluke iz nastanka C-a kojom se dozvoljava preusmjeravanje non-const pointera na string literal...



_________________
Sin:"Tata, šta je to rekurzija?"
Otac:"Rekurzija."
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan