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

Fje i adrese
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
Novi
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 17. 07. 2007. (12:08:32)
Postovi: (11F)16
Spol: muško
Sarma = la pohva - posuda
60 = 69 - 9

PostPostano: 1:21 ned, 20. 1. 2008    Naslov: Fje i adrese Citirajte i odgovorite

Zanima me jedna mala (po meni) anomalijica u C-u s pokazivacima. Ako koristimo prijenos varijable po adresi u fju onda ju pozivamo npr. fja(&q). A u deklaraciji fje pisemo void fja(int *p) kao u primjeru. [code:1]#include<stdio.h>
#include<stdlib.h>
void fja(int *p)
{
*p=9;
return;
}
int main (void)
{
int q=14;
fja(&q);
printf("%d\n",q);
system("pause");
return 0;
}[/code:1]
Eh sada... Mi saljemo adresu varijable q u fju (jer koristimo &), a ona to prenosi cjelobrojnoj varijabli *p. Zar ne bi bilo logicno da adresu pridruzimo adresi tj. samom p-u? Znam da se to kosi s onim sto *p kao tip int mora biti deklarirana u zaglavlju fje ali...
Zanima me jedna mala (po meni) anomalijica u C-u s pokazivacima. Ako koristimo prijenos varijable po adresi u fju onda ju pozivamo npr. fja(&q). A u deklaraciji fje pisemo void fja(int *p) kao u primjeru.
Kod:
#include<stdio.h>
#include<stdlib.h>
void fja(int *p)
{
    *p=9;
    return;
}
int main (void)
{
    int q=14;
    fja(&q);
    printf("%d\n",q);
    system("pause");
    return 0;
}

Eh sada... Mi saljemo adresu varijable q u fju (jer koristimo &), a ona to prenosi cjelobrojnoj varijabli *p. Zar ne bi bilo logicno da adresu pridruzimo adresi tj. samom p-u? Znam da se to kosi s onim sto *p kao tip int mora biti deklarirana u zaglavlju fje ali...


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


Pridružen/a: 19. 01. 2005. (14:15:23)
Postovi: (157)16
Spol: kućni ljubimac
Sarma = la pohva - posuda
62 = 85 - 23
Lokacija: Happily traveling through space since 1986!

PostPostano: 2:10 ned, 20. 1. 2008    Naslov: Re: Fje i adrese Citirajte i odgovorite

[quote="Novi"]Zanima me jedna mala (po meni) anomalijica u C-u s pokazivacima. Ako koristimo prijenos varijable po adresi u fju onda ju pozivamo npr. fja(&q). A u deklaraciji fje pisemo void fja(int *p) kao u primjeru. [code:1]#include<stdio.h>
#include<stdlib.h>
void fja(int *p)
{
*p=9;
return;
}
int main (void)
{
int q=14;
fja(&q);
printf("%d\n",q);
system("pause");
return 0;
}[/code:1]
Eh sada... Mi saljemo adresu varijable q u fju (jer koristimo &), a ona to prenosi cjelobrojnoj varijabli *p. Zar ne bi bilo logicno da adresu pridruzimo adresi tj. samom p-u? Znam da se to kosi s onim sto *p kao tip int mora biti deklarirana u zaglavlju fje ali...[/quote]Tehnički gledano tako se to i događa. Pokazivač je na 32 bitnoj arhitekturi uvijek broj od 32 bita koji adresira memoriju. Tako da int*p je interno broj ali ti označavaš u kodu sa int* da bi [b]tebi[/b] bilo razumljivije tako da ti znaš da to nije neka varijabla već adresa [b]prave[/b] varijable.

