Ukazovatele a unsafe code – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ukazovatele a unsafe code – .NET – Fórum – Programujte.comUkazovatele a unsafe code – .NET – Fórum – Programujte.com

 

yterbium0
Stálý člen
21. 8. 2009   #1
-
0
-

zdravím,

dnes som sa stretol s niečím takým to:

int* cislo;


niečo som si o tom aj prečítal,niečo ajpochopil. Ale mám pár otázok:

1/ kebyže používam tkaýto kod, musím si presne dávať pozor, ako vytváram premenné, na čo mi odkazujú (niečo ako Cčko)?
2/ prečo to vôbec v C# je, keď máme hodnotové a referenčné typy?
3/ kebyže to používam, tak vlastne Garbage collector mi je na nič?
4/ dá sa pomocou ukazovateľou zrýchliť beh aplikácie? (ako myslím, že kebyže ich ovládam dokonale a nemýlim sa...)
5/ má zmysel sa nimi zaoberať(učiť sa ich)?

Vopred ďakujem za odpovede.

Nahlásit jako SPAM
IP: 78.99.34.–
dannyk0
Věrný člen
21. 8. 2009   #2
-
0
-

1, presne tak
2, ja bych rekl, ze kvuli moznosti optimalizace a kvuli lowlvl operacim
3, tak nejak, on se na to nekouka a musis si to spravovat ty
4, urcite da, ale zalezi, jestli se ti to vyplati v pomeru slozitosti. Na slozite algoritmy se to urcite vyplati.
5, urcite ma, protoze se naucis nedelat bordel kod (i kdyz kdo vi :D ) a casem zjistis, ze pomoci tohoto dosahnes treba zrychleni a lepe pochopis, jak to funguje "pod poklickou".

Nahlásit jako SPAM
IP: 85.135.97.–
Jedu v c++,c#,assembler,ASP.NET,PHP,databaze,bezpecnost softwaru[br] -----------------------------------------------------------[br] Muj blog o programovani,hudbe a vsem moznem,co najdu na netu :) [br] http://dannyk.aspone.cz[br] -----------------------------------------------------------[br] Na foru mam nejake prispevky pod nickem Master,tak jen pro upresneni :)
21. 8. 2009   #3
-
0
-

Mám na to trochu jiný pohled:

5) Pokud se nechystáš vyvíjet aplikace náročné na výpočetní výkon, nevěnuj jim zatím nijak velkou pozornost (nárůst výkonu bude v porovnání s vynaloženým úsilím zanedbatelný). Rozhodně se tím nenaučíš nedělat "bordel kód" a zabiješ hodně času studiem něčeho, co téměř nevyužiješ.

Nahlásit jako SPAM
IP: 84.21.124.–
Dušan Janošík | web: djanosik.cz, @djanosik
KIIV
~ Moderátor
+43
God of flame
21. 8. 2009   #4
-
0
-

To djanosik : pokud ovsem nebude chtit casem testnout nejaky jazyk, kde ukazatele jsou - nebo dokonce bude nejakou nahodou chtit pracovat v assembleru :D

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
21. 8. 2009   #5
-
0
-

To KIIV : Až ta doba přijde (a ona dost možná nepřijde), měl by se tomu začít věnovat, ale rozhodně by kvůli takové možnosti neměl v C# začínat s pointry (to je řekněme advanced část jazyka a člověk by se k tomu měl dopracovat, ne tím začít).

Nahlásit jako SPAM
IP: 84.21.124.–
Dušan Janošík | web: djanosik.cz, @djanosik
dannyk0
Věrný člen
21. 8. 2009   #6
-
0
-

2 djanosik: Ze zacatku bych to taky nedoporucoval, to uz je preci jen troch vyssi divci... Jinak s tim bordel kodem bylo myslene neplytvani zdroji, uklizeni si po sobe apod.

Nahlásit jako SPAM
IP: 85.135.97.–
Jedu v c++,c#,assembler,ASP.NET,PHP,databaze,bezpecnost softwaru[br] -----------------------------------------------------------[br] Muj blog o programovani,hudbe a vsem moznem,co najdu na netu :) [br] http://dannyk.aspone.cz[br] -----------------------------------------------------------[br] Na foru mam nejake prispevky pod nickem Master,tak jen pro upresneni :)
yterbium0
Stálý člen
21. 8. 2009   #7
-
0
-

no tak s tým teraz pravdepodobne nezačnem, kedže sa ešte len snažím detailnejšie chápať o čom je vlastne OOP :)

Len ma zaujalo toto a vlastne ako to funguje?

Napr. ak si vytvorím Hodnotový typ premenej /int/, tak ho mám v Stack (učil som sa z ENG textu, nechcem prekladať do SK/CZ, nemám rád naše pojmy, nei sú dobré...) tú hodnotu uloženú

