From: Henning, B. <bri...@na...> - 2002-09-26 15:00:14
|
Hello, i am trying to write a stack library in c that is generic as possible.. is there a way to do it without function pointers? is there anything else that i can do to make it more generic... handle strings, ints, chars, doubles, and other misc datatypes? thanks, brian stack.h -------- struct node_tag { void *value; struct node_tag *next; } NODE; typedef NODE * STACK; void stack_init( STACK ); int stack_push( STACK, const void * ); int stack_pop( STACK ); void stack_print( const STACK, void (*)(const void *) ); stack.c ------- the impimentation of the functions in the header file. main.c ------ #include <stdio.h> #include "stack.h" void stack_print( const void * ); int main( int argc, char *argv[] ) { ... } void stack_print( const void *value ) { ... } |
From: Oscar F. <of...@wa...> - 2002-09-26 16:27:15
|
"Henning, Brian" <bri...@na...> writes: > Hello, > i am trying to write a stack library in c that is generic as possible.. is > there a way to do it without function pointers? Sure, there are several ways to do it, each with a different degree of convenience (either for the user or the library writer). > is there anything else that > i can do to make it more generic... Yes, switch to C++. Any step you do towards generality in C is four steps towards unmaintainable, bug prone, hard to use software. > handle strings, ints, chars, doubles, and other misc datatypes? Sorry, you are trying to use C for something it doesn't play well. [snip] -- Oscar |
From: Manu \(mingw-users\) <min...@li...> - 2002-09-27 06:43:36
|
Oscar Fuentes wrote: > "Henning, Brian" writes: > > > Hello, > > i am trying to write a stack library in c that is generic as possible.. is > > there a way to do it without function pointers? > > Sure, there are several ways to do it, each with a different degree of > convenience (either for the user or the library writer). > > > is there anything else that > > i can do to make it more generic... > > Yes, switch to C++. I was silently thinking the same. Well, if Brian switches to C++, I have a generic linked list that may help: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/visual-mingw/visual-mingw/src / I'm very happy with it, since it's fast, light and generic. It wouldn't be difficult to write a stack inspired on it. See CList.cpp, CList.h. The code is public domain. > Any step you do towards generality in C is four steps towards > unmaintainable, bug prone, hard to use software. > > > handle strings, ints, chars, doubles, and other misc datatypes? > > Sorry, you are trying to use C for something it doesn't play well. > Precisely, an advantage of C++ is the inheritance. For example, a class can inherit of list nodes. Then you can handle any kind of data. eg: // The basic list node. class CNode { public: CNode() {next = prev = NULL; _type = 0;}; ~CNode() {}; CNode *prev; CNode *next; protected: unsigned int _type; }; // A derived class. class CMyNode : public CNode { public: CMyNode() {_type = MY_NODE_TYPE;}; ~CMyNode(); unsigned int GetType(void) {return _type;} int my_data_of_my_type; char *another_data; }; Hope it will be helpful. Manu. |
From: Oscar F. <of...@wa...> - 2002-09-27 12:14:23
|
"Manu \(mingw-users\)" <min...@li...> writes: > Oscar Fuentes wrote: > > > "Henning, Brian" writes: > > > > > Hello, > > > i am trying to write a stack library in c that is generic as possible.. is > > > there a way to do it without function pointers? [snip] > > > is there anything else that > > > i can do to make it more generic... > > > > Yes, switch to C++. > > I was silently thinking the same. Well, if Brian switches to C++, I have > a generic linked list that may help: > http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/visual-mingw/visual-mingw/src > / > > I'm very happy with it, since it's fast, light and generic. > It wouldn't be difficult to write a stack inspired on it. > See CList.cpp, CList.h. The code is public domain. What advantage has it over std::list and other standard C++ containers? > > > handle strings, ints, chars, doubles, and other misc datatypes? > > Precisely, an advantage of C++ is the inheritance. For example, a > class can inherit of list nodes. Then you can handle any kind of data. > > eg: > > // The basic list node. > class CNode { > public: > CNode() {next = prev = NULL; _type = 0;}; > ~CNode() {}; > > CNode *prev; > CNode *next; > > protected: > unsigned int _type; > }; > > // A derived class. > class CMyNode : public CNode { > public: > CMyNode() {_type = MY_NODE_TYPE;}; > ~CMyNode(); > > unsigned int GetType(void) {return _type;} > > int my_data_of_my_type; > char *another_data; > }; Why you didn't use a C++ template? [snip] -- Oscar |
From: Richard Frith-M. <ri...@br...> - 2002-09-27 12:38:56
|
On Friday, September 27, 2002, at 01:14 PM, Oscar Fuentes wrote: > "Manu \(mingw-users\)" <min...@li...> writes: > >> Oscar Fuentes wrote: >> >>> "Henning, Brian" writes: >>> >>>> Hello, >>>> i am trying to write a stack library in c that is generic as >>>> possible.. is >>>> there a way to do it without function pointers? > > [snip] > >>>> is there anything else that >>>> i can do to make it more generic... >>> >>> Yes, switch to C++. >> >> I was silently thinking the same. Well, if Brian switches to C++, I >> have >> a generic linked list that may help: >> http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/visual- >> mingw/visual-mingw/src >> / >> >> I'm very happy with it, since it's fast, light and generic. >> It wouldn't be difficult to write a stack inspired on it. >> See CList.cpp, CList.h. The code is public domain. > > What advantage has it over std::list and other standard C++ containers? >>>> handle strings, ints, chars, doubles, and other misc datatypes? >> >> Precisely, an advantage of C++ is the inheritance. For example, a >> class can inherit of list nodes. Then you can handle any kind of data. >> >> eg: >> >> // The basic list node. >> class CNode { >> public: >> CNode() {next = prev = NULL; _type = 0;}; >> ~CNode() {}; >> >> CNode *prev; >> CNode *next; >> >> protected: >> unsigned int _type; >> }; >> >> // A derived class. >> class CMyNode : public CNode { >> public: >> CMyNode() {_type = MY_NODE_TYPE;}; >> ~CMyNode(); >> >> unsigned int GetType(void) {return _type;} >> >> int my_data_of_my_type; >> char *another_data; >> }; > > Why you didn't use a C++ template? Well, obviously the thing to do is use Objective-C as it's so much easier to code in and produces more flexible, faster programs :-) Seriously though ... he wanted a plain C solution. As part of the GNUstep base library I wrote some header files which use macros and inline functions to give an effect similar to C++ templates for plain C usage. For arrays these are GSUnion.h and GSIArray.h These are under the LGPL and can therefore be pretty freely used. Of course, if you want to be really generic, in Objective-C you can use NSMutableArray from the GNUstep base library ... but you can also use Objective-C classes directly from C without having to write stubs for each function. Please forgive the Objective-C advocacy, I was just amused by the C++ response to a C question. |
From: Oscar F. <of...@wa...> - 2002-09-27 16:02:49
|
Richard Frith-Macdonald <ri...@br...> writes: > >> Precisely, an advantage of C++ is the inheritance. For example, a > >> class can inherit of list nodes. Then you can handle any kind of data. > >> > >> eg: > >> > >> // The basic list node. > >> class CNode { > >> public: > >> CNode() {next = prev = NULL; _type = 0;}; > >> ~CNode() {}; > >> > >> CNode *prev; > >> CNode *next; > >> > >> protected: > >> unsigned int _type; > >> }; > >> > >> // A derived class. > >> class CMyNode : public CNode { > >> public: > >> CMyNode() {_type = MY_NODE_TYPE;}; > >> ~CMyNode(); > >> > >> unsigned int GetType(void) {return _type;} > >> > >> int my_data_of_my_type; > >> char *another_data; > >> }; > > > > Why you didn't use a C++ template? > [snip] > Seriously though ... he wanted a plain C solution. [snip] > Please forgive the Objective-C advocacy, I was just amused by the C++ > response to a C question. My questions are on a follow-up to Manu and are addressed to him. The code he showed doesn't look like "plain C". -- Oscar |
From: Richard Frith-M. <ri...@br...> - 2002-09-27 16:18:20
|
Oscar Fuentes wrote: >Richard Frith-Macdonald <ri...@br...> writes: > > > >>>>Precisely, an advantage of C++ is the inheritance. For example, a >>>>class can inherit of list nodes. Then you can handle any kind of data. >>>> >>>>eg: >>>> >>>>// The basic list node. >>>>class CNode { >>>> public: >>>> CNode() {next = prev = NULL; _type = 0;}; >>>> ~CNode() {}; >>>> >>>> CNode *prev; >>>> CNode *next; >>>> >>>> protected: >>>> unsigned int _type; >>>>}; >>>> >>>>// A derived class. >>>>class CMyNode : public CNode { >>>> public: >>>> CMyNode() {_type = MY_NODE_TYPE;}; >>>> ~CMyNode(); >>>> >>>> unsigned int GetType(void) {return _type;} >>>> >>>> int my_data_of_my_type; >>>> char *another_data; >>>>}; >>>> >>>> >>>Why you didn't use a C++ template? >>> >>> > >[snip] > > > >>Seriously though ... he wanted a plain C solution. >> >> > >[snip] > > > >>Please forgive the Objective-C advocacy, I was just amused by the C++ >>response to a C question. >> >> > >My questions are on a follow-up to Manu and are addressed to him. > >The code he showed doesn't look like "plain C". > Sorry ... I was just adding to the general thread and didn't bother to go back to the point where C++ was recommended ... I didn't mean to give any personal offence. > > |
From: Manu \(mingw-users\) <min...@li...> - 2002-09-27 21:06:28
|
Oscar Fuentes wrote: > "Manu \(mingw-users\)" <min...@li...> writes: > > > Oscar Fuentes wrote: > > > > > "Henning, Brian" writes: > > > > > > > Hello, > > > > i am trying to write a stack library in c that is generic as possible.. is > > > > there a way to do it without function pointers? > > [snip] > > > > > is there anything else that > > > > i can do to make it more generic... > > > > > > Yes, switch to C++. > > > > I was silently thinking the same. Well, if Brian switches to C++, I have > > a generic linked list that may help: > > http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/visual-mingw/visual-mingw/src > > / > > > > I'm very happy with it, since it's fast, light and generic. > > It wouldn't be difficult to write a stack inspired on it. > > See CList.cpp, CList.h. The code is public domain. > > What advantage has it over std::list and other standard C++ containers? Well, the origin of this CList was an article in "Programmez!" magazine about doubly generic linked lists. The article by Claude Catonio started with the following: "If you don't like C++ templates, then you'll appreciate this article... etc..." :) I've much appreciated. For me, an advantage is the size of the binary. OTOH, I agree that reinventing the wheel takes more time. IOW, it depends what the programmer prefers, small binaries or spending more time to reinvent the wheel. About C++ templates, I don't have some code to show, I'm sorry. Finally, I forgot to mention a few clues in my previous posting. If memory serves me right, there's some list/stack examples in "Thinking in C++" by Bruce Eckel. There's maybe also interesting code in Bob Stout snippets, and as Brian wishes a plain C solution, he may also try to ask the comp.lang.c gurus. (http://www.google.com/ for the URLs) Manu. |
From: Oscar F. <of...@wa...> - 2002-09-27 22:21:05
|
"Manu \(mingw-users\)" <min...@li...> writes: > > > I was silently thinking the same. Well, if Brian switches to C++, I have > > > a generic linked list that may help: > > > http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/visual-mingw/visual-mingw/src > > > / > > > > > > I'm very happy with it, since it's fast, light and generic. > > > It wouldn't be difficult to write a stack inspired on it. > > > See CList.cpp, CList.h. The code is public domain. > > > > What advantage has it over std::list and other standard C++ containers? > > Well, the origin of this CList was an article in "Programmez!" magazine > about doubly generic linked lists. The article by Claude Catonio started with > the following: > > "If you don't like C++ templates, then you'll appreciate this article... etc..." > > :) I've much appreciated. > > For me, an advantage is the size of the binary. > OTOH, I agree that reinventing the wheel takes more time. > IOW, it depends what the programmer prefers, small binaries or > spending more time to reinvent the wheel. Well, having small binaries is nice, but most of the time I prefer techniques that maximizes my chances of releasing a correct piece of software within the estimated schedule. OTOH, I don't think that a template-based data structure similar to what you showed would add a significant executable file size overhead. The advantages related to type-safety are overwhelming, though. [snip] -- Oscar |
From: Manu \(mingw-users\) <min...@li...> - 2002-09-28 09:07:14
|
Oscar Fuentes wrote: > "Manu \(mingw-users\)" <min...@li...> writes: > > > > > I was silently thinking the same. Well, if Brian switches to C++, I have > > > > a generic linked list that may help: > > > > http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/visual-mingw/visual-mingw/src > > > > / > > > > > > > > I'm very happy with it, since it's fast, light and generic. > > > > It wouldn't be difficult to write a stack inspired on it. > > > > See CList.cpp, CList.h. The code is public domain. > > > > > > What advantage has it over std::list and other standard C++ containers? > > > > Well, the origin of this CList was an article in "Programmez!" magazine > > about doubly generic linked lists. The article by Claude Catonio started with > > the following: > > > > "If you don't like C++ templates, then you'll appreciate this article... etc..." > > > > :) I've much appreciated. > > > > For me, an advantage is the size of the binary. > > OTOH, I agree that reinventing the wheel takes more time. > > IOW, it depends what the programmer prefers, small binaries or > > spending more time to reinvent the wheel. > > Well, having small binaries is nice, but most of the time I prefer > techniques that maximizes my chances of releasing a correct piece of > software within the estimated schedule. > > OTOH, I don't think that a template-based data structure similar to > what you showed would add a significant executable file size > overhead. The advantages related to type-safety are overwhelming, > though. Yes, I agree concerning type-safety. OTOH, I also agree with the following, from the wxWindows Programmer Style Guide: "... Don't use C++ templates Besides the reasons mentioned above, template usage also makes the program compile much slower (200%-300% is not uncommon) and their support even in the compilers which have had it for a long time is far from perfect (the best example is probably gcc). Workaround: The things you would like to use templates for are, most commonly, polymorphic containers (in the sense that they can contain objects of any type without compromising C++ type system, i.e. using void * is out of question). wxWindows provides dynamic arrays and lists which are sufficient in 99% of cases - please don't hesitate to use them. Lack of template is not a reason to use static arrays or type-less (passing by void *) containers. ..." Finally, in some particular cases, with templates or not, we must use type-less data. For example to attach a class pointer to items in Windows common controls, like Tree Views, List Views, etc... using the lParam member. Same if you wish to attach data to a window with SetWindowLong / GetWindowLong. Using a base class, with different kind of derived classes is not so bad. At least, that's a possibility. Manu. |
From: Oscar F. <of...@wa...> - 2002-09-28 10:22:46
|
"Manu \(mingw-users\)" <min...@li...> writes: > > Well, having small binaries is nice, but most of the time I prefer > > techniques that maximizes my chances of releasing a correct piece of > > software within the estimated schedule. > > > > OTOH, I don't think that a template-based data structure similar to > > what you showed would add a significant executable file size > > overhead. The advantages related to type-safety are overwhelming, > > though. > > Yes, I agree concerning type-safety. > > OTOH, I also agree with the following, from the wxWindows Programmer > Style Guide: > > > "... Don't use C++ templates Besides the reasons mentioned above, > template usage also makes the program compile much slower (200%-300% > is not uncommon) and their support even in the compilers which have > had it for a long time is far from perfect (the best example is > probably gcc). > > Workaround: The things you would like to use templates for are, most > commonly, polymorphic containers (in the sense that they can contain > objects of any type without compromising C++ type system, i.e. using > void * is out of question). wxWindows provides dynamic arrays and > lists which are sufficient in 99% of cases - please don't hesitate > to use them. Lack of template is not a reason to use static arrays > or type-less (passing by void *) containers. ..." Oh, my God! :-) The above is a bunch of FUD that comes from somebody who doesn't know what templates are. (Believe me, I've discussed the issue with the wxWindows maintainers and, although at least one of them implicitly recognised that their "official" statement is fairly inaccurate nowadays, they refused to change his mind. Last time I read the wxWindows developers mailing list, they were discussing the introduction of smart pointers on the library... using macros :-)~ wxWindows is far from being a good modern C++ library. I would say that wxWindows is far from being a C++ library by whatever standards. > Finally, in some particular cases, with templates or not, we must > use type-less data. For example to attach a class pointer to items > in Windows common controls, like Tree Views, List Views, > etc... using the lParam member. Same if you wish to attach data to > a window with SetWindowLong / GetWindowLong. Yes, when you deal with C libraries or broken C++ libraries, you are forced to use sloppy practices, agreed :-) > Using a base class, with different kind of derived classes is not so > bad. At least, that's a possibility. -- Oscar |
From: Oscar F. <of...@wa...> - 2002-09-28 14:37:53
|
Oscar Fuentes <of...@wa...> writes: [snip] > wxWindows is far from being a good modern C++ library. I would say > that wxWindows is far from being a C++ library by whatever standards. I mean "... being a _good_ C++ library by whatever standards." [snip] -- Oscar |