Stránka: 1 z 1
| [ Príspevkov: 13 ] | |
Autor | Správa |
---|
Registrovaný: 06.06.12 Prihlásený: 24.06.15 Príspevky: 64 Témy: 19 | 19 Bydlisko: Michalovce |
Zdravicko. Robim v jazyku C resp. ucim sa a narazil som ta taky problem. Presiel som k teme typecasting resp. pretypovanie.
pretypovanie ty ktory to vedia tak vedia o co sa jedna ty ktory to nevedia v skratke je to zmena formatu premennej v danom riadku.
pretypovanie funguje nejak takto:
(format_na_ktory_sa_ma_premenna_pretypovat) premenna
lenze ja som narazil na taky mensi problemik ze som pri tom pretypovani narazil aj na pretyp v takomto zlozeni:
(char *) premenna... (int *) premenna...
lenze neviem naco tam je ta hviezdicka. Ty ktory vedia tak pls pomozte obzvlast dakujem
|
|
Registrovaný: 11.01.09 Prihlásený: 25.12.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova | |
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | 3 |
V tom čo píšeš nevidím problém. Ako píšeš, je to zmena typu premennej - to, že nevieš, že aj int* je typ, to už je tvoj problém. Funguje to ale vždy rovnako, nech je tam čokoľvek (Kľudne môžeš používať aj vlastné typy)
Plus, používaj radšej väzbu typ premennej - predsa len je to pretypovanie, nie preformatovanie.
|
|
Registrovaný: 06.06.12 Prihlásený: 24.06.15 Príspevky: 64 Témy: 19 | 19 Bydlisko: Michalovce |
ale ved toto co ty vravis int*... akoze co to je za vec? ved su 3 zakl. druhy... int, char, float. a potom su este short,long,boolean atd ale to su uz vedlajsie.
viem ze hviezdicka ako taka sluzi bud na pomenovanie ukazovatela.. ze istu premennu zmenis na ukazovatela takym sposobom ze tam das hviezdicku ALEBO ked pouzivas unarny operator dereference tak tam tiez je hviezdicka ale pri pretypovani na dajak typ (int *) toto nemam vobec sajnu o co ide.
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | 3 |
Žiadne vedľajšie nie sú. Možno máš na mysli primitívne typy, ale to si tiež netrafil.
Prečítaj si poriadne ešte raz kapitolu "Datové typy" a potom aj ten článok od Fica.
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 06.06.12 Prihlásený: 24.06.15 Príspevky: 64 Témy: 19 | 19 Bydlisko: Michalovce |
okey lebo ako kukam zase sa stretavam s tymy typmi (char *) a (int *) a uz mi to lezie na nervy ... idem prestudovat.. len akoze zatial som sa nikde s nicim takym nestretol tak len neviem aky je to datovy typ... a btw. ten clanok datove typy... to je od koho??
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | 3 |
Odkiaľ sa učíš C? Presne tam určite nájdeš celú kapitolu o datových typoch. Ak nie, zahoď to a nájdi si iný zdroj/knihu.
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 27.12.08 Prihlásený: 13.12.22 Príspevky: 1874 Témy: 96 | 96 Bydlisko: Bratislava,... |
* slúži na označenie smerníka (ukazovateľa, pointra), alebo ako dereferenčný operátor, v tomto prípade sa však jedná o smerník. Smerník má väčšinou tiež svoj typ (resp. typ, na ktorý smerník ukazuje), int* je smerník na premennú typu int, char* je smerník na premennú typu char. (Medzi typom premennej a hviezdičkou môže a nemusí byť medzera).
Tak isto, ako môžeš pretypovať premennú (napr. z char na int) štýlom Kód: char a = 'A'; int b = (int) a; // 65 , tak môžeš pretypovať aj smerník (napr. z bool* na char*) štýlom Kód: bool a = true; bool *b = &a; char *c = (char *) b; char d = *c; // v premennej d bude teraz znak s ascii kódom 1 Avšak vo svojej podstate jazyk C umožňuje robiť aj škaredé veci ako pretypovať normálnu premennú na smerník bez akéhokoľvek varovania štýlom Kód: int a = 1; int *b = (int *) a; (smerník b bude ukazovať na adresu s označením 0x1, avšak po prístupe k tejto adrese program s vysokou pravdepodobnosťou spadne lebo tam nemá čo šahať), alebo pretypovať smerník ukazujúci na premennú veľkosti 1B na smerník ukazujúci na premennú veľkosti 4B (napr. z char* na int*), v tomto prípade však výsledný smerník nebude ukazovať na číslo rovnajúce sa ascii kódu znaku na ktorý ukazoval smerník char*. Na takéto veci však kompilátor opäť neupozorní, preto treba pred tým, ako začneš manipulovať so smerníkmi poriadne pochopiť ako fungujú (napr. z Ficovho článku)
_________________ ~Listen to your brain, not your heart~ NB1: Lenovo Y500: CPU: Intel Core i7-3630QM; GPU: nVidia GT650M 2GB SLi; RAM: 16GB DDR3; HDD: 1TB + 256GB SSD (m4); LCD: 15,6" 1920x1080; OS: Win8.1 64-bit + Arch Linux 64-bit (UEFI Powered DualBoot) NB2: Asus K53SJ-SX093: CPU: Intel Core i3-2310M; GPU: Intel HD3000 / nVidia GT520M 1GB Optimus; RAM: 8GB DDR3; SSD: 128GB 840Evo; LCD: 15,6" 1366x768; OS: Win 8.1 Pro 64-bit (UEFI) |
|
Registrovaný: 06.06.12 Prihlásený: 24.06.15 Príspevky: 64 Témy: 19 | 19 Bydlisko: Michalovce |
Kód: bool a = true; bool *b = &a; char *c = (char *) b; char d = *c; // v premennej d bude teraz znak s ascii kódom 1 otazocka smerom na char d = *c ... tam ked si uz raz C definoval ako smernik tak je ho potrebne definovat este raz?? ptom ti kompilator vyhodi chybu nie?... a comu som ja nechapal je presne toto: Kód: char *c = (char *) b; toto (char *) ... ja som len nevedel ze co to robi ale tak asi tomu uz chapem.. ked pouzijes pretyp tvaru (char *) to znamena ze pretypujes danu premennu na format char ale takisto ju zmenis na ukazatela resp. smernik???? dobre som tomu pochopil?... no a potom je tu zasa druha vec co som teraz nasiel jednu funkciu na basic input funkcia gets() zaklad tej funkcie vyzera asi takto nejak Kód: #include <stdio.h> char *fgets(char *buf, int size, FILE *fp);
ale teraz je tu druha otazka... len ju napisem.. kedze fgets() je funkcia... AKO DOCERTA JU MOZES PRETYPOVAT NA UKAZATELA?! omg..
|
|
Registrovaný: 27.12.08 Prihlásený: 13.12.22 Príspevky: 1874 Témy: 96 | 96 Bydlisko: Bratislava,... |
Kód: char d = *c; V tomto riadku je * dereferenčný operátor. Keď je c premennou typu char*, tak napísaním c pristupuješ k adrese, na ktorú c ukazuje. Napísaním *c smerník dereferencuješ, teda pristupuješ k hodnote, na ktorú smerník ukazuje (a keďže je c smerník typu char*, tak sa predpokladá, že ukazuje na premennú typu char). Ďalej musíš pochopiť že Kód: char* a; Kód: char * a; Kód: char *a; sú tri zápisy tej istej veci a že hviezdička v tomto prípade má inú funkciu ako v prípade Kód: char a = *b; Ďalšia vec je, že so smerníkmi môžeš narábať ako s normálnymi dátovými typmi, teda ich môžeš pretypovávať a tiež obyčajné funkcie môžu vracať nielen hodnotu, ale aj smerník na hodnotu. Kód: char *c = (char *) b; je pretypovanie b z typu smerník na bool na typ smerník na char. Kód: char *fgets(char *buf, int size, FILE *fp); je funkcia, ktorá vracia premennú typu smerník na char. Tu nejde o žiadne pretypovanie ale o typ návratovej hodnoty funkcie.
Pre lepšie pochopenie si prečítaj Ficov článok http://www.pcforum.sk/pochopenie-smerni ... 34003.html
_________________ ~Listen to your brain, not your heart~ NB1: Lenovo Y500: CPU: Intel Core i7-3630QM; GPU: nVidia GT650M 2GB SLi; RAM: 16GB DDR3; HDD: 1TB + 256GB SSD (m4); LCD: 15,6" 1920x1080; OS: Win8.1 64-bit + Arch Linux 64-bit (UEFI Powered DualBoot) NB2: Asus K53SJ-SX093: CPU: Intel Core i3-2310M; GPU: Intel HD3000 / nVidia GT520M 1GB Optimus; RAM: 8GB DDR3; SSD: 128GB 840Evo; LCD: 15,6" 1366x768; OS: Win 8.1 Pro 64-bit (UEFI) |
|
Registrovaný: 06.06.12 Prihlásený: 24.06.15 Príspevky: 64 Témy: 19 | 19 Bydlisko: Michalovce |
aha okey. idem kuknut na ten clanok a co sa tyka tych funkcii to je vzdy tak ze sa zapise daco pred funkciu a vsetci automaticky vedia ze taky je vystup.?
a k tomu (char *)
to som dobre pochopil ze je to pretypovanie istej premennej resp. smernika na format char a smernik ?.. ze trebarz ked dam ze
Kód: (char *) int i;
tzn. nielen ze som "i" pretypoval na format char ale takisto som ho zmenil na smernik?
len ma uisti ci to tak je a ked nie uved veci na pravu mieru... naozaj dakujem za tu trpezlivost s mojou hlavou deravou
|
|
Registrovaný: 27.12.08 Prihlásený: 13.12.22 Príspevky: 1874 Témy: 96 | 96 Bydlisko: Bratislava,... |
Každá funkcia má svoj návratový typ, hodnotu tohto typu potom vracia. Napr. Kód: int scitaj(int a, int b); vracia premennú typu int. Formát a typ sú hlavne v jazyku C dve rozdielne veci. To, že je premenná typu char totižto neznamená, že v nej nutne musí byť znak, môže v nej byť aj ľubovoľné číslo od -128 do 127. Potom túto premennú môžeš pri výpise formátovať ako znak (%c) alebo ako číslo (%d). (Preto sa aj pretypovanie volá pretypovanie a nie preformátovanie). Kód: (char*) int i; je neplatný zápis, kľúčové slovo int tam nemá čo robiť. A chápeš to zle. Premennú, hodnotu, ani nič nemeníš na smerník. Existuje dátový typ smerník, ktorý slúži na uloženie pamäťovej adresy. Tento dátový typ ďalej máva určené aký typ premennej by sa mal nachádzať na pamäťovej adrese na ktorú ukazuje. Pamäťový typ smerník na char má zápis Kód: char* c V premennej c je uložená pamäťová adresa. Pamäťová adresa je číslo, v 32-bitových programoch 32-bitové, v 64-bitových programoch 64-bitové (Poväčšine). Aj keď urobíš smerník napr. na float štýlom Kód: float* f f bude dátový typ smerník, čiže celé číslo, pamäťová adresa. Ak chceš vypísať adresu, na ktorú f ukazuje, použiješ výpis Kód: printf("%x",f); Používam %x, pretože adresy sa väčšinou uvádzajú v 16-kovej sústave. Okrem tohoto existuje aj referenčný a dereferenčný operátor. Dereferenčný operátor je zhodou okolností opäť hviezdička a toto ťa mýli. Dereferenčný operátor pred názvom pointra vráti hodnotu, na ktorú pointer ukazuje. Referenčný operátor (&) pred názvom premennej vráti adresu, na ktorej sa premenná nachádza. Kód: char a = 'A'; char* b = &a; V tomto, ani podobných prípadoch nemeníš premennú a na smerník. a stále ostáva premennou typu char, v ktorej je uložené písmenko A. Premenná b je smerník na char, ktorý odkazuje na premennú A. S týmto smerníkom teraz môžeš pracovať ako so smerníkom. Zápis &a nemení a na smerník, ale vracia adresu premennej A. Zápis *b nemení b na smerník, b je smerník a týmto zápisom pristupuješ k premennej, na ktorú ukazueje, teda k premennej a. Po takomto zápise môžeš hocikde v kóde nahradiť a zápisom *b a efekt bude úplne rovnaký. Kód: int i = 1; int *j = &i; char *c = (char *) j; V tomto prípade sa deje to, že do smerníku j som vložil adresu premennej i (druhý riadok). V treťom riadku pretypovávam typ smerník na int na typ smerník na char.
_________________ ~Listen to your brain, not your heart~ NB1: Lenovo Y500: CPU: Intel Core i7-3630QM; GPU: nVidia GT650M 2GB SLi; RAM: 16GB DDR3; HDD: 1TB + 256GB SSD (m4); LCD: 15,6" 1920x1080; OS: Win8.1 64-bit + Arch Linux 64-bit (UEFI Powered DualBoot) NB2: Asus K53SJ-SX093: CPU: Intel Core i3-2310M; GPU: Intel HD3000 / nVidia GT520M 1GB Optimus; RAM: 8GB DDR3; SSD: 128GB 840Evo; LCD: 15,6" 1366x768; OS: Win 8.1 Pro 64-bit (UEFI) |
|
Registrovaný: 06.06.12 Prihlásený: 24.06.15 Príspevky: 64 Témy: 19 | 19 Bydlisko: Michalovce |
asi som tomu pochopil diki.
|
|
Stránka: 1 z 1
| [ Príspevkov: 13 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| v Assembler, C, C++, Pascal, Java | 1 | 785 | 27.06.2009 8:47 neutronmind | | v Technológia .NET | 5 | 2172 | 07.12.2008 21:41 vyhno | | v Ostatné programy | 15 | 678 | 01.02.2016 8:42 shiro | | v Obchody, reklamácie a právo | 5 | 751 | 31.08.2010 10:40 Mego | | v Assembler, C, C++, Pascal, Java | 12 | 702 | 11.10.2011 22:36 Milsa | | v Assembler, C, C++, Pascal, Java | 1 | 657 | 03.10.2009 18:07 plna.hlava | | v Assembler, C, C++, Pascal, Java | 1 | 346 | 13.01.2021 17:17 Jur_3 | | v Ostatné | 1 | 528 | 15.09.2009 22:26 shiro | | v Operačné systémy Microsoft | 0 | 462 | 31.10.2013 9:25 Palec | | v Assembler, C, C++, Pascal, Java | 4 | 800 | 07.08.2009 22:15 marian_sk | | v Ostatné | 1 | 2406 | 28.01.2012 22:06 MTK | | v Modifikácie, návody a projekty | 6 | 1737 | 21.02.2009 12:40 tommy1104 |
|