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

pointer na struct kao varijabilni argument, pitanje (objasnjenje gradiva)
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
radivarig
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 29. 05. 2012. (21:36:08)
Postovi: (6)16
Sarma = la pohva - posuda
= 0 - 0

PostPostano: 22:41 uto, 29. 5. 2012    Naslov: pointer na struct kao varijabilni argument, pitanje Citirajte i odgovorite

Moze li mi netko objasniti kako treba ispravno pozvati u mainu i primiti u funkciju pointer na strukturu ali kao varijabilni argument?

na primjer, recimo da sam koristio:
[code:1]typedef struct _lista{
int broj;
struct _lista *next;
} lista;
//i u mainu deklarirao kao lista *last;
[/code:1]
umjesto:[code:1]typedef struct _element *lista;
typedef struct _element{
int broj;
lista next;
} element;
[/code:1]
(kao u skripti
http://degiorgi.math.hr/prog2/predavanja/p2-pred-08.pdf
typedef na str. 30, i ono sto mi je zapravo nejasno je var.arg. na str. 78 i 79)

evo i moje funkcije:
[code:1]lista *dodajnakraj(lista *first, lista **p_last, int x)
{
lista *last=p_last;
lista *new=(lista*)malloc(sizeof(lista));
new->broj=x;
new->next=NULL;
if(!first)
first=new;
else
last->next=new;
*p_last=new;
return first;
}
//poziv, first=dodajnakraj(first, last, 5);[/code:1]
znam da je problem u *p_last=new, lista **p_last ili u pozivu za last (i ako stavim &last, onda ne doda element)
je li to uopce moguce na ovakav nacin?
Moze li mi netko objasniti kako treba ispravno pozvati u mainu i primiti u funkciju pointer na strukturu ali kao varijabilni argument?

na primjer, recimo da sam koristio:
Kod:
typedef struct _lista{
   int broj;
   struct _lista *next;
} lista;
//i u mainu deklarirao kao lista *last;

umjesto:
Kod:
typedef struct _element *lista;
typedef struct _element{
       int broj;
       lista next;
} element;

(kao u skripti
http://degiorgi.math.hr/prog2/predavanja/p2-pred-08.pdf
typedef na str. 30, i ono sto mi je zapravo nejasno je var.arg. na str. 78 i 79)

evo i moje funkcije:
Kod:
lista *dodajnakraj(lista *first, lista **p_last, int x)
{
    lista *last=p_last;
    lista *new=(lista*)malloc(sizeof(lista));
    new->broj=x;
    new->next=NULL;
    if(!first)
        first=new;
    else
        last->next=new;
        *p_last=new;
    return first;
}
//poziv, first=dodajnakraj(first, last, 5);

znam da je problem u *p_last=new, lista **p_last ili u pozivu za last (i ako stavim &last, onda ne doda element)
je li to uopce moguce na ovakav nacin?


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


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

PostPostano: 0:00 sri, 30. 5. 2012    Naslov: Citirajte i odgovorite

Pogledaj warninge koje ti compiler javlja. Ovdje:
[tt]lista *last=p_last;[/tt]
se ne slazu tipovi i tu bi compiler trebao zvocati. Ako je [tt]p_last[/tt] pointer na zadnjeg, onda trebas
[tt]last = *p_last;[/tt]
ili, ako si u deklaraciji
[tt]lista *last=p_last;[/tt]

U [tt]main[/tt]-u, naravno, ide [tt]&last[/tt].

Dakle, prva linija obrane ti je provjeriti tipove. To je nuzan (ali ne i dovoljan!) uvjet da su ovakvi pozivi ok.
Pogledaj warninge koje ti compiler javlja. Ovdje:
lista *last=p_last;
se ne slazu tipovi i tu bi compiler trebao zvocati. Ako je p_last pointer na zadnjeg, onda trebas
last = *p_last;
ili, ako si u deklaraciji
lista *last=p_last;

U main-u, naravno, ide &last.

Dakle, prva linija obrane ti je provjeriti tipove. To je nuzan (ali ne i dovoljan!) uvjet da su ovakvi pozivi ok.



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


