Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Gost
|
|
[Vrh] |
|
veky Forumaš(ica)

Pridružen/a: 09. 12. 2002. (19:59:43) Postovi: (5B0)16
Lokacija: negdje daleko...
|
Postano: 21:50 ned, 29. 8. 2004 Naslov: Re: Fja koja vraca polje |
|
|
[quote="Anonymous"]Pozdrav,
imam problema s programom koji unutar maina ucitava dva polja tipa double, dim 3. Treba pozvati fju koja kao argumente prima ta dva polja. Fja vraca novo polje koje je vektorski produkt prva dva.
Ja mislim da fja treba vratit pokazivac na prvi elemenet novog polja....da li bi se moglo napisati fju i t.d. vraca adresu prvog elementa polja?
Ja imam vise verzija ovog zadatka, koji nakon kompajliranja ne izabacuju niti warninge niti errore, ali mi isto tako:) niti jedan ne radi...
Da li bi mi netko mogao napisati prototip fje i njezin poziv u mainu uz neka pojasnjenja...ako ne i cijeli zadatak :lol:
Puno hvala...[/quote]
Kostur programa je ovo:
[code:1]
#include <stdio.h>
double* vp(double v[],double w[]){
double* u=(double*)malloc(3*sizeof(double));
u[0]=u[1]=u[2]=0;
return u;
}
int main(){
double a[3],b[3],*c;
scanf("%lf %lf %lf %lf %lf %lf",a,a+1,a+2,b,b+1,b+2);
c=vp(a,b);
printf("[%lf,%lf,%lf]\n",c[0],c[1],c[2]);
return 0;
}
[/code:1]
Vjerujem da sad znaš kako ga treba dopuniti da radi ono što treba.
HTH,
Anonymous (napisa): | Pozdrav,
imam problema s programom koji unutar maina ucitava dva polja tipa double, dim 3. Treba pozvati fju koja kao argumente prima ta dva polja. Fja vraca novo polje koje je vektorski produkt prva dva.
Ja mislim da fja treba vratit pokazivac na prvi elemenet novog polja....da li bi se moglo napisati fju i t.d. vraca adresu prvog elementa polja?
Ja imam vise verzija ovog zadatka, koji nakon kompajliranja ne izabacuju niti warninge niti errore, ali mi isto tako:) niti jedan ne radi...
Da li bi mi netko mogao napisati prototip fje i njezin poziv u mainu uz neka pojasnjenja...ako ne i cijeli zadatak
Puno hvala... |
Kostur programa je ovo:
Kod: |
#include <stdio.h>
double* vp(double v[],double w[]){
double* u=(double*)malloc(3*sizeof(double));
u[0]=u[1]=u[2]=0;
return u;
}
int main(){
double a[3],b[3],*c;
scanf("%lf %lf %lf %lf %lf %lf",a,a+1,a+2,b,b+1,b+2);
c=vp(a,b);
printf("[%lf,%lf,%lf]\n",c[0],c[1],c[2]);
return 0;
}
|
Vjerujem da sad znaš kako ga treba dopuniti da radi ono što treba.
HTH,
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
|
[Vrh] |
|
veky Forumaš(ica)

Pridružen/a: 09. 12. 2002. (19:59:43) Postovi: (5B0)16
Lokacija: negdje daleko...
|
|
[Vrh] |
|
Gea Forumaš(ica)