Keď vytvorím referenčný typ /napr. mojaTrieada/, tak vytvorím v Stack odkaz , ktorý smeruje na objekt v Heap. Do určitej miery chápem ako tieto 2 typy pracujú.

Lenže tie ukazovatele, ono teda keď ho vytvorím, tiež na niečo ukazuje. Ale kde je tá hodnota, na ktorú ukazuje? A kde je to hodnota ktorou ukazuje?


P.S. nemám v pláne prechádzať na písanie ovládačov, ani nič podobne, úplne my postačuje .NET, takže assembler nevidím nádejne

Nahlásit jako SPAM
IP: 78.99.34.–
NOclipus0
Newbie
22. 8. 2009   #8
-
0
-

To yterbium : V C# mě ukazatele nikdy nenapadlou používat, ale v c++ je to (myslím, ještě jsem tak trochu intermediate) tak, že pokud si vytvoříš ukazatel jako

int * pi;
a
pi = &i;
, tak takový ukazatel ukazuje na objekt na stacku, kdežto ukazatel vytvořený jako
int * pi = new int;
ukazuje na objekt na heapu neboli free store, protože operátor new alokuje pamět na heapu a vrátí pointer, takže pointery v C# asi ukazují na stack. V .NETu vrací new vlastně taky pointer, akorát že pointer na objekt vytvořený na managed heapu - části paměti o kterou se stará .NET a jeho garbage-collector.

Nahlásit jako SPAM
IP: 88.103.97.–
dannyk0
Věrný člen
22. 8. 2009   #9
-
0
-

Normalne se preklada Stack jako zasobnik a Heap jako halda, pouziva se oboji.

Jinak je to asi tak, jak jsi rikal, lokalni promenne (hlavne v metodach) jsou ulozene na zasobniku. Objekty jsou ulozene ve volne pameti na halde a na zasobniku je odkaz na ne. Tridni promenne jsou ulozene primo v pameti uvnitr objektu. Tridni ukazatele na promenne jsou ulozene taky primo v pameti uvnitr objektu a ukazuji na data v pameti (vetsinou mimo dany objekt v pameti).

Nahlásit jako SPAM
IP: 85.135.97.–
Jedu v c++,c#,assembler,ASP.NET,PHP,databaze,bezpecnost softwaru[br] -----------------------------------------------------------[br] Muj blog o programovani,hudbe a vsem moznem,co najdu na netu :) [br] http://dannyk.aspone.cz[br] -----------------------------------------------------------[br] Na foru mam nejake prispevky pod nickem Master,tak jen pro upresneni :)
yterbium0
Stálý člen
22. 8. 2009   #10
-
0
-

takže tak to funguje.

Pekné vysvetlenie, díky

A mali ste pravdu, teraz s tým určite nbudem začínať, možno o pár rokov:)

pekný víkend

Nahlásit jako SPAM
IP: 78.99.34.–
Miro17010
Stálý člen
22. 8. 2009   #11
-
0
-

zatial som sa stretol s jedou vecou kde sa daju vyuzit, to su parametre v metodach OpenGL, kde predaslen ukazatel na premennu, tym padom sa urychli volanie metody, lebo nemusi kopirovat parametre.

ale podobne sluzi aj ref keyword( ak chces po anglicky :D), ktory len da odkaz na premenu, ale adresu adkazu nemozes zmenit v metode, jedine dostat pomocou

 int* Xp = &X;
ak sa nemylim, prave zacinam s pointermi.

A napadla ma jedna vec, ako je to s tym: ??
object o = new object();

object o1 = o;
ChangeObject( ref o );
...

void ChangeObject( ref obj )
{
obj = new object();
}

Zmeni sa tym aj hodnota v o?? Ak hej tak sa zmeni aj o1??

Nahlásit jako SPAM
IP: 85.248.47.–
začinajúci programátor v .Net: C# & OpenTK: OpenGL( pouzivam ), OpenAL( zatial nepouzivam ), OpenCL( este som neskusal )
yterbium0
Stálý člen
22. 8. 2009   #12
-
0
-

no v tom čo si uviedol, ak to dobre napíšem,

tak v 2. obe budú odkazovať na rovnakú pamať v Heap.

následne v 3. sa odkaz o v stack zmení na tú hodnotu, kde sa vytvorí nový objekt obj.

z toho plynie že o1 bude mať tú čo malo úplne na začiatuku o. A potom o bude odkazovať na ten nový objekt čo si vytvoril v metode.

No ak sa nemýlim, ak hej tak ma opravte. :)

///
a preto nemám rád tie preklady, lebo niekedy sú totálne nevýstižné. Napríklad preklad "fields" do slovenčiny podľa mňa vôbec nie je vhodný.
A nikdy nevieš kto bude používať Tvoje knižnice, preto sa snažím ostávať apsoň tu v ENG...

Nahlásit jako SPAM
IP: 78.99.34.–
dannyk0
Věrný člen
22. 8. 2009   #13
-
0
-

