Znovupoužitelnost datových struktur v C

Re:Znovupoužitelnost datových struktur v C
« Odpověď #15 kdy: 04. 02. 2015, 07:55:18 »
Když už se tu znínila ta přenositelnost, tak například (co si tak pamatuji) po provedení něčeho takového

Kód: [Vybrat]
foo *x = neco;
foo *y = (foo*) ((bar*) x)

nemusí (kvůli rozdílným požadavkům foo a bar na zarovnání v paměti) vůbec platit y == x. S ukazateli se tedy ne vždy vyplatí různě kouzlit.


Kolemjdoucí

Re:Znovupoužitelnost datových struktur v C
« Odpověď #16 kdy: 04. 02. 2015, 08:25:59 »
např. pokud bys chtěl takový "zobecněný" list třídit, jak to budeš dělat? Přidáš do double-linked nějaký callback, který ex post opraví vazby? Nebo budeš uvnitř funkce pořád ifovat? ;) To by bylo přesně to peklo, do kterýho se dostat nechceš ;).

Vy už jste to zapomněl ? ;) Před OOP se porovnávalo takhle, úplně stejně to bude pro double-linked list:

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

Kód: [Vybrat]
foo *x = neco;
foo *y = (foo*) ((bar*) x)

V žádném známém překladači se do y nedostane jiná hodnota než je v x. Zarovnání se uplatní při deklaraci, ne při přetypování.

Re:Znovupoužitelnost datových struktur v C
« Odpověď #17 kdy: 04. 02. 2015, 09:03:18 »
Vy už jste to zapomněl ? ;) Před OOP se porovnávalo takhle, úplně stejně to bude pro double-linked list:
Problém není v porovnání, ale v přeskládání té struktury - u SLL musím udělat jiné operace než u DLL. Představa, že udělám jeden kód, který bude fungovat nad jakoukoli strukturou, není v tomhle případě úplně šťastná, pokud mi nejde čistě o bubble sort.

dl

Re:Znovupoužitelnost datových struktur v C
« Odpověď #18 kdy: 04. 02. 2015, 09:43:29 »
... Pořád je to ale "neCéčkovský" přístup, který bys měl volit jenom z hodně dobrých důvodů. ...

Nene, já se nasnažím za každou cenu naroubovat Javu na C, zkouším co se dá zpětně uplatnit. Víte dnes většina lidí nezačíná na C, takže se na mne nezlobte. Stejně jako pro C-čkaře mohl být přechod na OOP zas opačný problém .) -- Jinak jste to odhadl správně, že jsem narazil na problémy .), proto sem přišel s otázkou...

Proč podle vás nemají D-List a S-List společné operace?

insertAfter
insertBefore
insertBeginning
insertEnd
...

dl

Re:Znovupoužitelnost datových struktur v C
« Odpověď #19 kdy: 04. 02. 2015, 09:46:09 »
Doporučuji podívat se jak to dělají v Linuxovém jádru. Moc pěkné. Jednoduché výkonné a elegantní. Sám používám (svou lite) modifikaci pro jednočipy.

Díky, již jsem včera studoval a poznamenal jsem to v otázce -- také jiné knihovny, nějakou, kde mají většinu DS pomocí maker, a taky něco z NGinx a Asterisk.


dl

Re:Znovupoužitelnost datových struktur v C
« Odpověď #20 kdy: 04. 02. 2015, 09:51:51 »
Vy už jste to zapomněl ? ;) Před OOP se porovnávalo takhle, úplně stejně to bude pro double-linked list:
Problém není v porovnání, ale v přeskládání té struktury - u SLL musím udělat jiné operace než u DLL. Představa, že udělám jeden kód, který bude fungovat nad jakoukoli strukturou, není v tomhle případě úplně šťastná, pokud mi nejde čistě o bubble sort.

Já sem to myslel na úrovni hlavičkových souborů ... pro společné operace jeden header file a různé implemntace v Slisti a Dlistu, nebo nějaká společná makra.