Pridružen/a: 29. 08. 2004. (20:59:52) Postovi: (5)16
|
Postano: 10:40 pon, 30. 8. 2004 Naslov: |
|
|
Veky, puno hvala...zapravo mislim da sam imala takvu verrziju zadatka, samo mi iz nekog razloga nije radila.
Sto se tice segine intervencije, moram priznati da sam ono namjerno napisala...a nije mi se dalo tipkarat sve kaj mislim....Dakle, pokazivac na polje i adresa prvog elem. polja su zapravo iste stvari ( rezultat je isti), ali ne treba mjesati tj. ne moze se zakljuciti da su opcenito pokazivaci i adrese jedno te isto...pokazivac je varijabla koja sadrzi adresu, kaj ne? Tak da razlika postoji...molim da me netko ispravi ak nesto nisam tocno napisala...thx
E da...fja ciji je prototip double* vp(double v[],double w[]){
opcenito vraca kao vrijednost pokazivac na tip double, zar ne? ...mislim da je na usmenom to tocnije reci nego da vraca adresu prvog...a veky je zapravo za tocniju varijantu napisao obrnuto, hmmm :roll:
Veky, puno hvala...zapravo mislim da sam imala takvu verrziju zadatka, samo mi iz nekog razloga nije radila.
Sto se tice segine intervencije, moram priznati da sam ono namjerno napisala...a nije mi se dalo tipkarat sve kaj mislim....Dakle, pokazivac na polje i adresa prvog elem. polja su zapravo iste stvari ( rezultat je isti), ali ne treba mjesati tj. ne moze se zakljuciti da su opcenito pokazivaci i adrese jedno te isto...pokazivac je varijabla koja sadrzi adresu, kaj ne? Tak da razlika postoji...molim da me netko ispravi ak nesto nisam tocno napisala...thx
E da...fja ciji je prototip double* vp(double v[],double w[]){
opcenito vraca kao vrijednost pokazivac na tip double, zar ne? ...mislim da je na usmenom to tocnije reci nego da vraca adresu prvog...a veky je zapravo za tocniju varijantu napisao obrnuto, hmmm
_________________ The world is an ugly, bad dream and all night long you can hear me scream...
|
|
[Vrh] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
ZELENIZUBNAPLANETIDO SADE Forumaš(ica)


Pridružen/a: 04. 03. 2004. (19:56:15) Postovi: (54F)16
Lokacija: hm?
|
Postano: 12:11 pon, 30. 8. 2004 Naslov: |
|
|
[quote="mdoko"][quote]pokazivac na polje i adresa prvog elem. polja su zapravo iste stvari[/quote]
:blueshock:
Pointer na polje i adresa prvog elementa polja, odnosno pointer na prvog u polju su dvije potpuno razlicite stvari :!:
Vidjeti [url]http://degiorgi.math.hr/forum/viewtopic.php?p=15420&highlight=#15420[/url][/quote]
Jes da je to stvar ukusa, a o njima necemo, ali onaj "potpuno" mi se ipak cini malo prejaka rijec :roll:
Dakle, C nece na isti nacin interpretirati varijable tipa "pointer na prvi element polja" i "pointer na polje", no to "posebno" ponasanje je vise-manje ograniceno na operacije dodavanja, oduzimanja i sl. (kao sto je lijepo obrazlozeno na threadu na koji si dao link), ali na stranu C-mushice: pointer na prvi element polja i pointer na polje sadrzavaju neku adresu, i ta adresa je ista u oba slucaja i to je ono sto je gornji kvouter zelio reci :!:
Drugim rijecima: ono sto te dijeli od ekvivalentnosti ta dva pojma je samo pitanje pravovremenog typecasta. Reci "potpuno razlicito" je misleading u najboljem slucaju.
Objasnjenje Gei: na strojnoj razini, kada ti zatrazis memoriju za polje, sistem ti vrati nekakav pointer. Taj pointer sluzi kao referentna tocka u odnosu na koju nalazis ostale elemente polja. Ta referentna tocka je 0.-ti (tj prvi ;)) element polja.
Npr. nakon alokacije polja od npr. 10 integera (int), malloc() nam vrati neki pointer. Taj pointer nam ukazuje na nasu referentnu tocku, tj. pocetni element polja (tj. element br 0 kako to C voli zvati). Kada zelim pristupiti npr. elementu broj 3, tada sistem uzme podatak o nultom elementu i "ode 3 integera dalje", tj. brojcanoj adresi pocetnog elementa doda 3*sizeof(int).
Problem koji spominje mdoko jest da (ukoliko imamo pointer na int, npr int *i koji pokazuje na prvi element polja) onda ce C "i+=3" sebi objasniti kao "3 integera dalje", ako istu stvar ucinis polju, C ce zakljuciti da je to "3 polja dalje" i to je t.
Jes da je to stvar ukusa, a o njima necemo, ali onaj "potpuno" mi se ipak cini malo prejaka rijec
Dakle, C nece na isti nacin interpretirati varijable tipa "pointer na prvi element polja" i "pointer na polje", no to "posebno" ponasanje je vise-manje ograniceno na operacije dodavanja, oduzimanja i sl. (kao sto je lijepo obrazlozeno na threadu na koji si dao link), ali na stranu C-mushice: pointer na prvi element polja i pointer na polje sadrzavaju neku adresu, i ta adresa je ista u oba slucaja i to je ono sto je gornji kvouter zelio reci
Drugim rijecima: ono sto te dijeli od ekvivalentnosti ta dva pojma je samo pitanje pravovremenog typecasta. Reci "potpuno razlicito" je misleading u najboljem slucaju.
Objasnjenje Gei: na strojnoj razini, kada ti zatrazis memoriju za polje, sistem ti vrati nekakav pointer. Taj pointer sluzi kao referentna tocka u odnosu na koju nalazis ostale elemente polja. Ta referentna tocka je 0.-ti (tj prvi ) element polja.
Npr. nakon alokacije polja od npr. 10 integera (int), malloc() nam vrati neki pointer. Taj pointer nam ukazuje na nasu referentnu tocku, tj. pocetni element polja (tj. element br 0 kako to C voli zvati). Kada zelim pristupiti npr. elementu broj 3, tada sistem uzme podatak o nultom elementu i "ode 3 integera dalje", tj. brojcanoj adresi pocetnog elementa doda 3*sizeof(int).
Problem koji spominje mdoko jest da (ukoliko imamo pointer na int, npr int *i koji pokazuje na prvi element polja) onda ce C "i+=3" sebi objasniti kao "3 integera dalje", ako istu stvar ucinis polju, C ce zakljuciti da je to "3 polja dalje" i to je t.
_________________
Pupoljak nije negiran. Rekao sam to i ponovit cu to jos jedanput. Pupoljak NIJE negirAn.
MADD
(Mothers Against Dirty Dialectics)
Based on a true story. NOT.
Ko ih sljivi, mi sviramo punk 
|
|
[Vrh] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 12:48 pon, 30. 8. 2004 Naslov: |
|
|
[quote]ono sto te dijeli od ekvivalentnosti ta dva pojma je samo pitanje pravovremenog typecasta[/quote]
Jao! Ako cemo tako, onda je su svaka sva tipa podataka T1 i T2 za koje vrijedi sizeof(T1) == sizeof(T2) ekvivalentna do na pravovremeni typecast :!: Cini mi se da to bas i nije C-ovski nacin rada. Ako bi tako razmisljali, dovoljno bi bilo deklarirati samo koliko neka varijabla zauzima memorije, a kasnije je tokom rada castati na sve zivo, sto nije niti sigurno, a jos manje elegantno rjesenje.
Mislim, vidi ovo:
[code:1]
int main(){
int i;
char* s = "STRING";
i = (int) s;
puts((char*) i);
return 0;
}
[/code:1]
Citat: | ono sto te dijeli od ekvivalentnosti ta dva pojma je samo pitanje pravovremenog typecasta |
Jao! Ako cemo tako, onda je su svaka sva tipa podataka T1 i T2 za koje vrijedi sizeof(T1) == sizeof(T2) ekvivalentna do na pravovremeni typecast Cini mi se da to bas i nije C-ovski nacin rada. Ako bi tako razmisljali, dovoljno bi bilo deklarirati samo koliko neka varijabla zauzima memorije, a kasnije je tokom rada castati na sve zivo, sto nije niti sigurno, a jos manje elegantno rjesenje.
Mislim, vidi ovo:
Kod: |
int main(){
int i;
char* s = "STRING";
i = (int) s;
puts((char*) i);
return 0;
}
|
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
|
|
[Vrh] |
|
ZELENIZUBNAPLANETIDO SADE Forumaš(ica)


Pridružen/a: 04. 03. 2004. (19:56:15) Postovi: (54F)16
Lokacija: hm?
|
Postano: 13:30 pon, 30. 8. 2004 Naslov: |
|
|
[quote="mdoko"][quote]ono sto te dijeli od ekvivalentnosti ta dva pojma je samo pitanje pravovremenog typecasta[/quote]
Jao! Ako cemo tako, onda je su svaka sva tipa podataka T1 i T2 za koje vrijedi sizeof(T1) == sizeof(T2) ekvivalentna do na pravovremeni typecast :!: Cini mi se da to bas i nije C-ovski nacin rada. Ako bi tako razmisljali, dovoljno bi bilo deklarirati samo koliko neka varijabla zauzima memorije, a kasnije je tokom rada castati na sve zivo, sto nije niti sigurno, a jos manje elegantno rjesenje.[/quote]
Kao netko tko je svoje najbolje programerske dane proveo u NASM-u moram se sloziti da je to najjednostavnije/najfleksibilnije rijesenje :g:
Salu na stranu, navedi slucaj (a da nije vezan uz pointer-emulated tipove podataka) gdje bi princip "sizeof(T1) == sizeof(T2)" stvarao probleme i u kojem kontekstu to "bas i nije C-ovski nacin rada" ? Pointeri su 4 il kolko vec bytene brojcane vrijednosti, kako cemo interpretirati ono sto stoji iza adrese na koju oni ukazuju je iskljucivo stvar konteksta, kao i "elegancija rijesenja".
[quote="mdoko"]Cini mi se da to bas i nije C-ovski nacin rada. Ako bi tako razmisljali, dovoljno bi bilo deklarirati samo koliko neka varijabla zauzima memorije, a kasnije je tokom rada castati na sve zivo, sto nije niti sigurno [color=red]...[/color][/quote]
...a sto mislis sto C radi cijelo vrijeme ? ;) bsajds, bizarluci kao u onom kodu kojeg si postao su nemoguci ako onaj koji kodira zna sto radi, a ako ne zna, nikakva "elegancija rijesenja" ili kakotovecdanazovem ga nece spasiti (sjeti se samo problema sa ispisom case-a iz hash-a u praktikumu 1 :rotfl:)
bsajds, ova rasprava ide offtopic jerbo nema vise mnogo prakticne veze sa rijesenjem zadatka odozgora
mdoko (napisa): | Citat: | ono sto te dijeli od ekvivalentnosti ta dva pojma je samo pitanje pravovremenog typecasta |
Jao! Ako cemo tako, onda je su svaka sva tipa podataka T1 i T2 za koje vrijedi sizeof(T1) == sizeof(T2) ekvivalentna do na pravovremeni typecast Cini mi se da to bas i nije C-ovski nacin rada. Ako bi tako razmisljali, dovoljno bi bilo deklarirati samo koliko neka varijabla zauzima memorije, a kasnije je tokom rada castati na sve zivo, sto nije niti sigurno, a jos manje elegantno rjesenje. |
Kao netko tko je svoje najbolje programerske dane proveo u NASM-u moram se sloziti da je to najjednostavnije/najfleksibilnije rijesenje
Salu na stranu, navedi slucaj (a da nije vezan uz pointer-emulated tipove podataka) gdje bi princip "sizeof(T1) == sizeof(T2)" stvarao probleme i u kojem kontekstu to "bas i nije C-ovski nacin rada" ? Pointeri su 4 il kolko vec bytene brojcane vrijednosti, kako cemo interpretirati ono sto stoji iza adrese na koju oni ukazuju je iskljucivo stvar konteksta, kao i "elegancija rijesenja".
mdoko (napisa): | Cini mi se da to bas i nije C-ovski nacin rada. Ako bi tako razmisljali, dovoljno bi bilo deklarirati samo koliko neka varijabla zauzima memorije, a kasnije je tokom rada castati na sve zivo, sto nije niti sigurno ... |
...a sto mislis sto C radi cijelo vrijeme ? bsajds, bizarluci kao u onom kodu kojeg si postao su nemoguci ako onaj koji kodira zna sto radi, a ako ne zna, nikakva "elegancija rijesenja" ili kakotovecdanazovem ga nece spasiti (sjeti se samo problema sa ispisom case-a iz hash-a u praktikumu 1 )
bsajds, ova rasprava ide offtopic jerbo nema vise mnogo prakticne veze sa rijesenjem zadatka odozgora
_________________
Pupoljak nije negiran. Rekao sam to i ponovit cu to jos jedanput. Pupoljak NIJE negirAn.
MADD
(Mothers Against Dirty Dialectics)
Based on a true story. NOT.
Ko ih sljivi, mi sviramo punk 
|
|
[Vrh] |
|
nemo Moderator