Pridružen/a: 29. 05. 2012. (21:36:08)
Postovi: (6)16
Sarma = la pohva - posuda
= 0 - 0

PostPostano: 0:47 sri, 30. 5. 2012    Naslov: Citirajte i odgovorite

Javlja mi iako nemogu skuzit gresku, niti kako da bi to ispravno trebalo biti napisano.
A zasto se ne moze pristupati obicnoj strukturi ako ju funkcija prima kao pointer?

npr, u funkciji koja prima *first, i deklariramo *new=.. malloc.., recimo da mjenjamo first=nesto, s obzirom da pristupamo adresi koju pokazuje first, zasto se ne promjeni i sama vrijednost te adrese? Kao kod (*first).next=new; gdje je new pointer
Javlja mi iako nemogu skuzit gresku, niti kako da bi to ispravno trebalo biti napisano.
A zasto se ne moze pristupati obicnoj strukturi ako ju funkcija prima kao pointer?

npr, u funkciji koja prima *first, i deklariramo *new=.. malloc.., recimo da mjenjamo first=nesto, s obzirom da pristupamo adresi koju pokazuje first, zasto se ne promjeni i sama vrijednost te adrese? Kao kod (*first).next=new; gdje je new pointer


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


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

PostPostano: 1:33 sri, 30. 5. 2012    Naslov: Citirajte i odgovorite

Pazi, [tt]x = y[/tt] mijenja [tt]x[/tt] (koji god tip [tt]x[/tt] bio). Ako je [tt]x[/tt] (ne [tt]*x[/tt]!) argument funkcije, on je kopija neceg od tamo gdje je funkcija pozvana (recimo iz [tt]main[/tt]-a, da ne kompliciramo). Dakle, tebi [tt]first = nesto[/tt] mijenja onaj [tt]first[/tt] iz funkcije koji je samo kopija [tt]first[/tt]-a iz [tt]main[/tt]-a. Uopce nije bitno sto su ti [tt]first[/tt]-ovi pointeri.

S druge strane, [tt]*x = y[/tt] i [tt]x->nesto = y[/tt] mijenja ono na sto [tt]x[/tt] pokazuje, a ne sam [tt]x[/tt]. I dalje je [tt]x[/tt] kopija necega, ali ono na sto on pokazuje nije kopija nego original (koji, opcenito, nema kopiju).

Dakle, nisu pointeri "posebni", nego preko njih glumimo ono sto se u drugim jezicima (npr. Pascalu) zove "varijabilni argumenti".

Primjer:
[code:1]void f(int a, int *b, int *c, int **d) {
int tmp = (int *)malloc(sizeof(int));
/* prvo s int i int* */
a = 17; /* a je lokalna kopija varijable e, pa se e ne mijenja */
*b = 17; /* b je lokalna kopija rezultata izraza &f, tj. b pokazuje na f, pa se ovdje mijenja vrijednost od f */
/* identicno vrijedi za int* i int** (pointer na int*) */
c = tmp; /* c je lokalna kopija varijable g, pa se g ne mijenja */
*d = tmp; /* d je lokalna kopija rezultata izraza &h, tj. d pokazuje na h, pa se ovdje mijenja vrijednost od h */
}
...
int main(void) {
int e, f, *g, *h;

f(e, &f, g, &h);
/* ovdje su e i g i dalje neinicijalizirani, tj. e je neki bezvezni broj, a g pointer koji gotovo sigurno pokazuje na nesto nealocirano */

free(h);

return 0;
}[/code:1]

Ako nije jasno, vidi identicni kod:
[code:1]typedef int tip1;
typedef int* tip2;

void f(tip1 a, tip1 *b, tip2 c, tip2 *d) {
int tmp = (tip2)malloc(sizeof(int));
/* prvo s tip1 i tip1* */
a = 17; /* a je lokalna kopija varijable e, pa se e ne mijenja */
*b = 17; /* b je lokalna kopija rezultata izraza &f, tj. b pokazuje na f, pa se ovdje mijenja vrijednost od f */
/* identicno vrijedi za tip2 i tip2* */
c = tmp; /* c je lokalna kopija varijable g, pa se g ne mijenja */
*d = tmp; /* d je lokalna kopija rezultata izraza &h, tj. d pokazuje na h, pa se ovdje mijenja vrijednost od h */
}
...
int main(void) {
tip1 e, f;
tip2 g, h;

f(e, &f, g, &h);
/* ovdje su e i g i dalje neinicijalizirani, tj. e je neki bezvezni broj, a g pointer koji gotovo sigurno pokazuje na nesto nealocirano */

free(h);

return 0;
}[/code:1]

