Re: doplnění prvků do struktury

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Středa Květen 8 10:43:38 CEST 2024


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

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240508/63f95c51/attachment.htm>


Další informace o konferenci Hw-list