Interno će kompajler pravilno dodijeliti adrese (lea instrukcija) ali tebi izgleda logičnije. Ili sam krivo shvatio.
Novi (napisa):
Zanima me jedna mala (po meni) anomalijica u C-u s pokazivacima. Ako koristimo prijenos varijable po adresi u fju onda ju pozivamo npr. fja(&q). A u deklaraciji fje pisemo void fja(int *p) kao u primjeru.
Kod:
#include<stdio.h>
#include<stdlib.h>
void fja(int *p)
{
    *p=9;
    return;
}
int main (void)
{
    int q=14;
    fja(&q);
    printf("%d\n",q);
    system("pause");
    return 0;
}

Eh sada... Mi saljemo adresu varijable q u fju (jer koristimo &), a ona to prenosi cjelobrojnoj varijabli *p. Zar ne bi bilo logicno da adresu pridruzimo adresi tj. samom p-u? Znam da se to kosi s onim sto *p kao tip int mora biti deklarirana u zaglavlju fje ali...
Tehnički gledano tako se to i događa. Pokazivač je na 32 bitnoj arhitekturi uvijek broj od 32 bita koji adresira memoriju. Tako da int*p je interno broj ali ti označavaš u kodu sa int* da bi tebi bilo razumljivije tako da ti znaš da to nije neka varijabla već adresa prave varijable.

Interno će kompajler pravilno dodijeliti adrese (lea instrukcija) ali tebi izgleda logičnije. Ili sam krivo shvatio.



_________________
-- space available for rent --
[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


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

PostPostano: 11:49 ned, 20. 1. 2008    Naslov: Citirajte i odgovorite

Mislim da si krivo shvatio sto muci Novog. :)

Deklaracija
[tt]void fja(int *p)[/tt]
[b]NE[/b] znaci "imas jedan parametar [tt][color=red]*[/color]p[/tt] koji je tipa [tt]int[/tt]", nego "imas jedan parametar [tt]p[/tt] koji je tipa [tt]int*[/tt]". :) Dakle, kao da pise
[tt]void fja(int* p)[/tt]
Dapace, i smijes tako pisati, mada se to ne radi iz drugih razloga. :?

Kad pozoves [tt]fja(&q);[/tt], racunalo ce adresu od [tt]q[/tt] poslati kao parametar funkciji koja ocekuje upravo adresu od [tt]int[/tt] (tj. [tt]int*[/tt]) i tu adresu ce pospremiti u varijablu [tt]p[/tt]. 8)

Jesam li pogodio sto pitas? :D

P.S. Zasto ne pisemo [tt]int* x[/tt]? :-s Simply zato jer bi onda [tt]int* x, y[/tt] (obicna deklaracija varijabli; ne funkcijski argumenti) izgledalo kao da su i [tt]x[/tt] i [tt]y[/tt] pointeri, sto je krivo (samo [tt]x[/tt] je pointer; [tt]y[/tt] je "obicni" [tt]int[/tt]). :)
:idea: Ako ti je tako lakse, smijes pisati i [tt]int * x[/tt] (dakle, razmaci i lijevo i desno od [tt]x[/tt]). :)
Mislim da si krivo shvatio sto muci Novog. Smile

Deklaracija
void fja(int *p)
NE znaci "imas jedan parametar *p koji je tipa int", nego "imas jedan parametar p koji je tipa int*". Smile Dakle, kao da pise
void fja(int* p)
Dapace, i smijes tako pisati, mada se to ne radi iz drugih razloga. Confused

Kad pozoves fja(&q);, racunalo ce adresu od q poslati kao parametar funkciji koja ocekuje upravo adresu od int (tj. int*) i tu adresu ce pospremiti u varijablu p. Cool

Jesam li pogodio sto pitas? Very Happy

P.S. Zasto ne pisemo int* x? Eh? Simply zato jer bi onda int* x, y (obicna deklaracija varijabli; ne funkcijski argumenti) izgledalo kao da su i x i y pointeri, sto je krivo (samo x je pointer; y je "obicni" int). Smile
Idea Ako ti je tako lakse, smijes pisati i int * x (dakle, razmaci i lijevo i desno od x). Smile



_________________
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
Novi
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 17. 07. 2007. (12:08:32)
Postovi: (11F)16
Spol: muško
Sarma = la pohva - posuda
60 = 69 - 9

