Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 13. diel - Štruktúry v jazyku C

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
emedla
Člen
Avatar
emedla:3.12.2014 21:52

Prosím o vysvětlení tohoto rozdílu:

char jmena[10];
char jmena[10][20]

V prvním případě je číslo 10 délka řetězce
a ve druhém to má jaké funkce?
Napadá mě, že ve druhém případě je desítka pouze jakési číselné označení celého řetězce a druhá závorka délka. Ale asi to tak nebude, protože, když to zkusím napsat, tak to nefunguje. Hodí mi to chybu.

Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na emedla
David Hartinger:4.12.2014 9:42

V clanku je to přeci vysvětleno.

Odpovedať
New kid back on the block with a R.I.P
Avatar
Neaktivní uživatel:24.9.2015 17:53

Dodám, že v C++ je možné mít ve struktuře i funkce :-)

Odpovedať
Neaktivní uživatelský účet
Avatar
David Novák
Tvůrce
Avatar
Odpovedá na Neaktivní uživatel
David Novák:24.9.2015 18:27

Zajímavé..

Technicky bude do struktury uložen ukazatel na danou funkci?

Odpovedať
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovedá na David Novák
Drahomír Hanák:24.9.2015 18:49

Pokud vím tak se v C++ dá se strukturami pracovat úplně stejně jako s třídami (včetně konstruktoru, destruktoru, přetěžování operátorů apod.). Jediný rozdíl (z pohledu jazyka) je výchozí přístup k těm vlastnostem a funkcím. Implementace je nejspíš na překladači, ale podle toho, co vím, je to stejné jako s funkcemi ve třídě, a tak s nimi nejde manipulovat jako s pointerem.

Avatar
David Novák
Tvůrce
Avatar
Odpovedá na Drahomír Hanák
David Novák:24.9.2015 19:22

To někdy, až se budu nudit, vyzkouším.. Protože ta definovaná funkce musí být uložena někde v paměti programu a z bezpečnostních důvodů se nemíchají data a kód (fce jsou tedy uloženy v sekci kódu). Když se alokuje staticky struktura, bude v datové oblasti, když dynamicky tak na hromadě nebo zásobníku.

Takže předpokládám, že technicky bude ve struktuře pouze ukazatel někam do sekce kódu, kde se bude nacházet tělo funkce. :)

Odpovedať
Chyba je mezi klávesnicí a židlí.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovedá na David Novák
Lukáš Hruda:24.9.2015 20:55

Instance struktury sama o sobě metody vůbec neobsahuje, ty se překládají v podstatě jako obyčejné funkce, které danou instanci přebírají parametrem, rozdíl je pak jenom v tom, jak si překladač ve svém object kódu funkci pojmenuje, pokud patří třídě nebo struktuře, přidá si tam nějaký identifikátor. Jinak struktura a třída je v C++ to samé, rozdíl je pouze v implicitních modifikátorech přístupu, kde struktura má implicitně všechny položky public, zatímco třída private.

Avatar
Lukáš Hruda
Tvůrce
Avatar
Lukáš Hruda:24.9.2015 21:11

Samozřejmě trochu jiná je situace ve chvíli, kdy je metoda označená jako virtuální, pak instance obsahuje ještě pointer do vtable.

Avatar
DarkCoder
Člen
Avatar
DarkCoder:27.11.2019 21:40

Upřesním text článku:

Pokud se k prvkům struktury přistupuje pomocí strukturové proměnné, používá se tečkový operátor. Pokud se k prvkům struktury přistupuje pomocí ukazatelové proměnné, používá se šipkový operátor.

#include <stdio.h>

struct s_point {
        int x;
        int y;
};

int main(void) {
        struct s_point point, *ppoint;

        // prirazeni adresy struktury ukazatelove promenne
        ppoint = &point;

        // teckovy operator
        // pristup k prvkum struktury pomoci strukturove promenne
        point.x = 10;
        point.y = 20;

        // sipkovy operator
        // pristup k prvkum struktury pomoci ukazatelove promenne
        ppoint->x = 10;
        ppoint->y = 20;

        return 0;
}

Následující kód je naprosto korektní

struct {
    char jmeno[51];
    int vek;
    char ulice[51];
}  uzivatele[10];

Že chybí jméno typu struktury vůbec nevadí. Tento zápis se používá tam, kde se ví, že se bude používat pevný počet strukturových proměnných. Pro praktické programování se ale jméno typu struktury bude používat, popřípadě vytvoření nového typu pomocí typedef.

Uniony jsou jistým druhem struktur kde prvky unionu sdílejí stejný paměťový prostor. V danou chvíli lze používat pouze jednu proměnnou unionu. Smysl použití unionu je jinde nežli u struktury a jsou oblasti, kde se používá velmi často (zejména tam kde je třeba interpretovat data dvěma nebo více odlišnými způsoby, embeded systémy, práce s událostmi, různé konverze a další).

#include <stdio.h>

struct s_type {
        int x;
        double y;
};

union u_type {
        int x;
        double y;
};

int main(void) {
        struct s_type s;
        union u_type u;

        printf("Velikost int: %d bytu\n", sizeof(int));
        printf("Velikost double: %d bytu\n", sizeof(double));
        printf("Velikost strukturove promenne: %d bytu\n", sizeof(s));
        printf("Velikost unionove promenne: %d bytu\n", sizeof(u));

        return 0;
}

Výše uvedený příklad ukazuje rozdíl ve velikosti strukturové proměnné a unionové proměnné. U strukturové proměnné lze pracovat současně se všemi jejími prvky (v paměti jsou uloženy za sebou). U unionové proměnné lze pracovat pouze s jednou proměnnou (v paměti se překrývají, všechny mají nastaven offset na 0).

Velikost unionové proměnné je dána velikostí největšího prvku plus možným zarovnáním. Velikost strukturové proměnné je dána součtem prvků plus zarovnáním. Pro zjištění velikosti struktury a unionu se tak bezpodmínečně používá operátor preprocesoru sizeof (viz. příklad výše, kde velikost struktury neodpovídá součtu velikostí int a double typů).

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
DarkCoder:10. februára 12:17

Proč v článku nejsou uvedeny další operace se strukturami?

  • inicializace struktury
  • inicializace pole struktur
  • předávání struktury funkci
  • vracení struktury z funkce
  • přiřazování struktur
  • porovnávání struktur
  • tvorba složených struktur
  • zjištění velikosti struktury
  • změna členu struktury
Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 10.