Re: doplnění prvků do struktury

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


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
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240508/a851bfc6/attachment.htm>


Další informace o konferenci Hw-list