Solarian Programmer

My programming ramblings

C17 Programming - measuring execution time, delaying program execution

Posted on April 17, 2019 by Paul

This is a short note about measuring the execution time for a C program, or delaying the program execution for a specified amount of time. I’m only interested in using mechanisms that let us measure the execution time with at least millisecond resolution, so I won’t mention the classical C way of getting the time of day with second resolution time or using the clock function.

You can find all the code examples at the GitHub repo for this article.

Since C11, the standard way to get a good time estimate is to use the timespec_get function, which returns the system clock time:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 5 int main(void) {
 6     struct timespec t0, t1;
 8     if(timespec_get(&t0, TIME_UTC) != TIME_UTC) {
 9         printf("Error in calling timespec_get\n");
10         exit(EXIT_FAILURE);
11     }
13     // Do some work ...
15     if(timespec_get(&t1, TIME_UTC) != TIME_UTC) {
16         printf("Error in calling timespec_get\n");
17         exit(EXIT_FAILURE);
18     }
20     // Calculate the elapsed time
21     double diff = (double)(t1.tv_sec - t0.tv_sec) + ((double)(t1.tv_nsec - t0.tv_nsec)/1000000000L);
22     printf("Elapsed time: %lf seconds\n", diff);
23 }

Where timspec will store the time split in seconds and nanoseconds.

►  Continue reading

C Programming - using ANSI escape codes on Windows, macOS and Linux terminals

Posted on April 8, 2019 by Paul

In this article I will show you how to use ANSI escape codes to control the colors of your Terminal, write text at arbitrary positions, erase lines of text or portions of the terminal and move the cursor. The advantage of using ANSI escape codes is that, today, these are available on most operating systems, including Windows, and you don’t need to install third party libraries. These are well suited for simple command line applications. If you need to do complex text graphics check the ncurses library.

You can find all the code examples at the GitHub repo for this article.

There is also a video version of this tutorial:

Let’s start with a simple C example that will print a green text message on your Terminal:

1 #include <stdio.h>
3 int main(void) {
4     printf("\x1b[32mHello, World\n");
5 }

►  Continue reading

C Programming - read a file line by line with fgets and getline, implement a portable getline version

Posted on April 3, 2019 by Paul

In this article, I will show you how to read a text file line by line in C using the standard C function fgets and the POSIX getline function. At the end of the article, I will write a portable implementation of the getline function that can be used with any standard C compiler.

Reading a file line by line is a trivial problem in many programming languages, but not in C. The standard way of reading a line of text in C is to use the fgets function, which is fine if you know in advance how long a line of text could be.

You can find all the code examples and the input file at the GitHub repo for this article.

Let’s start with a simple example of using fgets to read chunks from a text file. :

►  Continue reading

C Programming - Passing a multi-dimensional array to a function

Posted on March 27, 2019 by Paul

In this article I will show you how to pass a multi-dimensional array as a parameter to a function in C. For simplicity, we will present only the case of 2D arrays, but same considerations will apply to a general, multi-dimensional, array.

There is also a video version of this tutorial:

In C, a two-dimensional array is a one-dimensional array of one-dimensional arrays. For example, an array of two rows and 3 columns is technically a one-dimensional array of two elements, where each element is a one-dimensional 3 elements array. Here is an example of a 2D array of two rows and three columns:

1 int arr[][3] = {
2     {1, 2, 3},
3     {4, 5, 6}	
4 };

►  Continue reading

Docker on macOS - Installation and Getting Started with GCC 8 in a Docker container

Posted on March 26, 2019 by Paul

In this article I will show you how to install Docker on macOS. In order to exemplify the use of Docker, we’ll use a container to build and run a simple C or C++ application with GCC 8.

There is also a video version of this tutorial:

Start by downloading Docker Desktop for macOS. If you don’t have a Docker account, sign up for one it is free and it only takes a few minutes to create one. Once you are logged in, you should be able to get the Docker app for macOS. Open the dmg file and drag the installer to your Applications, you can safely accept all the default settings.

►  Continue reading

C++17 - Implementing a singly linked list with smart pointers

Posted on February 22, 2019 by Paul

In this tutorial, I will show you how to implement a singly linked list data structure in C++17 with smart pointers. This is also useful as an exercise in learning about how you can use smart pointers instead of raw pointers to manage the memory of the list elements.

A singly linked list is a collection of nodes (elements), in which every node contains a data field and a link to the next node. The first node of a singly linked list is usually named head or root. The last element of the list is usually named tail and his next field links to nothing.

An interesting property of the singly linked list is that, in order to visit a certain node, you will need to pass through all the previous list nodes until the searched one. For example, if you want to print the third element of a singly linked list, you will need to start at the list head and pass through the first and second nodes. In other words, you can’t have random access to the singly linked list elements, like you can for example with an array. If you want to read more about the linked lists theory check the books recommended at the end of the article.

For the purpose of this article, we are going to implement a few of the linked list possible operations: insertion, deletion and traversal.

►  Continue reading

C++17 - Draw a Valentine's Day heart shape

Posted on February 14, 2019 by Paul

What could be more romantic than to generate a heart shape with C++17 on Valentine’s Day ?

Heart shape filled with red for Valentine's Day

In order to generate the above shape we can use the parametric form of the outer curve:

►  Continue reading

