Hi fellow MLUGers I am a devout C programmer. I moved to C from Assembly, and this past year I have been leaning towards C++ wtih Qt. KDE is written with Qt, and the fault I have with KDE is the slow slow startup. Aside from that, KDE is a great example of a C++ interface.
I am also familiar with the Boost libraries. If you like C, download the libc.pdf file. Here is a link from my Dropbox https://dl.dropbox.com/u/42050559/libc.pdf Each chapter describes the functions available, the rationale and the document gives you an idea of the richness of the default GNU library. For malloc / free, search the doc for xmalloc() as a user written try, catch program. also, look at the atexit() function. My answer is "Use whatever language works for you" By the way, just back from 4 days in Atlantic City by the ocean. Excellent weather. The hotel/casino was, for my wife, what kept her happy. There are no clocks in the casinos and no internet. You play on the machine, and they do not want you to get up, so there are complementary drinks (alcoholic too). If you have not been there, for the hotels that we toured, each had a casino. The larger one was bout 2 football fields in size. Imagine that it could accomodate about 10k people. I don't play so I did not lose any money. My wife made $170, to take home. This AM I am back to researching and coding. I want to write the next great application using a combination of C and C++. Regards Leslie Mr. Leslie Satenstein 50 years in Information Technology and going strong. Yesterday was a good day, today is a better day, and tomorrow will be even better. mailto:[email protected] alternative: [email protected] www.itbms.biz www.eclipseguard.com --- On Sun, 8/12/12, Andy Pintar <[email protected]> wrote: From: Andy Pintar <[email protected]> Subject: Re: [MLUG] C? Why yes, it is still awesome! To: "Montreal Linux Users Group" <[email protected]> Date: Sunday, August 12, 2012, 10:12 PM I just destroyed the email I sas crafting and so this one will be a little more to-the-point. I mentioned before, Bruce Eckel's book is a great (free) place to start C++. It will answer all the questions below. http://www.linuxguruz.org/ebooks/eckel/TICPP-2nd-ed-Vol-one.zip http://www.linuxguruz.org/ebooks/eckel/TICPP-2nd-ed-Vol-two.zip On Sat, 11 Aug 2012, Leslie S Satenstein wrote: > If you use the G++ compiler, you can program with C++ and avoid classes, > have efficient code and except for the canned classes (namespace std) and > some others, gain as much performance as if coding in C. Well, if you don't include it you won't include it. Just like in C you can use math, stdlib, string, etc. But if you don't include them they won't be in your code. > structures, unions, still work in C++. Structs are classes in C++. So, a class with no methods is a struct with default private member variables. Which seems kind of useless... class myClasss { public: int a; int b; }; is equivalent to struct myStruct { int a; int b; }; > I am not a strong C++ programmer, but if I declare a class, can I declare a > pointer of that class type and assign it to NULL or to any other object of > the same class? Yes. myClass* myclassptr = new myClass( blah1 ); delete myclassptr; myclassptr = null; myclassptr = new myClass( blah2 );A > Can I do a memset(class_pointer, 0, sizeof(class)); To wipe out a class > with mixed binary and asciiz string variables, some of which are public and > some protected? Yes, you can. private member variables just means that regular access is restricted. But when you go memsetting you go around the protections c++ gives you. There was this whole argument about how c was somehow 'unsafe,' which is totally ridiculous if you ask me (I know you didn't, but there it is). Programming is not safe. In fact, if you could design a safe language where you couldn't shoot yourself in the foot, I bet it'd be useless. Programming isn't easy. Yes, memsetting a class to zero is really really stupid. But maybe just maybe there's a legitimate reason for doing so in this case. The other 99.999999% of the time, just delete myclassptr; Or better yet, use smart pointers (see "shared_ptr"). I have included a sample test program and the output at the bottom of this email. > Via constructors, I believe I would have to do an initialization of each > class variable, one by one. > > Is there a sizeof(class name) operator? fwrite( object, number of objects, > sizeof object, file pointer0 I am just asking as my C++ books don't talk > about this. Yes for sizeof, yes for fwrite, but don't program in C if your filename ends in .cpp. Instead you open a file stream, overload the << operator for your class, and go: myfilestream << myobject1 << myobject2 << etc. > > What I do like in C++ is the extension of the C printf sprintf, fprintf > functions. What do you mean? If you're using *printf in a C++ program I can almost certainly point to where you're "doing it wrong." Yes it works. Will it make any c++ programmer who comes along afterward want to light a candle of satanic worship and curse your family for generations? That depends. << and >> are your friends. int myint; myint << weirdObject; //converting a weirdobject to an int. > My frustrations with C. If I have error messages in English, my variables > may be in a,b,c sequence. If I switch languages, they would be in a,c,b > sequence or even c,a,b sequence. this grammer language dependent (english, > french, spanish) problems appears addressed with C++ or is it? That is up to you. If you have error messages that are retrieved depending on what language your user can understand, you'll probably use an error handler object of some type. Adding the capacity to re-order messages is up to the programmer, but is certainly not impossible. Difficulty depends on the way things were implemented initially. Same goes for a C implementation though. > Related to another topic. C coding style. > When I make my pointers that are malloc()ed global (above main() ), then I > have a way for a global function exit() to free memory. > > As well I can allocate memory in a sub function, retrieve the information in > the calling function, and do a free() from the caller, if I have to. If I > allocate memory in the sub-function, and forget to do a free() I leave an > orphan. But I can do something too when I call exit(nn). As all the > pointers to malloc'd areas are global, I can do some nice cleanup. (I write > security stuff, and I want to wipe out my areas before the free() or before > the program exits.) Many times when anomalies are detected in sub-functions, > we issue the longjump, code and I try to avoid this use. > C++ has the try() { stuff}, which I like. Yeah, C++ has try. Try this on for size though: try{ myClass* myptr = somefunction(); myptr->method(); } catch( ... ) { //gah what to do!!!} Has myptr been created properly? Should we check for that? Or just delete it? That's why smart pointers save so much headache. Don't malloc, don't free, instead use new/delete. And smart pointers. Maybe the sweet C program that was custom crafted to a particular application ran the fastest, but while the C dev is spending hours/days/weeks trying to rewrite and debug the version 2.0 with that weird requirement that throws everything into madness, you can be sure that the C++ change will come with fewer headaches (if it was coded well to begin with). I used to work with people who used Fortran because it was the FASTEST. Sure, there are edge cases where it's faster. But the cost of maintaining a huge Fortran (or was it FORTRAN) mess of code (and I do mean mess) is non-zero. And trying to modify it is frightful at best. Oh, right, and these people didn't know how to order loop iterations to minimize cache hits. So their code ended up being slower than it could have been in C (or Ada or Pascal or Turing...). I guess the important thing is to know your language, be careful, don't use too many "tricks," and remember that premature optimization really is the root of all evil. Or at least the cause of most of my headaches. Now I can sit back and wait for all the people I've unknowingly pissed off for not mentioning Java or Forth to reply scathingly. > > Regards > > Leslie ==memset.cpp=========== #include <iostream> class abPrint { int a; int b; public: abPrint(int a, int b):a(a),b(b){}; void print() { std::cout << "The ints are: a<<" << a << ">> and b <<" << b <<">>.\n"; } }; int main() { abPrint* pap = new abPrint( 1, 5 ); pap->print(); memset(pap, 0, sizeof(abPrint)); pap->print(); exit(0); } ===end============ Output: The ints are: a<<1>> and b <<5>>. The ints are: a<<0>> and b <<0>>. -----Inline Attachment Follows----- _______________________________________________ mlug mailing list [email protected] https://listes.koumbit.net/cgi-bin/mailman/listinfo/mlug-listserv.mlug.ca
_______________________________________________ mlug mailing list [email protected] https://listes.koumbit.net/cgi-bin/mailman/listinfo/mlug-listserv.mlug.ca