Pridružen/a: 11. 07. 2004. (21:28:31) Postovi: (37F)16
Spol: 
Lokacija: čakovec
|
Postano: 17:44 pon, 30. 8. 2004 Naslov: |
|
|
[quote="Gea"]
\cut
E da...fja ciji je prototip double* vp(double v[],double w[]){
opcenito vraca kao vrijednost pokazivac na tip double, zar ne? ...mislim da je na usmenom to tocnije reci nego da vraca adresu prvog...a veky je zapravo za tocniju varijantu napisao obrnuto, hmmm :roll:[/quote]
U općenitom slučaju uopće ne trebaš mislit o tome od čega ta adresa potječe. Najjednostavnije je reči da vraća pokazivač tipa double, iako je to ustvari samo jednostavniji način da se to kaže. U stvarnosti se ne prebacuje pokazivač koji je oznaka, spremnik ili kako to želiš nazvati, već sadržaj toga spremnika, što je adresa neke varijable tipa double.
Gea (napisa): |
\cut
E da...fja ciji je prototip double* vp(double v[],double w[]){
opcenito vraca kao vrijednost pokazivac na tip double, zar ne? ...mislim da je na usmenom to tocnije reci nego da vraca adresu prvog...a veky je zapravo za tocniju varijantu napisao obrnuto, hmmm  |
U općenitom slučaju uopće ne trebaš mislit o tome od čega ta adresa potječe. Najjednostavnije je reči da vraća pokazivač tipa double, iako je to ustvari samo jednostavniji način da se to kaže. U stvarnosti se ne prebacuje pokazivač koji je oznaka, spremnik ili kako to želiš nazvati, već sadržaj toga spremnika, što je adresa neke varijable tipa double.
_________________ Umjesto da postavlja pitanje o tome što je prije nastalo - kokoš ili jaje, čovjeku se najednom učinilo da je kokoš zamisao jajeta o stvaranju novih jaja.

|
|
[Vrh] |
|
Gost
|
Postano: 18:31 pon, 30. 8. 2004 Naslov: |
|
|
Eto people, thx svima....i na onom linku, a i na objasnjenjima...manje-vise mi je jasno, samo sam htjela cuti "glas naroda", hehe
A sto se tice ovog "sto je tocnije" u C-u, to je samo zato da me nogo ne izbaci iz igre na usmenom... :lol:
Pozdrav
Eto people, thx svima....i na onom linku, a i na objasnjenjima...manje-vise mi je jasno, samo sam htjela cuti "glas naroda", hehe
A sto se tice ovog "sto je tocnije" u C-u, to je samo zato da me nogo ne izbaci iz igre na usmenom...
Pozdrav
|
|
[Vrh] |
|
|