The pretty printing for my *.cs-script files (which are C# files) in ViewVC was really ugly and wrong. I needed to configure the MIME type for *.cs-script files. I edited the mimetypes.conf file and added:
text/x-csharp cs-script
The pretty printing for my *.cs-script files (which are C# files) in ViewVC was really ugly and wrong. I needed to configure the MIME type for *.cs-script files. I edited the mimetypes.conf file and added:
text/x-csharp cs-script
Read C Pointers Fundamentals Explained with Examples today to brush up on my rusty C skills.
MD5 in C++ is everywhere if you search for it (except for in the standard library or in boost, which isn’t what I would have expected), but I only needed one implementation and I found this one: RSA Data Security, Inc. MD5 Message-Digest Algorithm.
I wanted to figure out how to tell if my code was compiling in Visual Studio or somewhere else (GCC probably), and I found that you can use #ifdef _MSC_VER.
I did my first operator overloading in C++ today. My code ended up being quite different to the example code that I found, but I think I’m happy with it:
class FileData { public: FileData( const string& path ); static bool LessThan( const FileData& a, const FileData& b ); bool operator< ( const FileData& ); unsigned long size() const { return m_size; } private: unsigned long m_size; char m_md5[ 16 ]; }; static bool operator< ( const FileData& a, const FileData& b ) { return FileData::LessThan( a, b ); } bool FileData::operator< ( const FileData& b ) { return FileData::LessThan( *this, b ); } bool FileData::LessThan ( const FileData& a, const FileData& b ) { unsigned long a_size = a.size(); unsigned long b_size = b.size(); if ( a_size == b_size ) { return memcmp( a.m_md5, b.m_md5, 16 ) < 0; } return a_size < b_size; }
I'm not sure when it becomes either useful or necessary to define the operator both as a static and as a member function. I did both because I wasn't sure what was required.
I was curious about the difference between C++ pointers and C++ references, so I searched and found this which says that basically:
I learned how to read binary files in C++ today. My function (which creates an MD5 hash of a file) ended up looking a little different to the example that I learned from:
const int BUFFER_SIZE = 1024; int length; char buffer[ BUFFER_SIZE ]; MD5_CTX ctx; MD5Init( &ctx ); ifstream is( path.c_str(), ios::binary ); while ( is.good() ) { is.read( (char *)buffer, BUFFER_SIZE ); streamsize count = is.gcount(); MD5Update( &ctx, (unsigned char *)buffer, count ); } if ( is.eof() ) { // it's ok, we're at the end of the file } else if ( is.bad() ) { // bad bit is set cout << "Bad bit is set while reading '" << path << "'." << endl; cout << strerror( errno ) << endl; exit ( 1 ); } else if ( is.fail() ) { cout << "Fail bit is set while reading '" << path << "'." << endl; cout << strerror( errno ) << endl; exit( 1 ); } is.close();
I was receiving link error LNK1120 in Visual Studio after adding some C code to my C++ project, and the problem was, as I discovered here (and found more info on here), that I hadn’t declared my C code as “extern C”.
So basically I added #ifdef __cplusplus macros to check if it was C or C++ code and if C++ then outputting “extern C {” with a suitable “}” at the end of the file.
Structs and classes can be laid out with padding between the data members for alignment purposes, and this padding doesn’t get initialised unless you specifically zero it out yourself. So if you’re using memcmp and comparing memory at pointers to structs you might have a problem if you’re expecting structs with equal data members to always be equal.
I was forced to lookup Visual Studio’s Compiler Error C2662 because I was getting it in my code. Turns out this happens when your const’s don’t line up. In my case I had const in the client declaration but the member function I was calling didn’t have the const specification.
This little nugget of code from the referenced article shows how to fix up the problem:
// C2662.cpp class C { public: void func1(); void func2() const{} } const c; int main() { c.func1(); // C2662 c.func2(); // OK }