| | |
Autor | Správa |
---|
Registrovaný: 27.06.08 Prihlásený: 04.07.11 Príspevky: 114 Témy: 12 | Napísal Watik: 01.06.2009 19:22 | |
|
ako co sa tyka pointrov tak ak tie nevies a nevies ani pracu s pamatou to ako keby si ani C nevedel
|
|
Registrovaný: 08.03.09 Prihlásený: 06.10.20 Príspevky: 1116 Témy: 88 Bydlisko: 00100100 | Napísal autor témy reDo: 01.06.2009 20:09 | |
|
nwm len tu pamet lebo som tu len prebehjol okom
_________________ Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-) |
|
Registrovaný: 14.02.08 Prihlásený: 04.01.15 Príspevky: 1272 Témy: 46 Bydlisko: Bratislava | Napísal petos: 02.06.2009 13:37 | |
|
tak to si nemal, kedze pointre su srdcom a dusou jazyka C
_________________ CPU:AMD Phenom II X4 960T MB: GA-MA78GM S2H VGA: ASUS EAH4850 512MB DDR3 & AC L2 PRO RAM: 4x 1GB Kingstone 800Mhz PSU: CX400W HDD: SEAGATE Barracuda 7200.10 160GB + Seagate 320GB Monitor :19"LCD ASUS VB191T OS: Win 7 Ultimate 64 bit |
|
Registrovaný: 08.03.09 Prihlásený: 06.10.20 Príspevky: 1116 Témy: 88 Bydlisko: 00100100 | Napísal autor témy reDo: 02.06.2009 19:36 | |
|
pointeri celkom viem len ta alokacia
_________________ Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-) |
|
Registrovaný: 30.05.07 Prihlásený: 29.03.14 Príspevky: 641 Témy: 46 |
int i, *p;
i=123; p=&i; *p=789;
aku hodnotu bude mat i?
|
|
Registrovaný: 27.06.08 Prihlásený: 04.07.11 Príspevky: 114 Témy: 12 | Napísal Watik: 02.06.2009 20:18 | |
|
ze by 789 ??
pokial sa nemylim tak pointer ukazuje na adresu i a tym padom poslednym kodom sa *p "pozrie" na i a prepise ho na 789
|
|
Registrovaný: 30.05.07 Prihlásený: 29.03.14 Príspevky: 641 Témy: 46 |
ale to mal hadat redo ked hovori ze vie pointre ale inak dobre
|
|
Registrovaný: 27.06.08 Prihlásený: 04.07.11 Príspevky: 114 Témy: 12 | Napísal Watik: 03.06.2009 12:59 | |
|
nj tak daj iny trosku zlozitejsi som len myslel ze to tak si dal do plena
|
|
Registrovaný: 30.05.07 Prihlásený: 29.03.14 Príspevky: 641 Témy: 46 |
Kód: printf("neprospel"+2*(toupper(kod)=='P'));
co robi tento prikaz?
hadajte kto chcete
inak ja toto prilis neovladam, tento priklad mam od naseho prednasajuceho, nevedel by som co to robi keby to tam nemal napisane...
|
|
Registrovaný: 08.03.09 Prihlásený: 06.10.20 Príspevky: 1116 Témy: 88 Bydlisko: 00100100 | Napísal autor témy reDo: 03.06.2009 14:28 | |
|
nwm povedz
_________________ Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-) |
|
Registrovaný: 21.05.08 Prihlásený: 04.10.09 Príspevky: 21 Témy: 0 | Napísal J3rGuS: 03.06.2009 14:31 | |
|
Pekný príklad. Tuto máte malú ukážku ako si s tým poradí asm a čo sa vlastne deje.
Inak toto je praktický to isté a možno pre niekoho zrozumitelnejšie:
Kód: char kod[9]; strcpy(kod,"neprospel"); printf(&kod[2*(toupper(znak)=='P')]);
tzn. že je úplne jedno či tam bude konštantný tvar, alebo pole, pointer, atd.. Vždy to budú data a vždy bude ukazovať na začiatok tychto dat a je už každého vec ako s tým naloží, či už vo funkcii alebo niekde inde bude meniť ukazatel.
|
|
Registrovaný: 08.03.09 Prihlásený: 06.10.20 Príspevky: 1116 Témy: 88 Bydlisko: 00100100 | Napísal autor témy reDo: 03.06.2009 15:46 | |
|
no to so si myslel tiez ale asi to tak neni
_________________ Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-) |
|
Registrovaný: 30.05.07 Prihlásený: 29.03.14 Príspevky: 641 Témy: 46 |
to J3rGuS: neviem co mal robit tvoj kus kodu ale nerobi to co moj
moj ma robit to, ze ak je kod == 'p' alebo 'P' tak napise prospel a ak je nieco ine, napise neprospel
funguje to tak, ze ked je splnena podmienka, tak to ma hodnotu 1, vynasobi sa dvojkou, mame dvojku a potom ta finta s pointrami, ale to ja neviem ako presne funguje - proste sa zaciatok retazca posunie o 2, a pri kod != P sa dvojka nasobi nulou a tym padom sa zaciatok neposunie...
|
|
Registrovaný: 08.03.09 Prihlásený: 06.10.20 Príspevky: 1116 Témy: 88 Bydlisko: 00100100 | Napísal autor témy reDo: 03.06.2009 17:14 | |
|
ty brdo preco tu davas neco comu sam nechpes ?
_________________ Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-) |
|
Registrovaný: 21.05.08 Prihlásený: 04.10.09 Príspevky: 21 Témy: 0 | Napísal J3rGuS: 03.06.2009 17:51 | |
|
Citácia: to J3rGuS: neviem co mal robit tvoj kus kodu ale nerobi to co moj moj ma robit to, ze ak je kod == 'p' alebo 'P' tak napise prospel a ak je nieco ine, napise neprospel
No môj kód robí prakticky to isté čo tvoj (ak neveríš vyskúšaj si to), akurát ja som použil iný príklad, tj. s lokálnou premennou, kdežto ty máš použitú konštantu. Výhoda je podľa mna v tom že pri tvojom sa nemusí zapisovať žiaden string na stack, ale jednoducho sa posunie pointer v datovom segmente podla podmienky (viď obrázok).
|
|
Registrovaný: 08.03.09 Prihlásený: 06.10.20 Príspevky: 1116 Témy: 88 Bydlisko: 00100100 | Napísal autor témy reDo: 03.06.2009 17:53 | |
|
o com tocis?
_________________ Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-) |
|
Registrovaný: 30.05.07 Prihlásený: 29.03.14 Príspevky: 641 Témy: 46 |
J3rGuS: no ja som praveze tvoj kod skusil a vzdy vypisal neprospel, ale je pravda ze do toho prilis nevidim takze som to mozno skusal zle
reDo: pisem to sem preto lebo si machroval ze vies pointre, co sa mi zdalo dost nerealne, ja ich neviem skoro vobec ale ani ich momentalne vediet nepotrebujem.
|
|
Registrovaný: 14.02.08 Prihlásený: 04.01.15 Príspevky: 1272 Témy: 46 Bydlisko: Bratislava | Napísal petos: 03.06.2009 19:28 | |
|
reDo píše: pointeri celkom viem len ta alokacia
co presne nevies na alokacii?
_________________ CPU:AMD Phenom II X4 960T MB: GA-MA78GM S2H VGA: ASUS EAH4850 512MB DDR3 & AC L2 PRO RAM: 4x 1GB Kingstone 800Mhz PSU: CX400W HDD: SEAGATE Barracuda 7200.10 160GB + Seagate 320GB Monitor :19"LCD ASUS VB191T OS: Win 7 Ultimate 64 bit |
|
Registrovaný: 08.03.09 Prihlásený: 06.10.20 Príspevky: 1116 Témy: 88 Bydlisko: 00100100 | Napísal autor témy reDo: 03.06.2009 19:59 | |
|
no kedze so len tak obehol ockom takze viem len tak nazvy funkcii na alokaciu a idme si to dobrat a tie pointeri som myslel teoriu nie prex a hentake tazke to nevdel nikdo ani ty tak sa nesmej
_________________ Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-) |
|
Registrovaný: 30.05.07 Prihlásený: 29.03.14 Príspevky: 641 Témy: 46 |
ten druhy priklad bol dost tazky ale ak nevies ten prvy tak nevies pointre - nesmejem sa ti, ani ja ich dobre neviem, viem akurat zakladnu syntax a mierne to pouzit, dynamicky alokovat som uz tiez zabudol, akurat v pascale by som vedel spravit kvalitne dynamicke struktury
|
|
Registrovaný: 08.03.09 Prihlásený: 06.10.20 Príspevky: 1116 Témy: 88 Bydlisko: 00100100 | Napísal autor témy reDo: 03.06.2009 20:36 | |
|
ten prvy viem ale ten druhy som nevedel
_________________ Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-) |
|
Registrovaný: 30.04.08 Prihlásený: 15.05.15 Príspevky: 884 Témy: 3 |
Skusim to trochu upresnit.
Aku hodnotu ma vyraz "neprospel"? Predstavuje adresu v pamati, na ktorej je ulozeny znak 'n' (potom 'e', 'p' ... atd.). Preto ak mame definiciu
Kód: char * p = "neprospel"; do pointra p sa zapise adresa retazca "neprospel". Potom uz ide len o to, co pisal tlacitko Enter Kód: printf("neprospel"+2*(toupper(kod)=='P'));
ak sa vyhodnoti vyraz toupper(kod) == 'P' ako pravdivy, teda plati kod == 'p' alebo kod == 'P', vynasobi sa 2*1, teda k "neprospel" sa pricita hodnota 2, cize k adrese retazca "neprospel". Predpokladajme, ze "neprospel" ma hodnotu 10, teda retazec je ulozeny na adrese od 10 po nejakych 20. A vyraz "neprospel" + 2 ma teda hodnotu 12, cize fcii printf je predana adresa 12, na ktoru sa printf pozrie a vypisuje retazec od 12 az po 20(teda po znak '\0').
Ak ta podmienka neplati, tak 2*0 je 0 a printf obdrzi adresu "neprospel", teda ho vypise cely...
Edit1:
btw. Jergus, tvoj kod nemusi vzdy fungovat (aj ked vo vacsine pripadov dava spravne vysledky) ale alokoval si len 9 bajtov, pricom si mal 10 - zabudol si na '\0', ktory sa uz zapisal do cudzej pamate.
Edit2:
Hm ok, prave som si vsimol, ze co som vyssie pisal je aj v tom Jergusovom screene...
_________________ Empty your memory, with a free()… like a pointer! If you cast a pointer to an integer, it becomes the integer, if you cast a pointer to a struct, it becomes the struct… The pointer can crash…, and can overflow… Be a pointer my friend… |
|
Registrovaný: 21.05.08 Prihlásený: 04.10.09 Príspevky: 21 Témy: 0 | Napísal J3rGuS: 03.06.2009 21:20 | |
|
Inak pozor to čo písal neutronmind je len prirovnanie, tzn. že je rozdiel ak do printf dáš konštantu alebo pointer. Ale ideológia je v podstate správna (i keď sa k adrese v skutočonsti nič nepričítava).
Citácia: Edit1: btw. Jergus, tvoj kod nemusi vzdy fungovat (aj ked vo vacsine pripadov dava spravne vysledky) ale alokoval si len 9 bajtov, pricom si mal 10 - zabudol si na '\0', ktory sa uz zapisal do cudzej pamate.
Áno to je možne... No mne išlo len o samotnú funkciu.
|
|
Registrovaný: 30.04.08 Prihlásený: 15.05.15 Príspevky: 884 Témy: 3 |
J3rGuS píše: Inak pozor to čo písal neutronmind je len prirovnanie, tzn. že je rozdiel ak do printf dáš konštantu alebo pointer. Ale ideológia je v podstate správna (i keď sa k adrese v skutočonsti nič nepričítava).
Hm, preco?
_________________ Empty your memory, with a free()… like a pointer! If you cast a pointer to an integer, it becomes the integer, if you cast a pointer to a struct, it becomes the struct… The pointer can crash…, and can overflow… Be a pointer my friend… |
|
Registrovaný: 08.03.09 Prihlásený: 06.10.20 Príspevky: 1116 Témy: 88 Bydlisko: 00100100 | Napísal autor témy reDo: 03.06.2009 22:13 | |
|
neutromind asi jedniny chape o com ten kod bol
_________________ Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-) |
|
Registrovaný: 16.02.08 Prihlásený: 08.12.10 Príspevky: 235 Témy: 13 | Napísal ado21: 04.06.2009 16:55 | |
|
reDo píše: ty brdo preco tu davas neco comu sam nechpes ?
lebo je to forum?
|
|
Registrovaný: 16.02.08 Prihlásený: 08.12.10 Príspevky: 235 Témy: 13 | Napísal ado21: 04.06.2009 17:18 | |
|
Kód: printf("neprospel"+2*(toupper(kod)=='P')); Trochu pre objasnenie, treba si uvedomit klucove veci. Tato finta nemusi vzdy sa vsade fungovat, ale na beznych PC, ktore poznate, to funguje. Dovod? Pamat na beznych PC ma bloky rozdele po 1 byte = 8 bitov. Jeden znak sa zmesti do 8 bitov. Teda ak pointer posunie o 2, tak sa posunie o 2 bloky v pamati, co su 2 byty. Funguje to iba preto, ze znak ma 1 byt. Viem vela opakovania, ale mam skusenosti, ze sa to hodi. Napr. Kód: int i; i alokuje 4 byty = 32 bitov. Teda a zabera 4 bloky v pameti. Mame napriklad Kód: int pole[4] . Funguje to tak, ze pole je pointer na zaciatok pola, teda na nulty prvok. Ale vieme, ze int zabera 4 bajty, teda ak chceme treti prvok pola, tak ten dostaneme tak Kód: *(pole+2*4) co je presne to iste ako Kód: pole[2] . No ani int nemusi mat vzdy 4 byte, tak sa pre istotu kompabilitu pouziva Kód: *(pole+2*sizeof(int)). Klucom je uvedomit si to, ze bezna pamat sa alokuje po bytoch. Teda aj ked date v C++ bool b; tak b naalokuje 1 byte, lebo menej nemoze, aj ked moze nabyvat iba 2 hodnoty... Preto C nema typ bool, lebo autori C povazovali za plyvanie alokovat 1 byte = 8 bitov = 256 roznych hodnot pre bool, ktory ma iba 2 hodnoty. Co asi nie je najstatnejsie riesenie, lebo kedy sme chceil Kód: bool pole2[100]; tak v C++ sa vyuziju takmer vsetky hodnoty, kdez to ak chceme efektivne vyuzit pamat v C, tak si musime naprogramovat vlastne bitove pole.
|
|
Registrovaný: 08.03.09 Prihlásený: 06.10.20 Príspevky: 1116 Témy: 88 Bydlisko: 00100100 | Napísal autor témy reDo: 04.06.2009 17:28 | |
|
ozaj uz som sa naucil pracovbat s tou alokaciu v C stacilo to kuknut a uvedomit si to
_________________ Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-) |
|
Registrovaný: 16.02.08 Prihlásený: 08.12.10 Príspevky: 235 Témy: 13 | Napísal ado21: 04.06.2009 17:36 | |
|
alokacia == pridelenie pamati
pridelenie == rezervovanie
rezervovanie == obsadenie
obsadenie == uz tam nikto iny nema co robit
_________________ Učet je neaktívny. |
|
Registrovaný: 30.04.08 Prihlásený: 15.05.15 Príspevky: 884 Témy: 3 |
ado21 píše: Mame napriklad Kód: int pole[4] . Funguje to tak, ze pole je pointer na zaciatok pola, teda na nulty prvok. Ale vieme, ze int zabera 4 bajty, teda ak chceme treti prvok pola, tak ten dostaneme tak Kód: *(pole+2*4) co je presne to iste ako Kód: pole[2] . No ani int nemusi mat vzdy 4 byte, tak sa pre istotu kompabilitu pouziva Kód: *(pole+2*sizeof(int)). Dovolim si nesuhlasit. Kód: *(pole+2*4) nie je to iste co Kód: pole[2] . ale pole[2]== *(pole + 2), tzn. uz tam nemusis davat 2*sizeof(typ), kompilator to tam doplni implicitne na zaklade typu pointera. ado21 píše: Teda ak pointer posunie o 2, tak sa posunie o 2 bloky v pamati, co su 2 byty. Funguje to iba preto, ze znak ma 1 byt.
Preto neplati ani toto tvrdenie. Ak mas int pole[10], tak vyraz *(pole + 2) sa automaticky prevedie na *(pole + 2*sizeof(int)). O tom je pointerova aritmetika. Ak by si tam dal vsak to *sizeof(int) explicitne, tak to uz kompilator necha tak, cize nevznikne nieco ako *(pole + 2*sizeof(int)*sizeof(int))...
_________________ Empty your memory, with a free()… like a pointer! If you cast a pointer to an integer, it becomes the integer, if you cast a pointer to a struct, it becomes the struct… The pointer can crash…, and can overflow… Be a pointer my friend… |
|
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| Prenos premennych medzi funkciami v PHP, ASP | 6 | 529 | 27.08.2012 4:26 Ďuri | | Problém s 2 funkciami v JavaScript, VBScript, Ajax | 0 | 253 | 02.04.2013 17:34 maťo* | | Ako nastaviť všetkým EditBoxom jedno PopUp menu s funkciami? v Delphi, Visual Basic | 9 | 742 | 01.08.2010 22:22 Manny | | pomoc pomoc prosim nefunguje internet v Ovládače | 7 | 1129 | 09.09.2017 20:37 Smith Wesson | | Pomoc pri pomoc pri skladaní PC - od 1 500 do 1 800 Eur (rozlíšenie 1440p) v PC zostavy | 13 | 795 | 28.09.2023 20:23 johny314 | | Pomoc! v Procesory | 6 | 988 | 02.02.2008 18:27 Jaro | | pomoc v Ostatné | 13 | 951 | 08.08.2009 22:16 malcolm | | pomoc ! v Ovládače | 1 | 953 | 18.08.2007 16:07 johny128 | | Pomoc? v HTML, XHTML, XML, CSS | 1 | 548 | 09.08.2017 20:01 BX | | pomoc v Počítačové hry | 5 | 491 | 28.06.2011 16:32 Ďuri | | pomoc v ATI/AMD grafické karty | 3 | 699 | 04.03.2008 15:00 Mir | | Pomoc v Operačné systémy Microsoft | 3 | 627 | 29.12.2007 18:42 Dzimbo | | Pomoc v Zvuk | 2 | 837 | 24.11.2007 17:30 optyx | | pomoc v PHP, ASP | 2 | 786 | 02.02.2008 17:17 Punker661 | | pomoc v HTML, XHTML, XML, CSS | 1 | 374 | 18.10.2013 18:36 Ďuri | | pomoc v PHP, ASP | 6 | 709 | 01.08.2008 16:27 Darkeye18 |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|