Nadam se da je ovdje jasno da se [tt]a[/tt], [tt]b[/tt], [tt]e[/tt] i [tt]f[/tt] ponasaju identicno kao [tt]c[/tt], [tt]d[/tt], [tt]g[/tt] i [tt]h[/tt] (sve je isto, samo su jedni definirani preko [tt]tip1[/tt], a drugi preko [tt]tip2[/tt]).

Gradivo Prog 1, btw... :)
Pazi, x = y mijenja x (koji god tip x bio). Ako je x (ne *x!) argument funkcije, on je kopija neceg od tamo gdje je funkcija pozvana (recimo iz main-a, da ne kompliciramo). Dakle, tebi first = nesto mijenja onaj first iz funkcije koji je samo kopija first-a iz main-a. Uopce nije bitno sto su ti first-ovi pointeri.

S druge strane, *x = y i x→nesto = y mijenja ono na sto x pokazuje, a ne sam x. I dalje je x kopija necega, ali ono na sto on pokazuje nije kopija nego original (koji, opcenito, nema kopiju).

Dakle, nisu pointeri "posebni", nego preko njih glumimo ono sto se u drugim jezicima (npr. Pascalu) zove "varijabilni argumenti".

Primjer:
Kod:
void f(int a, int *b, int *c, int **d) {
  int tmp = (int *)malloc(sizeof(int));
  /* prvo s int i int* */
  a = 17; /* a je lokalna kopija varijable e, pa se e ne mijenja */
  *b = 17; /* b je lokalna kopija rezultata izraza &f, tj. b pokazuje na f, pa se ovdje mijenja vrijednost od f */
  /* identicno vrijedi za int* i int** (pointer na int*) */
  c = tmp; /* c je lokalna kopija varijable g, pa se g ne mijenja */
  *d = tmp; /* d je lokalna kopija rezultata izraza &h, tj. d pokazuje na h, pa se ovdje mijenja vrijednost od h */
}
...
int main(void) {
  int e, f, *g, *h;

  f(e, &f, g, &h);
  /* ovdje su e i g i dalje neinicijalizirani, tj. e je neki bezvezni broj, a g pointer koji gotovo sigurno pokazuje na nesto nealocirano */

  free(h);

  return 0;
}


Ako nije jasno, vidi identicni kod:
Kod:
typedef int tip1;
typedef int* tip2;

void f(tip1 a, tip1 *b, tip2 c, tip2 *d) {
  int tmp = (tip2)malloc(sizeof(int));
  /* prvo s tip1 i tip1* */
  a = 17; /* a je lokalna kopija varijable e, pa se e ne mijenja */
  *b = 17; /* b je lokalna kopija rezultata izraza &f, tj. b pokazuje na f, pa se ovdje mijenja vrijednost od f */
  /* identicno vrijedi za tip2 i tip2* */
  c = tmp; /* c je lokalna kopija varijable g, pa se g ne mijenja */
  *d = tmp; /* d je lokalna kopija rezultata izraza &h, tj. d pokazuje na h, pa se ovdje mijenja vrijednost od h */
}
...
int main(void) {
  tip1 e, f;
  tip2 g, h;

  f(e, &f, g, &h);
  /* ovdje su e i g i dalje neinicijalizirani, tj. e je neki bezvezni broj, a g pointer koji gotovo sigurno pokazuje na nesto nealocirano */

  free(h);

  return 0;
}


Nadam se da je ovdje jasno da se a, b, e i f ponasaju identicno kao c, d, g i h (sve je isto, samo su jedni definirani preko tip1, a drugi preko tip2).