Podle me to bude tak, ze o1 bude mit puvodni data z o na zacatku, a po ChangeObject bude mit o nove data a puvodni o data zaniknou.

Boze, tech o je nak moc :D

Nahlásit jako SPAM
IP: 85.135.97.–
Jedu v c++,c#,assembler,ASP.NET,PHP,databaze,bezpecnost softwaru[br] -----------------------------------------------------------[br] Muj blog o programovani,hudbe a vsem moznem,co najdu na netu :) [br] http://dannyk.aspone.cz[br] -----------------------------------------------------------[br] Na foru mam nejake prispevky pod nickem Master,tak jen pro upresneni :)
yterbium0
Stálý člen
22. 8. 2009   #14
-
0
-

lenže, ako môžú pôvodné dáta z "o" zaniknúť, keď na ne bude stále odkazovať o1?

veď to Garbage Collector tým pádom nezruší, nie náhodou?
Oba sú referenčné typy, a vlastne keď ešte aj do metody dá "ref", tak to bude len ako "prezývka", čiže by to malo zmeniť hodnotu "o" v stacku, aby odkazoval na ten nový objekt. Ale o1 nemá dôvod zaniknúť, takže nemôže ani to, čo vytvoril pôvodný "o" na heap. Resp. ma upresni, ja sa zatial len učím :smile18:



(ináč, má toto vôbec aj nejaký "praktický význam"?)
. Alebo sú to len tie "vychytávky" ľudí, čo napr. začnú písať nejaký seriál(o zahraničných vravím). A v prvej časti napíšu nejakú výraz s čislami a bez zátvoriek, a povedia Ti , že ak nedokážeš prísť na výsledok, tak pre Teba nemá zmysel pokračovať v jeho seriále :-/ . Pritom seriál bude o niečom úplne inom, a v pohode ho zvládneš.

To je až smutné podľa mňa niekedy.

P.S. týmto nechcem nikoho uraziť, vyjadrujem svoj názor, a snáď nespamujem :smile6:

Nahlásit jako SPAM
IP: 78.99.34.–
Miro17010
Stálý člen
22. 8. 2009   #15
-
0
-



///
a preto nemám rád tie preklady, lebo niekedy sú totálne nevýstižné. Napríklad preklad "fields" do slovenčiny podľa mňa vôbec nie je vhodný.
A nikdy nevieš kto bude používať Tvoje knižnice, preto sa snažím ostávať apsoň tu v ENG...


tak, ja 100% nazvov premennych pisem v angl., a aj xml doc v angl., nuz ale xml doc ma asi len 1% veci v mojom kode :smile1:





(ináč, má toto vôbec aj nejaký "praktický význam"?)
. Alebo sú to len tie "vychytávky" ľudí, čo napr. začnú písať nejaký seriál(o zahraničných vravím). A v prvej časti napíšu nejakú výraz s čislami a bez zátvoriek, a povedia Ti , že ak nedokážeš prísť na výsledok, tak pre Teba nemá zmysel pokračovať v jeho seriále :-/ . Pritom seriál bude o niečom úplne inom, a v pohode ho zvládneš.

To je až smutné podľa mňa niekedy.

P.S. týmto nechcem nikoho uraziť, vyjadrujem svoj názor, a snáď nespamujem :smile6:


neviem, dakde ide o to ze ci ten kto cita ma dobru logiku, cize ak ten priklad nepochopi, tak nebude vediet ani dobre programovat, ale pokial nejde o nejake skratky ktore nepozna

Nahlásit jako SPAM
IP: 85.248.47.–
začinajúci programátor v .Net: C# & OpenTK: OpenGL( pouzivam ), OpenAL( zatial nepouzivam ), OpenCL( este som neskusal )
dannyk0
Věrný člen
22. 8. 2009   #16
-
0
-

Ja to beru totiz tak, ze se ten objekt prekopiruje uplne a nejen preda odkaz. U tohoto prave nemam 100% jistotu, co se predava. Da se to zjistit docela jednoduse, napsat to a oddebugovat :)

Pokud by se to predavalo odkazem, tak puvodni data o budou drzene o1 a o dostane nova data z toho ChangeObject. Aspon to si myslim.

Nahlásit jako SPAM
IP: 85.135.97.–
Jedu v c++,c#,assembler,ASP.NET,PHP,databaze,bezpecnost softwaru[br] -----------------------------------------------------------[br] Muj blog o programovani,hudbe a vsem moznem,co najdu na netu :) [br] http://dannyk.aspone.cz[br] -----------------------------------------------------------[br] Na foru mam nejake prispevky pod nickem Master,tak jen pro upresneni :)
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 70 hostů

Podobná vlákna

Ukazovatele — založil Grungy

Unsafe chyba — založil wer

Copy may be unsafe — založil Porcepoque

Std::copy may be unsafe — založil Lizzyx

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý