Tag: c++

Entries for tag "c++", ordered from most recent. Entry count: 117.

Pages: 1 2 3 ... 15 >

14:49
Sun
28
Sep 2014

Building 64-bit Executables in Visual Studio Express

I admit that for years I was convinced only the paid version of Visual Studio can compile 64-bit EXE files. It's just because I never really needed to create one in my personal projects. Now I have to do it (what for? - I will show in one of my next posts) and as it turns out, it's perfectly possible and easy to do also in Visual Studio Express. You just have to make some configuration because the "x64" platform is not shown by default. So to compile 64-bit executable in your Visual Studio 2013 Express:

You can now choose and build any configuration (Debug or Release) for any platform (Win32 or x64). For x64 platform, intermediate and output files will be written to subdirectories: x64\Debug\ and x64\Release\. Notice that for Win32, it's just Debug\ and Release\.

Comments (1) | Tags: c++ visual studio | Author: Adam Sawicki | Share

14:55
Sat
02
Aug 2014

CPrintStream 1.1

2.5 years ago I wrote a piece of C++ code called CPrintStream - see CPrintStream - Polymorphic Printf for description. Now I updated it to version 1.1. Files to download:

PrintStream.hpp
PrintStream.cpp

What's new:

OutputDebugString is a WinAPI function for passing debug messages. If debugging in Visual Studio, these messages can be viewed in Output panel. If not, they can be captured using separate, simple and free program - DebugView.

Comments (5) | Tags: c++ | Author: Adam Sawicki | Share

22:48
Wed
28
May 2014

Offensive Programming :)

Generally, defensive programming is a very good idea. But many times I've seen this following C++ code explained as an example of defensive programming:

if(pointer != NULL) {
   pointer->SomeMethod();
   // Some other things with pointer.
}

If the pointer here is expected to always point to a valid object and not NULL, otherwise it's a programmer's bug somewhere else in the code, then I believe such practice is very, very bad. I think there should be an assertion instead, like this:

assert(pointer != NULL);
pointer->SomeMethod();
// Some other things with pointer.

First of all, assertion is compiled only in debug configuration, while condition would be additional code executed in all builds, unnecessarily impacting performance. Second and more important argument is that when there is a bug and the pointer is NULL, we should know about it as soon as possible and be able to debug this particular place. That's easy when we put an assert. That's also easy when we dereference NULL pointer, because then the application would crash, which is also possible to catch in the debugger. On the other hand, when there is a condition around code using this pointer and the pointer is NULL, the code inside is just not executed, which may somehow corrupt or just propagate corrupted state of the program, hide the bug or defer its appearance for later time and to different place of the code, making it harder to find. Recommending to crash the app could sound radical, so let's call this "offensive programming" :)

Comments (9) | Tags: c++ | Author: Adam Sawicki | Share

18:31
Tue
06
May 2014

Boost Geometry LOL

Many programmers I follow on Twitter made fun recently of this page: Boost Geometry - Design Rationale. I agree with them - it's ridiculous how sophisticated a simple geometric distance function can become if you want to make it generic using C++ metaprogramming. There are many developers who like such tricks, but I'm not one of them.

Of course I know and appreciate that C++ is so powerful you can write such generic code and that all the complexity is solved in compile time so run-time performance is good and not affected by this. But on the other hand, generic programming in C++ has its flaws: it's hard to learn, the code is long and complex, hard to write, debug, read and understand. When you make a mistake, error messages are cryptic, which is inevitable with so many levels of indirection.

So here is what I thought about this: If all these traits and other helper, boilerplate code was not needed and if compile-time metaprogramming was imperative and iteration-based like the main language itself, not functional and recursion-based, then a dimension-agnostic distance function could look like as simple as this:

struct vec2 { float x, y; }
struct vec3 { float x, y, z };

declare components of vec2 as { x, y };
declare components of vec3 as { x, y, z };

float distance(a, b)
{
    float dist = 0;
    foreach(c in a.components)
        dist += (b.c - a.c) * (b.c - a.c);
    return sqrt(dist);
}

But because it doesn't, I will stick with 2D, 3D and 4D vectors of floats :)

Comments (5) | Tags: boost c++ | Author: Adam Sawicki | Share

21:03
Sun
02
Mar 2014

Using Google Test in Visual C++ 2012

I was recently learning Google Test (Google C++ Testing Framework). It's a C++ library from Google (shared under new BSD license) to do unit testing, following xUnit convention.

As always with any library in C++, it's not that easy as just download the sources, compile and use it. Here are my experiences with making it work in Visual C++ 2012:

1. Visual Studio solution is already prepared in msvc/gtest.sln. You just need to confirm upgrading to new version and ignore report with warnings.

2. You only need "gtest" project. It compiles a static library. That's the way I decided to use it. Alternatively you could just include all library sources to your project.

3. The library uses tuple from new C++ that requires variadic templates. Visual C++ doesn't support this feature, so to make it compiling without errors, you need to globally define following macros (in project properties > C/C++ > Preprocessor > Preprocessor Definitions, in both Debug and Release configurations, in both library and your client project):

GTEST_USE_OWN_TR1_TUPLE=0
_VARIADIC_MAX=10

4. If your project uses different way of linking to the standard library than gtest, you will get linker errors like:

1>gtestd.lib(gtest-all.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in MyTestApp.obj
1>msvcprtd.lib(MSVCP110D.dll) : error LNK2005: "public: __thiscall std::_Container_base12::_Container_base12(void)" (??0_Container_base12@std@@QAE@XZ) already defined in gtestd.lib(gtest-all.obj)
1>msvcprtd.lib(MSVCP110D.dll) : error LNK2005: "public: __thiscall std::_Container_base12::~_Container_base12(void)" (??1_Container_base12@std@@QAE@XZ) already defined in gtestd.lib(gtest-all.obj)
...

That's probable as default setting for new project is to link it dynamically, while gtest project links it statically. It should be same in both gtest and your project. To change it to linking dynamically, enter project properties > C/C++ > Code Generation > Runtime Library and choose Multi-threaded Debug DLL (for Debug) and Multi-threaded DLL (for Release).

After setting it up, usage of the library is very easy. You just need in your project:

1. Add "include" subdirectory to include directories.
2. #include <gtest/gtest.h>
3. Link with "msvc/gtest/Debug/gtestd.lib" (in Debug) and "msvc/gtest/Release/gtest.lib" (in Release).
4. Write your tests, like:

TEST(IntegerTest, Addition)
{
    EXPECT_EQ(4, 2 + 2);
    EXPECT_EQ(10, 3 + 7);
}

5. Write main function:

int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

I like this library - it's easy to learn and use while quite powerful. It's also well documented - the main documentation is: Primer, Advanced Guide, FAQ.

There is also a GUI application available, called Guitar (Google Unit Test Application Runner) or gtest-gbar, which allows running your testing application and browsing results in a window instead of console.

Comments (6) | Tags: c++ libraries testing | Author: Adam Sawicki | Share

21:04
Fri
17
Jan 2014

CppDepend 4 Pro for Free

It looks that they've just released a new major version of CppDepend - great static code analysis tool for C++. What's New in CppDepend 4 page lists several improvements. What is more important though is that they've decided to give away Pro license for free to open source C/C++ contributors. They say:

To apply for this free license, Please make sure that you meet the following criteria:

I think it's worth trying to apply for that. See also my review of CppDepend.

Comments (10) | Tags: tools c++ | Author: Adam Sawicki | Share

22:21
Wed
02
Oct 2013

Time Measurement in Game Programming - My Article in ProgramistaMag

In new issue 9/2013 (16) of Programista magazine there is my next article (in Polish) - "Pomiar czasu w programowaniu gier" (Time Measurement in Game Programming). This is an article about very specific subject, important in game development, as well as programming other real-time systems. Most books about game development mention the subject of time measurement, but usually go quickly to higher level like creating some timer class etc. This article focuses on lower level and gives solid theoretical background. It covers:

Plus some other information... You can find the magazine e.g. in Empik stores, as well as subscribe for electronic or paper version.

Comments (10) | Tags: productions c++ | Author: Adam Sawicki | Share

19:58
Mon
05
Aug 2013

Smart Pointers in C++11 - My Article in ProgramistaMag

In new issue 7/2013 (14) of Programista magazine there is my next article (in Polish) - "Inteligentne wskaźniki w C++11" (Smart Pointers in C++11). This is a long one. In this article I introduce the problem of manual memory management in C++ along with the concept of object lifetime and the matter of object ownership. I then describe RAII idiom and explain what smart pointer mean. I describe features of smart pointer classes available in C++11 standard library (auto_ptr, unique_ptr, shared_ptr, weak_ptr) and show how to use them with short examples. I also touch some additional topics like writing custom deleters and show source code of custom implementation of a simple smart pointer.

You can find the magazine e.g. in Empik stores, as well as subscribe for electronic or paper version.

Comments (1) | Tags: c++ productions | Author: Adam Sawicki | Share

Pages: 1 2 3 ... 15 >

STAT NO AD [Stat] [Admin] [STAT NO AD] [pub] [Mirror] Copyright © 2004-2014 Adam Sawicki
Copyright © 2004-2014 Adam Sawicki