Gradivo Prog 1, btw... 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
radivarig
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 29. 05. 2012. (21:36:08)
Postovi: (6)16
Sarma = la pohva - posuda
= 0 - 0

PostPostano: 10:58 sri, 30. 5. 2012    Naslov: Citirajte i odgovorite

Evo malo sam odspavao pa se sve poslozilo:D
[code:1]lista *dodajnakraj(lista *first, lista **p_last, int x)
{
lista *new=(lista*)malloc(sizeof(lista));
new->broj=x;
new->next=NULL;
if(!first)
first=new;
else
(*p_last)->next=new;
*p_last=new;
return first;
}
[/code:1]poziv: [code:1]
first=dodajnakraj(first, &last, 5);[/code:1]
Evo malo sam odspavao pa se sve poslozilo:D
Kod:
lista *dodajnakraj(lista *first, lista **p_last, int x)
{
    lista *new=(lista*)malloc(sizeof(lista));
    new->broj=x;
    new->next=NULL;
    if(!first)
        first=new;
    else
        (*p_last)->next=new;
        *p_last=new;
    return first;
}
poziv:
Kod:

first=dodajnakraj(first, &last, 5);


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


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

PostPostano: 11:14 sri, 30. 5. 2012    Naslov: Citirajte i odgovorite

Tocno tako. [tt]p_last[/tt] je kopija od [tt]&last[/tt] (nebitno koji su tipovi!), pa je [tt]*p_last[/tt] isto sto i [tt]last[/tt], a tocno to je ono sto se zeli postici pointerima kad nam trebaju varijabilni argumenti. :D
Tocno tako. p_last je kopija od &last (nebitno koji su tipovi!), pa je *p_last isto sto i last, a tocno to je ono sto se zeli postici pointerima kad nam trebaju varijabilni argumenti. Very Happy



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


Pridružen/a: 29. 05. 2012. (21:36:08)
Postovi: (6)16
Sarma = la pohva - posuda
= 0 - 0

PostPostano: 12:54 sri, 30. 5. 2012    Naslov: Citirajte i odgovorite

Pitanje, zar nebi trebali osloboditi i temp iz funkcije?

edit: h je pointer, pa je free(h) oslobadanje pozicije gdje je temp alociran. malo sam brzoplet :oops:
Pitanje, zar nebi trebali osloboditi i temp iz funkcije?

edit: h je pointer, pa je free(h) oslobadanje pozicije gdje je temp alociran. malo sam brzoplet Embarassed


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


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

PostPostano: 13:01 sri, 30. 5. 2012    Naslov: Citirajte i odgovorite

Edit je tocan. Bitno je da se oslobodi memorija, no ne i da se to napravi preko iste varijable.

Skiciranje zbivanja u memoriji pomaze, barem dok se uci.
Edit je tocan. Bitno je da se oslobodi memorija, no ne i da se to napravi preko iste varijable.

Skiciranje zbivanja u memoriji pomaze, barem dok se uci.



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


Pridružen/a: 18. 12. 2011. (00:10:28)
Postovi: (57)16
Sarma = la pohva - posuda
= 4 - 1

PostPostano: 14:23 sri, 30. 5. 2012    Naslov: Citirajte i odgovorite

Da li netko zna što je sa stranicom asistenta bujanovića?
Da li netko zna što je sa stranicom asistenta bujanovića?


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


Pridružen/a: 06. 10. 2011. (14:09:58)
Postovi: (14)16
Spol: muško
Sarma = la pohva - posuda
= 6 - 0

PostPostano: 20:12 sri, 30. 5. 2012    Naslov: Citirajte i odgovorite

[quote="Ryssa"]Da li netko zna što je sa stranicom asistenta bujanovića?[/quote]

Primjetio sam da su stranice asistenta Bujanovica i Doke bile nedostupne ,ali sada sve radi normalno
Ryssa (napisa):
Da li netko zna što je sa stranicom asistenta bujanovića?


Primjetio sam da su stranice asistenta Bujanovica i Doke bile nedostupne ,ali sada sve radi normalno



_________________
SI.NO.
[Vrh]
Korisnički profil Pošaljite privatnu poruku
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