PostPostano: 12:01 ned, 20. 1. 2008    Naslov: Citirajte i odgovorite

Pa reci cemo da je jasnije. :wink:
Iako bi mi vise logike imalo kad bi u ovom tvom primjeru int* x, y; obje deklariralo kao pointere na intove :?
Pa reci cemo da je jasnije. Wink
Iako bi mi vise logike imalo kad bi u ovom tvom primjeru int* x, y; obje deklariralo kao pointere na intove Confused


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


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

PostPostano: 13:13 ned, 20. 1. 2008    Naslov: Citirajte i odgovorite

Na prvu loptu, i meni je bilo logicnije, ali...

1. Kako bi onda tretirao deklaraciju bez razmaka, i.e. [tt]int*x,y;[/tt]? :-k Je l' kao [tt]int* x, y;[/tt] ili kao [tt]int *x, y;[/tt]? :?

2. Kad bi se razlikovale deklaracije [tt]int* x, y;[/tt] i [tt]int *x, y;[/tt], stvar bi bila ubitacna za debugiranje... :(

Jasno, mozes reci "neka [tt]int *x, y;[/tt] uvijek znaci [i]dva pointera na [tt]int[/tt][/i]", no onda imas slicnu nelogicnost, ali kompliciraniju deklaraciju (ne mozes istom naredbom deklarirati [tt]int[/tt]-ove i pointere na [tt]int[/tt]-ove), a i izraz [tt]int x, *y;[/tt] postaje besmislen (i.e. imas manju expresivnost). :?

Tako da, nakon ponesto godina druzenja sa C-om, moram se sloziti s time da je ovako najbolje (ako se vec ide na implicitnu deklaraciju). :)
Na prvu loptu, i meni je bilo logicnije, ali...

1. Kako bi onda tretirao deklaraciju bez razmaka, i.e. int*x,y;? Think Je l' kao int* x, y; ili kao int *x, y;? Confused

2. Kad bi se razlikovale deklaracije int* x, y; i int *x, y;, stvar bi bila ubitacna za debugiranje... Sad

Jasno, mozes reci "neka int *x, y; uvijek znaci dva pointera na int", no onda imas slicnu nelogicnost, ali kompliciraniju deklaraciju (ne mozes istom naredbom deklarirati int-ove i pointere na int-ove), a i izraz int x, *y; postaje besmislen (i.e. imas manju expresivnost). Confused

Tako da, nakon ponesto godina druzenja sa C-om, moram se sloziti s time da je ovako najbolje (ako se vec ide na implicitnu deklaraciju). Smile



_________________
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
Novi
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 17. 07. 2007. (12:08:32)
Postovi: (11F)16
Spol: muško
Sarma = la pohva - posuda
60 = 69 - 9

PostPostano: 13:45 ned, 20. 1. 2008    Naslov: Citirajte i odgovorite

Zar ne bi rjesilo probleme kad bi zabranili deklaraciju [tt]int *p[/tt] i jednostavno uveli [tt]int*[/tt] kao tip za sebe odvojen od obicnog int-a koji bi deklarirao pointer na cijelobrojnu varijablu time bi (valjda? :? )bile izbjegnute sve nejednoznacnosti. Pa ako ne smijem napisati [tt]inta;[/tt] zasto bi bilo dozvoljeno i [tt]int*a;[/tt] :roll:
Zar ne bi rjesilo probleme kad bi zabranili deklaraciju int *p i jednostavno uveli int* kao tip za sebe odvojen od obicnog int-a koji bi deklarirao pointer na cijelobrojnu varijablu time bi (valjda? Confused )bile izbjegnute sve nejednoznacnosti. Pa ako ne smijem napisati inta; zasto bi bilo dozvoljeno i int*a; Rolling Eyes


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


Pridružen/a: 29. 05. 2006. (22:51:14)
Postovi: (121)16
Sarma = la pohva - posuda
23 = 34 - 11