Kolemjdoucí

Re:Znovupoužitelnost datových struktur v C
« Odpověď #21 kdy: 04. 02. 2015, 10:03:58 »
Představa, že udělám jeden kód, který bude fungovat nad jakoukoli strukturou, není v tomhle případě úplně šťastná, pokud mi nejde čistě o bubble sort.

Kód pro SLL/DLL musí být jiný, kód pro operace s uživatelskými daty v SLL/DLL může být stejný.

Já sem to myslel na úrovni hlavičkových souborů ... pro společné operace jeden header file a různé implemntace v Slisti a Dlistu, nebo nějaká společná makra.

Můžete mít void DirectoryList(LinkedListManager * manager, LinkedListControlData * control_data, char * directory) a naimplementovat si co potřebujete, ale je to tedy psaní moc.

Příklady nemůžete najít proto že single linked list už prakticky nikdo nepoužívá, kromě mikrokontrolérů.

Petr M

Re:Znovupoužitelnost datových struktur v C
« Odpověď #22 kdy: 04. 02. 2015, 10:08:14 »
Mrkni na http://www.root.cz/knihy/object-oriented-programming-in-ansi-c/

Jinak pokud jde o C, tak na jednočipech není obecně dynamická paměť dobrý nápad (a je pro to kupa hodně dobrých důvodů), na všem silnějším se dá použít C++

BrainLess

Re:Znovupoužitelnost datových struktur v C
« Odpověď #23 kdy: 04. 02. 2015, 10:22:05 »
Me pripada ze vsichni snazi resit jednoduche veci slozite ...

typedef struct tagLinkedList {
  void *pData;
  struct tagLinkedList *lpNext,*lpPrev;
} LINKEDLIST, *LPLINKEDLIST;

Re:Znovupoužitelnost datových struktur v C
« Odpověď #24 kdy: 04. 02. 2015, 10:26:48 »
Kód: [Vybrat]
foo *x = neco;
foo *y = (foo*) ((bar*) x)

V žádném známém překladači se do y nedostane jiná hodnota než je v x. Zarovnání se uplatní při deklaraci, ne při přetypování.

Tak jsem se koukal, co říká norma (C99). Pokud hodnota, na kterou odkazuje x, není správně zarovnána podle typu bar, pak výsledek operace (bar*) x není definován. Ovšem zpětná konverze na foo* musí zase dát původní hodnotu.

Moc bych to nepodceňoval, pokud si například udělám strukturu dvou 32bitových intů a pokusím se někdy ukazatel na ni přetypovat na ukazatel na 64bitový int, tak mi to na některých architekturách nemusí projít (pokud budou vyžadovat zarovnání 64bitových intů na 64 bitů).

Re:Znovupoužitelnost datových struktur v C
« Odpověď #25 kdy: 04. 02. 2015, 10:33:52 »
Nene, já se nasnažím za každou cenu naroubovat Javu na C, zkouším co se dá zpětně uplatnit. Víte dnes většina lidí nezačíná na C, takže se na mne nezlobte.
Samozřejmě :) Vůbec se nezlobím, akorát jsem chtěl říct, že častý problém začátečníků v jakémkoli jazyku je v tom, že se snaží do nového jazyka vkládat návyky z toho, který už umí. A většinou to dopadá špatně. Zkusit něco uplatnit je super, ale chce to nejprve *oba* jazyky dobre znát, aby člověk mohl dobře posoudit, jestli jde správným směrem. Začátečník to neposoudí.

Stejně jako pro C-čkaře mohl být přechod na OOP zas opačný problém
Však taky je :) Spousta lidí programuje strukturálně, akorát funkce nějak mírnixtýrnix sdruží v nějakých třídách a s OOP to nemá nic společného :)

 .) -- Jinak jste to odhadl správně, že jsem narazil na problémy .), proto sem přišel s otázkou...

