Re: doplnění prvků do struktury

Martin Záruba swz na volny.cz
Středa Květen 8 10:56:25 CEST 2024


Pobere. A já myslím, že je to dobře. Přece v té druhé struktuře x_ext 
říkám, že se skládá z proměnné x typu y (co je y jsem definoval předtím) 
a dále s proměnné c typu int a proměnné d typu int.

Ale ten zápis, kde místo typu použiji slovo struct pobere taky. Příkaz 
sizeof(x_ext) vrátí 4, což odpovídá délce c + d. Zřejmě tu řádku struct 
x; zahodí jako nesmysl.

Martin Záruba

Dne 8.5.2024 v 10:43 Jaroslav Buchta napsal(a):
> Ted jsem se do toho zamotal teda taky, musel bych si to vyzkouset.
> Ale mam podezreni, ze
> struct{
>  struct x;
>  int c;
>  int d;
> }x_ext;
>
> vytvori strukturu x s delkou 0B a nicim uvnitr a nijak nesouvisi s 
> globalni promennou x ? Zkusil bych udelat ruzne identifikatory.
> V tom novem prikladu to prekladac pobere? Nemelo by byt: struct y x;    ?
> Protoze y je jmeno struktury a x v prvnim bloku je instance promenne 
> te struktury myslim...
>
> Dne 08.05.2024 v 10:33 Martin Záruba napsal(a):
>>
>> Nějak mi to hlava nebere. Pokud napíšu:
>>
>> structy{
>> size_tsize;
>> inta;
>> intb;
>> }x;
>> struct{
>>  y x;
>> intc;
>> intd;
>> }x_ext;
>>
>> říkám že struktura x_ext má na začátku strukturu x kterou popisuje y. 
>> Pak se na prvky v ní mohu odkazovat
>>
>> x_ext.x.a
>>
>> ale pokud místo y v druhé struktuře použiju slovo struct, znamená to, 
>> že vznikne to samé, ale prvky z první struktury jsou nedostupné? 
>> Pokud ano, k čemu je to dobré?
>>
>> Pokud to ale udělám, tak, jak jsem to napsal, vznikly dvě proměnné x 
>> a x_ext. Logicky pokud změním x.a nezmění se x_ext.x.a. Takže to 
>> nejde takto použít.
>>
>> Jenže já potřebuji, aby se původní struktura, v našem příkladu x
>>
>> 1) rozšířila o prvky c, d přičemž všechny prvky (nejen ty nové) byly 
>> dostupné
>>
>> 2) aby struktura obsazovala souvislou oblast paměti. Tato oblast se 
>> pak předává jako pointer a délka rutině, která přes ethernet data 
>> přenese na server. Je docela složitá a nechci, aby se do ní muselo 
>> vrtat. Pouze zavolat s těmito dvěma parametry.
>>
>> Martin Záruba
>> Dne 8.5.2024 v 9:34 Jaroslav Buchta napsal(a):
>>> x ale neni promenna ale jmeno struktury. To je to same, jako byste 
>>> ji tam rozepsal treba jako mam v prikladu.
>>> promenna treba y by se definovala
>>> struct x y;
>>>
>>> Dne 08.05.2024 v 9:30 Martin Záruba napsal(a):
>>>>
>>>> Tomu rozumím, ale nějak mi nedochází, co vznikne z. Do struktury 
>>>> pochopitelně mohu vložit další strukturu, ale co se stane, když 
>>>> vložím PROMĚNNOU typu struct, což je v té druhé definici.
>>>>
>>>> struct{
>>>>  size_t size;
>>>>  int a;
>>>>  int b;
>>>> }x;
>>>>
>>>> struct{
>>>>  struct x;
>>>>  int c;
>>>>  int d;
>>>> }x_ext;
>>>>
>>>> Tedy co vlastně obsahuje x_ext
>>>>
>>>> Martin Záruba
>>>> Dne 8.5.2024 v 9:09 Jaroslav Buchta napsal(a):
>>>>> size je tam podle me pro kontrolu, ze je struktura spravneho typu 
>>>>> a navic si pak muze funkce rozlisit, jakeho konkretniho typu, 
>>>>> pokud je vic variant. Pokud potrebuje jen tu zakladni, tak ta je k 
>>>>> dispozici vzdy, pokud chce pristupovat na nejake rozsireni, mela 
>>>>> by si aspon zkontrolovat velikost, jestli nesaha mimo.
>>>>> A soucasti struktury mohou byt dalsi struktury, uniony, pole... To 
>>>>> prekladac pochopi spravne a proste to tam vlozi. Pokud je vlozena 
>>>>> struktura nepojmenovana, pristupuje se k prvkum jako by to 
>>>>> struktura nebyla, predpokladam.
>>>>> takze kdyz napisu:
>>>>>
>>>>> union {
>>>>>     struct {
>>>>>         int a;
>>>>>         int b;
>>>>>     };
>>>>>     char c[256];
>>>>> } u;
>>>>>
>>>>> tak muzu psat u.x[0] = 1; u.a = 123; ...
>>>>> samozrejme musi byt ruzne identifikatory, typicky je to zajisteno 
>>>>> nejakym prefixem.
>>>>>
>>>>> Dne 08.05.2024 v 7:58 Martin Záruba napsal(a):
>>>>>>
>>>>>> Nějak mám dlouhé vedení....
>>>>>>
>>>>>> K čemu je size_t size; v strukturách?
>>>>>>
>>>>>> Jak se při použití x_ext v posledním zápisu struktury dostanu na 
>>>>>> prvek a? Není mi jasné, co kompilátor vytvořil z poslední 
>>>>>> definice x_ext, protože neřve. Ale x přece není popis struktury, 
>>>>>> ale proměnná typu struct
>>>>>>
>>>>>>
>>>>>> Martin Záruba
>>>>>> Dne 7.5.2024 v 23:27 Miroslav Šinko napsal(a):
>>>>>>> Inspirujte sa napr. vo WinAPI. Nejdem nic kopirovat, napisem 
>>>>>>> pointu:
>>>>>>>
>>>>>>> struct{
>>>>>>>  size_t size;
>>>>>>>  int a;
>>>>>>>  int b;
>>>>>>> }x;
>>>>>>>
>>>>>>> Potom si niekto moze spravit:
>>>>>>> struct{
>>>>>>>  size_t size;
>>>>>>>  int a;
>>>>>>>  int b;
>>>>>>>  int c;
>>>>>>>  int d;
>>>>>>> }x_ext;
>>>>>>>
>>>>>>> Aby nebolo treba copy/paste, tak takto:
>>>>>>> struct{
>>>>>>>  struct x;
>>>>>>>  int c;
>>>>>>>  int d;
>>>>>>> }x_ext;
>>>>>>>
>>>>>>> Kazdy je povinny pri naplnani struktury vyplnit 
>>>>>>> size=sizeof(<moja_struktura>) a pri pouziti si skontrolovat 
>>>>>>> size, ci mozem pristupovat na premenne svojej struktury.
>>>>>>>
>>>>>>> miro
>>>>>>>
>>>>>>>
>>>>>>> On 7.5.2024 18:02, Martin Záruba wrote:
>>>>>>>> Mám soubor, třeba muj.h ve kterém je deklarovaná struktura x, 
>>>>>>>> třeba
>>>>>>>>
>>>>>>>> struct{
>>>>>>>> inta;
>>>>>>>> int b;
>>>>>>>> }x;
>>>>>>>>
>>>>>>>> Soubor je pomocí include vložen do hlavního programu. A já bych 
>>>>>>>> potřeboval, aby uživatel, který použije #include muj.h mohl do 
>>>>>>>> té struktury vložit další prvky, takže struktura by se o tyto 
>>>>>>>> prvky (které v ní nejsou definované) rozšířila. Vymyslel jsem 
>>>>>>>> toto:
>>>>>>>>
>>>>>>>> structstru {
>>>>>>>> inta;
>>>>>>>> int b;
>>>>>>>> #ifdefuser
>>>>>>>>    user
>>>>>>>> #endif
>>>>>>>> };
>>>>>>>>
>>>>>>>> A v uživatelském programu použít
>>>>>>>>
>>>>>>>> #defineuser\
>>>>>>>> intc; \
>>>>>>>> intd;
>>>>>>>>
>>>>>>>> Asi to vypadá jako divný požadavek, ale mě jde o to, aby 
>>>>>>>> struktura x byl jeden prvek, který obsahuje jak mé, tak 
>>>>>>>> uživatelem vytvořené členy.
>>>>>>>>
>>>>>>>> Je na tom něco v nepořádku nebo to lze udělat líp?
>>>>>>>>
>>>>>>>>
>>>>>>>> -- 
>>>>>>>>
>>>>>>>> Martin Záruba
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> HW-list mailing list  -  sponsored by www.HW.cz
>>>>>>>> Hw-list na list.hw.cz
>>>>>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> HW-list mailing list  -  sponsored by www.HW.cz
>>>>>>> Hw-list na list.hw.cz
>>>>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>>>>
>>>>>> _______________________________________________
>>>>>> HW-list mailing list  -  sponsored bywww.HW.cz
>>>>>> Hw-list na list.hw.cz
>>>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> HW-list mailing list  -  sponsored bywww.HW.cz
>>>>> Hw-list na list.hw.cz
>>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>>
>>>> _______________________________________________
>>>> HW-list mailing list  -  sponsored bywww.HW.cz
>>>> Hw-list na list.hw.cz
>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>
>>>
>>>
>>> _______________________________________________
>>> HW-list mailing list  -  sponsored bywww.HW.cz
>>> Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored bywww.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored bywww.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240508/da36fbf7/attachment-0001.htm>


Další informace o konferenci Hw-list