[ Susie_Q @ 09.08.2010. 13:43 ] @
Imam problema sa sledecim pitalicama. Potrebno je da protumacimo sta ispisuju sledeci programi:

Code:

#include <stdio.h>
int P1(int *a) {return *a+1;}
int P2(int *b) {return 1+(*b+=1);}
int P3(int *c) {return *c++;}
void main () {
int (*p[]) (int *)={P1,P2,P3,P1,P3,P2};
int i=0,t;
while (1) {
if ((t=(*p[i]) (&i))==i)
break;
printf ("%d",i=t);
}
}



Code:

#include <stdio.h>
#include <stdlib.h>
void main () {
int i, *a[5], **b;
for (i=0; i<5 ; i++) {
a[i]= (int *) malloc (sizeof(int));
*a[i]=i%2;
}
for (b=a+--i; i>0; i--) {**(b-i)=**b+i%3;}
for(i=0; i<5; i++) printf ("%d", *b[-i]), free (b[-i]);
}


Resenje prvog zad. je 134, a drugog 01201, medjutim nikako ne mogu da dodjem do ovih rezultata. Nadam se da neko moze da mi pomogne i pojasni ove kodove.
[ Goran Rakić @ 09.08.2010. 14:07 ] @
p je niz pokazivača na funkcije P1, P2 i P3 koje sve primaju pokazivač na int i vraćaju vrednost pri tome P2 i P3 i menjaju prosleđeni pokazivač uvećavanjem za jedan.

U petlji se poziva funkcija nad i, rezultat smešta u t i prekida ako je rezultat isti kao prosleđena promenljiva. Inače se rezultat čuva u promenljivu i i štampa kao broj.

Dakle najpre za i=0 se poziva P1(0) što vraća i potom ispisuje 1, kao sporedno dejstvo pri ispisu promenljiva i postaje 1.

Zatim se za i=1 poziva P2(1) što menja promenljivu i u 2 i vraća 3 koje se ispisuje pri čemu i postaje 3.

Za i=3 sledi poziv P1(3) što vraća i potom ispisuje 4, i postaje 4.

Na kraju se za i=4 poziva P3(4) što vraća 5 ali i povećava i na 5 zbog čega if uslov u petlji postaje tačan i ona se prekida bez ispisa.

Dakle, ispisuje se 134 što lako možeš da proveriš izvršavanjem ovog programa.
[ djoka_l @ 09.08.2010. 14:35 ] @
U drugom programu, se formira niz pokazivača na int kojem se dodaljuju vrednosti 0,1,0,1,0.
Onda se b namesti da pokazuje na a[4], pa se kroz isti niz prolazi (korišćenjem negativnog indeksa) od nultog do četvrtog člana. **b ima vrednost 0 jer predstavlja *a[4] (koji je jednak 0).

Code:
for (b=a+--i; i>0; i--) {**(b-i)=**b+i%3;}


u stvari prolazi kroz a[ i ] od 0 do 4 i dodeljuje vrednost modulo 3 od i, tj. vrednosti 0,1,2,0,1.

Na kraju se niz ispisuje od *a[0] do *a[4] korišćenjem pokazivača b i negativnih indeksa i oslobađa se prostor koji je bio rezervisan sa malloc

[Ovu poruku je menjao djoka_l dana 09.08.2010. u 15:50 GMT+1]