PostPostano: 17:27 ned, 20. 1. 2008    Naslov: Citirajte i odgovorite

[quote="Novi"]Zar ne bi rjesilo probleme kad bi... jednostavno uveli [tt]int*[/tt] kao tip za sebe odvojen od obicnog int-a koji bi deklarirao pointer na cijelobrojnu varijablu time bi (valjda? :? )bile izbjegnute sve nejednoznacnosti.[/quote]

Pa to je i napravljeno. Odnosno pointer na integer jest prica za sebe.
No kad bi bas napravili bas kako si predlozio, onda bi imao problem svaki put kad bi napravio neki novi tip i zelio uhvatiti pointer na njega.
Primjerice napravis tip [tt]wilson[/tt] i onda bi kako napravio pointer na njega? Tesko. Ne bi bilo dovoljno napisati [tt]wilson *p[/tt], nego bi morao stvarati novi tip kojem bi kako objasnio da je pointer na vec napravljeni tip? Veoma tesko.

Mislim da je sve skupa ovo diskusija oko kozmetike.
Novi (napisa):
Zar ne bi rjesilo probleme kad bi... jednostavno uveli int* kao tip za sebe odvojen od obicnog int-a koji bi deklarirao pointer na cijelobrojnu varijablu time bi (valjda? Confused )bile izbjegnute sve nejednoznacnosti.


Pa to je i napravljeno. Odnosno pointer na integer jest prica za sebe.
No kad bi bas napravili bas kako si predlozio, onda bi imao problem svaki put kad bi napravio neki novi tip i zelio uhvatiti pointer na njega.
Primjerice napravis tip wilson i onda bi kako napravio pointer na njega? Tesko. Ne bi bilo dovoljno napisati wilson *p, nego bi morao stvarati novi tip kojem bi kako objasnio da je pointer na vec napravljeni tip? Veoma tesko.

Mislim da je sve skupa ovo diskusija oko kozmetike.


[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: 21:21 ned, 20. 1. 2008    Naslov: Citirajte i odgovorite

Danas se manje vise svi slazu da je nacin deklariranja pointera zbunjujuc, ali sjetite se da to potjece iz vremena kada se je na ekranu moglo prikazati 24 linije, te takvo ponasanje kod deklariranja pointera bilo jako korisno sa stanovista ustede prostora na ekranu.

Danas se tome lako doskoci. Naime, :bow: Bjarne Stroustrup :wob: preporuca da se kao dobar stil programiranja usvoji pravilo da se na jednoj liniji nikada ne deklarira vise od jedne varijable.

Ako se prihvatii gore spomenuti prijedlog, onda se bez mogucnosti zabune mogu pisati deklaracije kao sto je npr. [tt]double* p;[/tt] IMO takve deklaracije su puno citljivije i informativnije, kao sto je puno citljivija deklaracija [tt]int* foo(int* a, int* b);[/tt], nego sto je to [tt]int *foo(int *a, int *b);[/tt]
Danas se manje vise svi slazu da je nacin deklariranja pointera zbunjujuc, ali sjetite se da to potjece iz vremena kada se je na ekranu moglo prikazati 24 linije, te takvo ponasanje kod deklariranja pointera bilo jako korisno sa stanovista ustede prostora na ekranu.

Danas se tome lako doskoci. Naime, I bow before you Bjarne Stroustrup Bow to the left preporuca da se kao dobar stil programiranja usvoji pravilo da se na jednoj liniji nikada ne deklarira vise od jedne varijable.

Ako se prihvatii gore spomenuti prijedlog, onda se bez mogucnosti zabune mogu pisati deklaracije kao sto je npr. double* p; IMO takve deklaracije su puno citljivije i informativnije, kao sto je puno citljivija deklaracija int* foo(int* a, int* b);, nego sto je to int *foo(int *a, int *b);



_________________
Extraordinary claims require extraordinary evidence. – Carl Sagan
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
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