C++17 Filesystem - Writing a simple file watcher

Posted on January 13, 2019 by Paul

Updated 15 April 2019

In this article I will show you how to use the C++17 std::filesystem library to write a simple file watcher or file monitor. The advantage of using the C++17 std::filesystem library is that your code will be portable on all operating systems for which a C++17 compiler is available.

We are going to implement a C++17 file watcher that will monitor a given folder for file changes. For our limited purposes, we’ll monitor only the creation, modification and deletion of all files from the watched directory. The base folder will be checked for changes at regular time intervals and, in case of changes, we’ll run a user defined function.

►  Continue reading

Raspberry Pi - Using C++ to control a group of LEDs

Posted on December 23, 2018 by Paul

In this article, I will show you how to use C++ to control a group of LEDs connected to a Raspberry Pi. You can see the final results in this short video:

►  Continue reading

Cross compiling OpenCV 4 for Raspberry Pi and BeagleBone Black

Posted on December 18, 2018 by Paul

In this article, I will show you how to cross compile the latest version of OpenCV for Raspberry Pi and BeagleBone Black. At the time of this writing, OpenCV is at version 4.0.0 while the version available with the default Debian based OS on Raspberry Pi and BeagleBone Black is 2.4.9. Building OpenCV 4 directly on a Raspberry Pi or BeagleBone Black is doable, but it could take a few hours. Cross compiling OpenCV for armhf is a 20 - 30 minutes process, depending on the speed of your computer it could be even shorter.

I recommend that you do the building in a Debian Stretch virtual machine or a Docker container in order to not mess your system. If you decide to install Stretch in a virtual machine, make sure to use the minimal [netinst](( system. It is really important that you start with a bare bone system, because we need to install armhf executables and libraries. By using a minimal system we avoid potential conflicts with the native x86-64 versions.

For the remaining of this article, I will mention only Raspbian and Raspberry Pi, if you are using a BeagleBone Black everything should work the same.

I’ll assume that you have a clean Raspbian install. I’ve used the latest available desktop image. In principle you should be able to follow the article using Raspbian Lite, but I did all my tests using the full desktop version of Rasbian.

►  Continue reading

Raspberry Pi Zero Internet connection through USB

Posted on December 7, 2018 by Paul

This is a short article about sharing your Internet connection through USB with a Raspberry Pi Zero. The procedure presented here will work with all versions of Raspberry Pi Zero (with or without onboard WiFi). You will need a Raspberry Pi Zero, a micro SD card and a USB to micro USB data cable.

Start by downloading the latest Raspbian image, I’ve used Raspbian Stretch Lite. Once the download is finished, extract the archive and flash it to your micro SD card. The Etcher flasher app works on macOS, Windows and Linux.

►  Continue reading

BeagleBone Black sharing your macOS Internet connection through USB

Posted on December 4, 2018 by Paul

This is a short article about sharing your Internet connection with a BeagleBone Black through USB on macOS Mojave. I assume that you’ve gone through the Getting Started setup and that you’ve installed the latest Debian image on your BBB.

Connect the BBB to your Mac through USB and start the device. Once the device is on, open a Terminal and use ssh to connect to your BBB:

1 ssh debian@beaglebone.local

►  Continue reading

C++ reading and writing BMP images

Posted on November 19, 2018 by Paul

In this article, I will show you how to implement a BMP image loader from scratch in C++. BMP is one of the oldest image formats on the Windows platform and it is supported on most other operating systems. BMP can store two-dimensional raster images with optional compression and transparency. In this article, we will implement a simplified version of the BMP format specification that will support only 24 and 32 bits depth images in the BGR and BGRA color spaces. To make our life simpler we can also ignore the, optional, compression component.

Even if you don’t plan to use BMP images, it is still a useful programming exercise to write a BMP reader/writer in C++.

From a programming point of view, a BMP file is a binary file in the little-endian format. For our purposes, we can divide a BMP image in four regions:

  • file header - all BMP images starts with a five elements file header. This has information about the file type, file size and location of the pixel data.
  • bitmap header - also named the info header. This has information about the width/height of the image, bits depth and so on.
  • color header - contains informations about the color space and bit masks
  • pixel data.

►  Continue reading

Installing OpenJDK 11 on macOS Mojave

Posted on September 28, 2018 by Paul

Updated 25 February 2019

This is a short note about getting started with Java 11 on macOS. As you probably know, starting with Java 11 there was a big change in the license under which the official Oracle JDK is provided. In short, you need to buy a license from Oracle if you want to use the official JDK in a commercial setting. As far as I know, using Oracle’s JDK on your private computer for testing and learning purposes is allowed.

That being said, for most users OpenJDK is the new JDK of choice, it is provided under an open source license and you don’t need to pay for using it.

►  Continue reading

C++17 constexpr generation of a FizzBuzz solution

Posted on September 23, 2018 by Paul

The famous FizzBuzz interview question asks to print all numbers from 1 to 100. If a number is divisible with 3 print fizz, if the number is divisible with 5 print buzz and if the number is divisible with both 3 and 5 print fizzbuzz. Writing a program for the above problem is trivial. A more interesting problem is to generate the solution for the FizzBuzz problem at compile time.

In C++ we use the constexpr specifier for a variable or a function that needs to be evaluated at compile time.

►  Continue reading