Proč podle vás nemají D-List a S-List společné operace?
Společné funkce mají, ale problém nastane, pokud se budeš snažit v céčku udělat polymorfismus - tj. mít nějakou jednu funkci "sort", která bude umět pracovat s oběma strukturami. To prostě v tomhle případě není dobrý přístup, lepší je mít dvě implementace, každou pro tu konkrétní strukturu. Jestli je potom budeš chtít nějak zabalit, aby se volaly stejně pro obě struktury, to už je jiná otázka.

Re:Znovupoužitelnost datových struktur v C
« Odpověď #26 kdy: 04. 02. 2015, 10:40:13 »
Já sem to myslel na úrovni hlavičkových souborů ... pro společné operace jeden header file a různé implemntace v Slisti a Dlistu, nebo nějaká společná makra.
Jo, to je schůdný přístup za předpokladu, že ta makra jenom sjednocují interface a nic moc víc od nich nečekáš. Takhle to funguje v tom kernelu (nakolik to můžu posoudit).

I tak ale zůstává otázka, jestli to v céčku v nějaké konkrétní situaci dává nějaký smysl. Určitě je to super někde, kde očekávám od různých kusů software stejný interface (typicky pluginy). Jinde to ale může způsobit víc škody než užitku... Typicky se v C programuje tak, že když někam předám SLL, tak nad ním volám funkci určenou pro zpracování SLL a that's it ;)

BrainLess

Re:Znovupoužitelnost datových struktur v C
« Odpověď #27 kdy: 04. 02. 2015, 10:40:52 »
Nene, já se nasnažím za každou cenu naroubovat Javu na C, zkouším co se dá zpětně uplatnit. Víte dnes většina lidí nezačíná na C, takže se na mne nezlobte.
Samozřejmě :) Vůbec se nezlobím, akorát jsem chtěl říct, že častý problém začátečníků v jakémkoli jazyku je v tom, že se snaží do nového jazyka vkládat návyky z toho, který už umí. A většinou to dopadá špatně. Zkusit něco uplatnit je super, ale chce to nejprve *oba* jazyky dobre znát, aby člověk mohl dobře posoudit, jestli jde správným směrem. Začátečník to neposoudí.

Stejně jako pro C-čkaře mohl být přechod na OOP zas opačný problém
Však taky je :) Spousta lidí programuje strukturálně, akorát funkce nějak mírnixtýrnix sdruží v nějakých třídách a s OOP to nemá nic společného :)

 .) -- Jinak jste to odhadl správně, že jsem narazil na problémy .), proto sem přišel s otázkou...

Proč podle vás nemají D-List a S-List společné operace?
Společné funkce mají, ale problém nastane, pokud se budeš snažit v céčku udělat polymorfismus - tj. mít nějakou jednu funkci "sort", která bude umět pracovat s oběma strukturami. To prostě v tomhle případě není dobrý přístup, lepší je mít dvě implementace, každou pro tu konkrétní strukturu. Jestli je potom budeš chtít nějak zabalit, aby se volaly stejně pro obě struktury, to už je jiná otázka.

Proc dve impementace ?

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

Re:Znovupoužitelnost datových struktur v C
« Odpověď #28 kdy: 04. 02. 2015, 10:44:26 »
Proc dve impementace ?

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
Ach jo... druhej :)

No, protože tahle funkce může existovat jenom proto, že pracuje nad polem. Jak bys chtěl udělat stejně obecnou funkci a nevědět, jak uložená data jí předáš? Co když jí předám třeba strom?

Obecně to může fungovat tak maximálně pro bubble sort, který od struktury neočekává nic jinýho než operaci swap.

CC

Re:Znovupoužitelnost datových struktur v C
« Odpověď #29 kdy: 04. 02. 2015, 10:55:44 »
Pokud nevadi makra pak sys/queue.h (https://svnweb.freebsd.org/base/head/sys/sys/queue.h?view=markup sys/queue.h) muze byt cesta.