dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Rādītāju pielietojums

 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
Marcina



Joined: 15 Aug 2006
Posts: 26
Location: Rīga

PostPosted: Fri Mar 16, 2007 7:12 pm    Post subject: Rādītāju pielietojums

Jautājumi programmētājiem:
1) kāds ir rādītāju faktiskais labums - ātrums vai kas?
2) vai programmētāji bieži tos izmanto? kur? kur izjūtama vislielākā atšķirība?
Back to top
View user's profile
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Fri Mar 16, 2007 7:40 pm    Post subject:

Pagāja dažas sekundes kamēr pieleca kas ir rādītāji (pointers) :)
1) ne īsti ātrums, bet ērtums rakstot kodu. Jo C++'ā pointeris ir tas pats kas masīvs, un ar to var dažādus labumus darīties (piecos vārdos grūti izstāstīt).
2) jā, ļoti bieži. Operācijās ar masīviem, ar objektiem, u.t.t.
Pameklē gūglē "pointer c++ usage". Pirmajā linkā ir diezgan labi dažas lietas uzrakstītas.
Back to top
View user's profile Send e-mail
SkyD



Joined: 04 Oct 2006
Posts: 67

PostPosted: Sun Apr 29, 2007 8:38 pm    Post subject:

Es nesaprotu, kaads labums ir no taas adreses?
shas, piemēram:
int i = 10;
int *x = i
cout << &x;

Cik noprotu, tad es taadi dabonu i adresi, bet kāds no tā labums?
Back to top
View user's profile
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Sun Apr 29, 2007 9:00 pm    Post subject:

Tā kā tu tur dari, tā ir pilnīga bezjēdzība.
No šāda koda ir lielāka jēga:
Code:
int i = 10;
int* x = &i;
cout << *x;
*x = 20;
cout << i; // cik te izvadīs?
Back to top
View user's profile Send e-mail
SkyD



Joined: 04 Oct 2006
Posts: 67

PostPosted: Sun Apr 29, 2007 9:04 pm    Post subject:

neliekas, ka 10 tur izvadiis, tapeec saku, ka 20. Tikai kaada ir logjika, ka *x=20, bet izvadot i ir nevis 10, bet 20 ?
Un strādājot ar masīviem, kur šos pointerus pielietot un kāpēc?
Ja vari, tad iedod lūdzu kādu lielāku koda gabalu no savas kolekcijas..
Back to top
View user's profile
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Sun Apr 29, 2007 9:18 pm    Post subject:

Nevajag minēt, vajag saprast kāpēc un tad teikt :)
Pointeris šajā gadījumā ir kautkas tāds, kas norāda uz citu mainīgo. Mainot pointera norādīto vērtību (nevis pašu pointeri!!) ar sintaksi *x = ... es mainu to i vērtību, uz kuru liku x pointerim norādīt: x = &i;

Masīvs C/C++'ā ir pointeris (tik ar vienu papildus fīču - kompilēšanas laikā var uzzināt tā garumu). Tāpēc lietojot masīvus, tu lieto pointerus. Skat:
Code:

int a[4] = {1,2,3,4};
cout << a[2];    // A
cout << *(a+2);  // B
int* b = a;
b += 2;
cout << *b;  // C

Gan A, gan B, gan C izvadīs skaitli 3.

Pointerus lieto daudz kur, bez tiem grūti C++'ā iztikt. Nu jā, var references lietot, bet tas jau gandrīz tas pats, kas pointers tik ar minimālām atšķirībām un sintaksi.

Kā pats manā iepriekšējā posta piemēra redzēji - pointeru lieto, ja vajag norādīt uz kādu citu eksistējošu (jeb citreiz neeksistējošu) objektu/skaitli. Tb es negribu, lai tas i ir divos eksemplāros, bet tikai vienā. Un to gribu mainīt no vairākām vietām lielā programmā/klašu hierarhijā. Tad nu te ir jālieto pointeri vai references.

Atrodi labāk kādu grāmatu par C/C++ un palasi. Citādi par šādām lietām tak var stundām ilgi stāstīt un stāstīt.

Te vēl kautkas par līdzīgu tēmu: http://boot.lv/prg/index.php?showtopic=355 (lai gan tur ir par C, nevis C++ tāpēc par referencēm nekas nav minēts).
Back to top
View user's profile Send e-mail
SkyD



Joined: 04 Oct 2006
Posts: 67

PostPosted: Sun Apr 29, 2007 9:41 pm    Post subject:

Pašam paekspermentējot vairāk izprotu tā pielietojamību.
Paldies.
Back to top
View user's profile
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Sun Apr 29, 2007 9:47 pm    Post subject:

Lūdzu.

Taču pamata lietas gan derētu izlasīt kautkur, jo citādi vaicāsi daudz un dikti dumus jautājumus kā sākumā šajā topikā, uz kuriem nevienam nebūs pacietības atbildēt :) Būtu izlasījis pamatus kautkur par pointeriem, tad nebūtu rakstījis tik dīvainu kodu, kurš neko prātīgu nedara (tb inicializē pointeri uz adresi 10, un izvada pointera adresi).

Bet nu labi, ka pats kautko eksperimentē un dari, tā tiešām var daudz iemācīties. Citi neko neeksperimentē un tik gaida, kad visu priekšā uzrakstīs.
Back to top
View user's profile Send e-mail
SkyD



Joined: 04 Oct 2006
Posts: 67

PostPosted: Mon Apr 30, 2007 3:55 pm    Post subject:

Šoreiz ne vairs par pointeriem, bet par templītiem jautājums.
Cik es palasīju un papētiju templītus, tad šķiet, ka tie arī ir tikai ērtības un koda smukuma pēc. Vai tomēr kautkādu ātrdarbību arī templīti dod?

Varbūt arī kādu template example no jums varu dabūt? Vieglāk saprast man būs..
Back to top
View user's profile
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Mon Apr 30, 2007 4:58 pm    Post subject:

Hmm.. redzi vienkāršā piemērā grūti parādīt kā templeiti var dot ātrdarbību. Taču lielos koda apjomos templeiti palīdz vieglāk rakstīt kodu, tas gan tiesa. Un ja tev ir vieglāk rakstīt kodu, tas nozīmē, ka tev ir vairāk laika domāt par dažādām koda variācijām un optimizācijām. Tātad rezultātā tas dod ātrdarbību. Taču tā burtiski, vai tu raksti A vai A ar templeitiem, tas īsti ātrdarbību dos vai nedos, grūti teikt.

Piemērs, kautvai tipiskais min/max (no std:: namespace) - tu gribi min/max vērtību no diviem objektiem A un B. Un tevi neinteresē, kāda tips ir A un B mainīgajiem - char, int, float, MySpaceShipClass, BallRadius, utt... Kā tu to rakstītu. C++'ā atbilde ir templeiti:
Code:
template <typename T>
T min(T a, T b)
{
  if (a<b) return a;
  return b;
}

Te tu pirmajā rindā redzi maģiskus keywordus, kuri pasaka, ka tev būs apstrakts tips T (kas var būt jebkas), kuru tu tālāk norādi kā a un b argumentu tipu, kā arī par rezultāta tipu.
Šajā gadījumā vienīgās prasības par tipu T ir - lai tam būtu definēts kopēšanas konstruktors un operācija <

Šis ir vienkāršs piemērs, bet templeitus pielieto daudz sarežģītākām lietām. Jo pēc savas būtības templeiti ir Tjūringa pilna valoda, tāpēc tajā var pilnvērtīgi programmēt jebko. Gudri runājot - templeiti ir metavaloda, kura ļauj izpildīt savu kodu programmas kompilēšanas laikā, kas protams ir laba lieta. Jo labāk kodu izpildīt tikai vienreiz - kompilēšanas laikā, nevis katru reizi simtiem reižu pēc kārtas programmas darbības laikā. Tātad sava doma ātrdarbībai tomēr tur ir.

Jā un vēl - templeiti noteikti nav koda smukuma pēc. Pamatīgi lietoti teimpleiti kodu padara diezgan grūti lasāmu ;)


Last edited by bubu on Mon Apr 30, 2007 6:22 pm; edited 1 time in total
Back to top
View user's profile Send e-mail
SkyD



Joined: 04 Oct 2006
Posts: 67

PostPosted: Mon Apr 30, 2007 5:50 pm    Post subject:

Nu jā, skaidrs.
Back to top
View user's profile
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group