This book and associated source code is free published material; you can redistribute it
and/or modify it under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your option) any later
version.
This book and associated source
book; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
02139, USA.
Programming With wxDev-C++
Its got some quirks but then again dont we all
NinjaNL
Contents
The Boring Bit
· Introduction
· History of wxDev-C++
· Who This Book Is For
· Acknowledgements
Part 1 C / C++ Programming with wxDev-C++
· Chapter 1 Downloading, Installing and Updating wx Dev-C++
o Introduction
o Downloading wxDev-C++
o Installing wxDev-C++
o Updating wxDev-C++
o Adding Extra Packages
· Chapter 2 Compiling your first program
o Introduction
o Opening an existing project
o Creating your own project
· Chapter 3 Basic C Programming
o Introduction
o Break down of a simple example
o Basic C
o Conditional Loops
o Conditional Execution
o Preprocessor
o Functions
o Input/Output and other useful functions
o Pointers
o Memory allocation
o Arrays
o Strings
o Structures
· Chapter 4 Basic C++ Programming
o Introduction
o Break down of a simple example
o Basic C++
o Functions
o Memory allocation
o Classes
o Input/Output
o Strings
o Namespaces
o Exceptions
o Templates
· Chapter 5 Finding your way around the IDE
· Chapter 6 Debugging with wxDev-C++
· DevC++ Related FAQs
o What is this I hear about an Easter egg in Dev-C++?
o Why is my program not recompiled when one of the header files is
altered?
Part 2 Basic Development with wxWidgets and wxDev -C++
· Chapter 7 Creating a Basic HTML Editor
o Introduction
o Starting a wxWidgets Project
o Using the Form Designer
o Altering Properties
o Adding Code
· Chapter 8 Working With Forms and Dialogs
· Chapter 9 The Component Palette
o Sizers
o Controls
Text Controls
Buttons
Choices
The Rest
o Window
o Toolbar
o Menu
o Dialogs
o System
· Chapter 10 Linking It With Events
· Chapter 11 Making It Work With Code
o Where to add your code (or where did it go)
· Chapter 12 Guidelines for Professional Looking Pr ograms
o Mnemonics or Keyboard Accelerators
· Basic wxDev-C++ Related FAQs
o Why does my program look different when I compile it?
o Why does my program not look like a Windows XP program when I
compile it?
o wxDev-C++ keeps crashing whats wrong, what can I do?
o I started wxDev-C++ then selected File|New|New wxFrame but when I
pressed compile nothing happens.
o I try to compile my project but get lots of errors.
o I disabled code completion, but the visual designer keeps complaining,
why does the designer need code completion enabled?
o I have installed a new version of wxDev-C++ or a new version of the
wxWidgets library. Now when I try to compile a previously working
project I get this error cannot find lwxmsw25. W hat is wrong?
o I try to compile my wxWidgets project but I keep getting the error
[Resource error] cant open cursor file wx/msw/ha nd.cur: No such file
or directory. What am I doing wrong?
o Where can I go for more help?
Part 3 Advanced Development with wxWidgets and wx DevC++
· Chapter 13 - Creating and using other controls
o The Simple Way
o The Complex Way
· Chapter 14 Working with other frameworks
o OpenGL
o SDL
Part 4 Going Beyond the Boundaries of this Book
· Alternatives
· Resources
Appendix
A. Keyboard Shortcuts
B. C/C++ Keywords
C. C Standard Libraries
D. C++ Standard Libraries
This Page Intentionally Left Blank
(Just to irritate you when you print it out)
The Boring Bit
Introduction
The first question any child will ask you is why and it is a good question (except after the
thirtieth time of being asked). The sun is blazing down; its a 100
0
outside, so why am I
indoors writing this book?
The main reason is because many people have asked on wxForum if a book on wxDev-
C++ is going to be written. So far a few tutorials have been produced and there have been
various mutterings about books. That answers the question as to why I am writing this
book
. But not why I
am writing this book.
For me wxDev-C++ is something very special. It all goes back to July 1999 (queue the
flashback and misty camera lenses). As per usual I brought a computer magazine, just
one in a huge pile of magazines, but this one was special. On the cover disc was
Championship Manager 3, but being a geek I was not interested in this. Rather I was
taken by the small box in the corner saying Bloodshed DevC++, Free C and C++
environment. A whole new world was opened to me, t he world of C and C++ up to then
I had only programmed in Basic and Visual Basic. I was also introduced to the amazing
world of Open Source Software.
Figure 0.1 Dev-C++ circa 1999
I rushed home from work and installed this program, it was very basic and rather ugly,
but I didnt notice. I opened one of the samples, pressed compile and got greeted by a
message that this program could not be compiled, then the IDE (Integrated Development
Environment) crashed. Undeterred I reloaded DevC++ and another sample and this time
it compiled. It was just a basic window with a button in it, but to me it was a miracle. I
thought Colin Laplace godlike to produce this program for free and give it away. In the
years that followed I continued to use DevC++ and watched it grow from an ugly,
unstable program, to an IDE reminiscent of Microsoft Visual Studio which fulfilled most
of my programming needs. I am not alone, today DevC++ is still the most download
development application on SourceForge.
Figure 0.2 DevC++ in a more recent guise
However I also used another IDE this time from Borland called C++ Builder. I loved the
ease of use in creating GUIs in seconds. I could see what they would look like before I
compiled and I could alter things in seconds that would take lines of code to create and
change. I was torn between DevC++ and C++ Builder until I joined a project called
SkinDoc on SourceForge in 2005. This project was headed by a programmer known as
Nuklear Zelph and was being developed using an application which had slipped past me
called wxDev-C++. Basically it was a visual designer built on top of DevC++. I
downloaded it and found the answer to all my programming desires.
Well not quite, wxDev-C++ is a great piece of work; many skilled programmers have
spent and continue to spend a lot of time in creating and improving it. But it is also a
work in progress, as a result it has a few rough edges. It is also similar to and yet
sufficiently different to other IDEs that some parts of it maybe tricky for newcomers to
use. I floundered around until I discovered the tutorials available on the wxDev-C++
home site and later discovered wxForum. wxDev-C++ also suffers from a major
drawback. The original DevC++ was a paradox in that it was a C/C++ IDE written in
Delphi Pascal. wxDev-C++ continues this tradition and as such programs developed with
the form designer dont always match the compiled program. It is an example of a
WYSINAWYG (What You See Is Not Always What You Get) application, some of this
will improve with time, but I doubt it will ever be a perfect match.
This book then is written with the experience I have gained, the experience of other users
on the forums and in the hope that it will be useful. Some of it will no doubt be out of
date quite soon as wxDev-C++ continues to improve, but this book will reflect these
changes as it grows alongside the IDE.
Sof.T
History of wxDev-C++
In 1983 Richard Stallman announced the GNU project. This project aimed to provide a
free unix operating system with comparable tools. The well known GCC compiler was
created by Richard Stallman as part of this project.
In 1992 Julian Smart began a project called wxWindows, which in 2004 changed its
name to wxWidgets due to pressure from Microsoft. This project was designed to
produce an Open Source cross platform GUI library, which used each platforms native
widgets.
In 1995 Steve Chamberlain began the Cygwin project after noting that GCC contained a
large number of features which made it practical to port to Windows. Other programmers
joined the project and helped expand the Cygwin package.
Originally a fork from Cygwin came MinGW (Minimalist GNU for Windows). This
provided the tools and Windows headers for development on the Win32 platform.
Around 1999 Colin Laplace released the first version of Dev-C++. Using the MinGW
compiler, it provided a minimal IDE. As other developers joined in, they helped expand
Dev-C++ into an IDE which now resembles Microsofts Visual Studio.
2003 Guru Kathiresan created a stand alone visual form designer in Delphi. Although it
had limited functionality it was able to create basic applications.
In 2004 Guru Kathiresan incorporated the visual form designer into Dev-C++. The
resulting application was renamed wxDev-C++ and became a RAD tool similar to Delphi
or Visual Basic. Many other developers have joined in and this tool continues to improve.
Who This Book Is For
In order for this book to work it will need to address a wide range of audiences. From
those who have never programmed in C++ to those who are competent, but have never
used wxWidgets, and those who are comfortable with both, but looking for an extra
nugget of information.
This diverse range of prospective readers has influenced the shape of this book, experts
will not want to wade through a basic primer on C/C++ programming, and beginners will
not want to create GUIs that do nothing because they can not create the code to back it all
up. As a result the book is divided up to allow users to skip directly to the section they are
interested in.
Section one
This section deals with installing wxDev-C++, coding in C and C++, and the DevC++
part of wxDev-C++.
Section two
This section deals with GUI creation using wxDev-C++. It goes into wxWidgets and how
the two work together.
Section three
The final section covers advanced topics, for users who want to do more than create using
the standard controls.
Each section ends with a selection of FAQs related to that section.
Acknowledgements
Thanks to Peter James for volunteering to carry out the role of proof-reader. His edits and
additions are greatly appreciated and have helped to considerably raise the quality of this
book. Malcolm Nealon has also added some valuable improvements, as well as correcting
at least one major mistake.
Thanks also to the developers of wxDev-C++, especially Joel Low and Tony Reina for
the time they have taken to respond to my questions.
Part 1
C / C++ Programming with
wxDev-C++
Chapter 1 Downloading, Installing and Updating wx Dev-C++
Introduction
This chapter is aimed at all users. I have deliberately pitched the level of explanation to
users who rarely or never install and uninstall programs. Advanced users may be irritated
by the number of screenshots and the overly precise instructions. If this is you then just
skip past this section or perhaps lightly skim it for information that is new to you.
A question that many have asked is if wxDev-C++ is available on platforms other than
Windows. The short answer is no. However the good news is that any code you produce
with wxDev-C++ can be compiled on other platforms. For more information check the
FAQ at the end of Part 1 or visit
.
Downloading wxDev-C++
The wxDev-C++ project is hosted on SourceForge and this is the place to go to download
the latest official version (There are other versions, but we will cover those later). So for
now make sure you are connected to the Internet and open your web browser. To go to
the official wxDev-C++ website enter the URL
.
Figure 1.1 The Official wxDev-C++ website [Access ed 1/11/2006 at 7:55A.M.]
On the navigation bar on the left you will see the link to Downloads. At present there are
two different links one to wxDev-C++ and the other to wxDev-C++ for VC. The first
version uses the open source compiler Mingw only but the other version can also use
Microsofts Compiler. Soon both these versions will be merged.
Click on the wxDev-C++ 6.10 option.
Figure 1.2 Selecting a version of wxDev-C++
Clicking on the link labelled wxDev-C++ 6.10 will take you to the SourceForge
download page
. This page contains a list of mirror sites from which you can download
the setup file.
Figure 1.3 SourceForge download page for wxDev-C+ +
Now choose a mirror site that is closest to your home location. For me this is Kent, U.K.
To the right of the mirror site name, is a link in blue labelled Download.
Click on this link to access the download page from the mirror site.
The page will reload using that mirror and the download will start immediately.
NOTE: In Internet Explorer Windows XP Service pack 2, the download may be
blocked. In which case it is necessary to click on the header and select
Allow download from this site.
The next thing you should see is the download dialog box. This will differ from one web
browser to the next, but all should contain the same basic options to either download the
file or run it. If you choose the [Run] option, the setup file will download and run
automatically once downloading is complete. If you choose [Save] the setup file will be
saved onto your computer for you to run when you wish.
Click on either of the [Run] or [Save] buttons.
Figure 1.4 Internet Explorers file download opti on box
Figure 1.5 Firefoxs file download option box
In my case I chose [Save] since I prefer to keep the setup files on hand should I need to
uninstall/reinstall or install on a different computer. So click on either the [Run] or [Save]
to continue.
Figure 1.6 Choosing a location to save the setup files in.
Once you have chosen to [Run] or [Save] the file, the download should begin. Depending
on your Internet connection this is either time for a quick cup of tea or a quick stretch.
(As the following dialog shows this download was approximately 47.5Mb in November
2006)
Figure 1.7 The setup file downloading
Installing wxDev-C++
Once the file has downloaded, if you chose to run the file the installation program will
start automatically, if not you need to browse to where you saved the file and:
Either double left click on the file name to run it.
Or right click and choose Open.
Figure 1.8 Running the setup program
The next thing you should see is a warning box telling you not to install this program
over an existing installation. This is an important warning as many people have found.
Failure to heed these instructions can result in a broken installation which looks okay but
gives you endless headaches (not unlike cheap cider). See the section Updating wxDev-
C++ later in this chapter for further details.
Figure 1.9 The initial warning message from wxDev -C++ setup
The next dialog displays the language selections used during the install. Personally I stick
with the default English since I have trouble understanding anything else.
Select your language and then click [OK].
Figure 1.10 Choose a language option dialog
The next option marks a change from previous versions of wxDev-C++. Since this
release offers support for more than one type of compiler, it offers you the choice of
which compilers you wish to use.
Check the boxes next to the compiler you wish to use. Then click [Next>]
Figure 1.11 Choosing which compilers you wish to use
Although wxDev-C++ is free, to use it you must agree to the provisions of the license
agreement. The license used is the GNU GPL (General Public Licence) Version 2. It is up
to you to either read through all of it, or skip it.
Click on [I Agree] to continue any further.
Figure 1.12 The license agreement dialog
The next dialog offers you the chance to choose which components you wish to install.
Personally I keep to the defaults, but it is worth scrolling through the list of components
to get some idea of what is included in the distribution. The top combo box labelled
Select the type of install gives you an option of full, minimal and custom install. Use
the minimal install if space is at a premium on your computer.
You will notice that the first two choices are grey this is because they are required to
actually install something of use. If you use another IDE (not that you would) and you are
only trying wxDev-C++ then you may wish to uncheck the option to associate files with
wxDev-C++. Likewise if you didnt make the change on last screen this is your last
chance to choose which compilers you will support and load the libraries for those.
Make your choices and then click on [Next >] to continue.
Figure 1.13 The component choice dialog
The Start Menu option dialog gives you the option to choose where wxDev-C++ appears
on your start menu Again this is a personal choice I like to group similar types of
program together so I change this option to Programming\wxDevCpp.
Make your choice and then click [Next >] to continue.
Figure 1.14 Start menu location option dialog
The Install Location dialog provides the option of setting the wxDev-C++ installation
location. This is one default I usually stick with. Previously this used to be C:\Dev-Cpp
due to the fact that DevCpp could not handle spaces in the file path when compiling
programs. However due to the hard work by wxDev-C++s developers this is no longer
the case. Hence the default is now C:\Program Files\Dev-Cpp. Just one of the many
improvements in this release.
Breathe in once and click on [Install].
Figure 1.15 Choose an install location dialog
While the next dialog fills with the names of all the files being installed you will have
time for another brief break.
Figure 1.16 File Installation dialog
Halfway through the file installation, the following dialog will pop up. If you want an
entry for wxDev-C++ on the start menu for all users on your computer then select [Yes],
otherwise select [No]. I select [No] since the other users of my computer dont want me
messing up their environment for them.
Click on either [Yes] or [No] to continue.
Figure 1.17 Install for all users dialog
More files will scroll past. Soon wxDev-C++ will finish installing all the files it needs.
Now click [Next] to continue.
Figure 1.18 File Installation dialog upon complet ion
This will lead you to the Completing Setup dialog. Untick the check box labelled Run
wx-Dev-C++ if you dont want wxDev-C++ to run when you exit the wizard. Equally
untick Read Sof.Ts wxDev-C++ Programming Manual if you dont want to read this
book.
Preferably leave Run wx-Dev-C++ checked and conti nue following these instructions.
If you don't, the next time you run wxDev-C++ you will need to complete the next steps.
Click [Close] to exit and cheer loudly.
Figure 1.19 The completion of the setup dialog
When wxDev-C++ is started up for the first time you will currently be greeted with the
beta warning dialog. This will be absent on later full release versions. Read it or not as
you wish.
Click [OK] to continue.
It is worth remembering that bugs can be posted as you find them. This feature enables
Open Source software to continue improving and gives you something better to do than
just cursing the programmers when the application crashes. The other point to note is that
of updates, which is covered in detail later in this chapter, in the section Updating
wxDev-C++.
Figure 1.20 The beta dialog
You are now presented with various options to customize your version of wxDev-C++.
This is the same introduction as the standard version of DevC++. Here you can choose
your preferred language. As mentioned earlier I stick with English. You can choose
between 3 different icon themes, (I prefer New Look) and choose whether or not to
support XP Themes.
Make your customisation choices and click [Next] to continue.
Figure 1.21 Configuration Dialog
Next you have the option to enable code completion. Choose Yes, I want to use this
feature. The visual designer in wxDev-C++ relies on the code completion feature to
automatically create events for you. While code completion can be annoying when it
seems to get in the way, it is also a great source of information, and helps avoid typo
errors.
Click on [Next] to continue.
Figure 1.21 Enable code completion dialog
The second part of the code completion feature asks if you want to create a cache.
Basically this scans through all the .h header files in your include directory and builds a
list of functions, etc. Later when you are programming code completion uses this cache to
prompt you or to complete the code.
Select the option Yes, create the cache now.
Click [Next] to continue.
At this point, unless you have a very fast computer, go and put the kettle on and brew a
coffee.
Figure 1.22 Code completion cache creation dialog (try saying that fast)
Drink your coffee and continue waiting. It does end eventually I promise.
Figure 1.23 Yep still waiting, nearly finished th at coffee though
Hooray we have made it to the final dialog. Read or not as you wish and:
Click [OK] to complete the installation process.
Figure 1.24 Phew the final dialog
After a short pause the IDE will appear, followed by the tip of the day window.
Updating wxDev-C++
Updating wxDev-C++ is a fairly simple procedure as long as you remember that dialog
box that appeared during the install saying Please do not install this version of wxDev-
C++ over an existing installation. For old hands at windows this will be a simple
procedure, but just in case you are not sure, here is how to proceed.
As always click on the [Start] button on the toolbar.
From the pop-up menu select the Settings menu
Click on Control Panel
(or on WindowsXP click direct on the option Control Panel).
Figure 1.25 Getting to the Control Panel (Windows 9x)
The Control Panel will pop up with various options.
You need to select Add/Remove Programs.
Figure 1.26 Selecting Add/Remove Programs
The Add/Remove dialog will appear. Depending on how many programmes you have
installed on your computer, it may take a few seconds to fill the dialog. When it appears
scroll down the list until you get to wx-devcpp. Select this option; once it is highlighted
the Add/Remove button will become activated.
Click the [Add/Remove] button to continue.
Figure 1.27 The Add/Remove Dialog
The next dialog shows the location of wxDev-C++ and you need to click Uninstall to
continue.
Click the [Uninstall] button to continue.
Figure 1.28 Uninstall dialog
A list of files is displayed as they are uninstalled.
Figure 1.29 wxDev-C++ being uninstalled.
Finally the following dialog will pop up. If you have spent a lot of time configuring the
IDE to your own preferences, you may which to keep the configuration files.
Click the [No] button to keep your configuration files
or
Click the [Yes] button to delete your configuration files and revert to the default.
Figure 1.30 Remove configuration files dialog
At last, the final dialog. Since I personally keep my projects in C:\DEV-CPP, I leave this
directory alone. It is safe to leave this directory to install your new version into. Or delete
it. As ever, the decision is yours to make.
Figure 1.31 The final dialog
To install the latest release from the site on Sourceforge follow the instructions in the
prior section Getting wxDev-C++.
Advanced Users
For advanced users there is the option to try the latest cutting edge versions of wxDev-
C++ alpha builds. These builds show features that may make it into future versions of
wxDev-C++. There are two sites to try these from,
Tony Reinas
site and
Joel Lows
site.
Both are accessible from the wxDev-C++ home page under Alpha builds on the side
navigation bar.
Figure 1.32 Link to alpha build of the wxDev-C++ IDE
Below is the title page for Tonys site. Tony generally has various versions of wxDev-
C++ available.
Figure 1.33 Tonys wxDev-C++ page
Click on the link to wx-devcpp Testers (alpha versions). And it will take you to the
following page. You will want to grab the devcpp.palette as this adds the latest controls to
the widget palette in the IDE. The dates alongside the files give some indication as to
which are the latest. Click on the one you are interested in. Save it the location where you
installed wxDev-C++ (This is C:\Program Files\Dev-Cpp if you accepted the default
location).
Figure 1.34 Tonys list of wxDev-C++ versions
When it has finished downloading browse to C:\Dev-Cpp and rename the file devcpp.exe
to something else like devcpp.exe.backup. This makes it available to change back if the
new version is too unstable. Now find the file you downloaded and rename this to
devcpp.exe. You can now start wxDev-C++ as normal.
Joels page on the other hand has links to alpha versions in binary only or installer
packages. He also lists links to various prebuilt wxWidgets libraries. These are also
available via web update. See the next section for more details.
Figure 1.35 Joelss list of wxDev-C++ versions an d packages.
The latest CVS version should be located at
. Which gives you another option to try.
Adding Extra Packages
Somewhere during the development of DevC++ someone decided that it would be good
if users could add to the libraries they used and update the IDE. The first version of this
updating mechanism was called VUpdate. However this was eventually scrapped and
DevC++ moved onto a new system called Web Update. This allows the user to download
newer versions of DevC++ as they are released and to download DevPaks. DevPaks are
file packages which contain many different things from help files to extra libraries. Since
wxDev-C++ is based on DevC++ it uses the same Web Update feature, but as a result
there are some pitfalls to watch out for as we will discuss later.
Firstly let us look at how to add extra libraries to our new installation of wxDev-C++.
If wxDev-C++ is not already running, start it up.
From the Tools Menu select Check for Updates/Pa ckages
Figure 1.36 Check for updates from the tool menu
This will activate the Web Update application. Make sure you are connected to the
Internet before proceeding any further. At the top of the dialog is a drop down listbox
labeled Select DevPak server.
Click on the arrow to reveal a list of servers (Currently only there are three, only
one is dedicated to wxDev-C++).
Select 'Dev-C++ primary devpak server'.
Figure 1.37 Selecting a DevPak server
Once you have selected the server:
Click the [Check for updates] button at the bottom of the dialog.
After a short pause the main part of the dialog should be filled with a list of updates you
can download.
From left to right the list tells you the name of the update, the version number of the
update, and, if you already have this file installed, the version number of the installed file.
This saves you from downloading and installing out of date versions. Next follows the
size of the file which can be handy on limited bandwidth connections. Finally the file
creation date gives you some reference point on whether the file is up to date or not.
Click on the check box next to the file name to select files for downloading.
To activate the download, click on the [Download Selected] button.
Note the warning below....At this point all files with a green check next to them
will be downloaded.
Figure 1.38 Selecting libraries to download.
WARNING: Remember this system is used to update DevC++ as well as wxDev-C++.
The following image shows a new version of DevC++ that can be
downloaded. Do not download this or you will lose the visual designer part
of DevC++.
Problems can also arise when downloading versions of wxDev-C++ that
are marked Alpha. Alpha versions may be less stable than your current
version or remove some features.
Equally do not download libraries called wxWindows, this is the old name
for wxWidgets and will cause you a headache. Finally be wary when
downloading versions of wxWidgets libraries, if they are compiled with
different or bad options they can break a healthy installation. It is safest to
download from the wxDev-C++ server.
Figure 1.39 Careful not to download updates of De vC++
When your files have finished downloading either they will be installed quietly as in the
case of WebUpdate Mirrors, or the following dialog will popup.
Figure 1.40 Installing updates dialog
Clicking OK starts up the installation part of an other application called PackMan. No
this is not a small yellow ball with a big appetite, it is the Devpak manager. Here you can
choose either [Install >] or [Cancel]. Most frequently you will want to install.
Figure 1.41 Installing the new package.
You have now installed your new package. You will find that it may have added new
templates to your New Project dialog, new help files to your system or even new libraries
to play (or work) with.
Package Maintenance
But what if you wish to remove a package you downloaded? Or to check what packages
you have available. This is all possible from within PackMan.
To do this
Select Package manager from the Tools menu.
Figure 1.42 Checking your packages
Once PackMan starts it lists all of the available packages. As you click on each one, the
panel on the left alters to tell you the package name, the version number, a brief
description and a reference website. If you click on the tab next to General on the left
called Files it will list all the files contained in this package.
Figure 1.43 Controlling your packages
It is also possible to install and remove packages from here.
The above procedure is not the only way to get and install new devpaks. It is possible to
download devpaks from various websites. To get some idea of the variety available, type
devpak into google and run a search. One of the s ites returned will be Devpaks.org. You
may remember seeing this name on the drop down list on Web Update. Devpaks.org is
one of the largest sites for locating devpaks.
Figure 1.44 The home page for Devpaks.org
The packages are listed under various categories. It is quite possible to download devpaks
from here. Once downloaded you can run the files or browse to them and double click
them. If wxDev-C++ has been properly installed this will automatically start the
installation wizard you saw earlier.
Other smaller sites exist for wxDev-C++ related devpaks. Such as the one mentioned on
the forum shown below. This site can be located here
Figure 1.45 Announcement of a new wxDev-C++ devpa k site
Other devpaks are available such as these from NinjaNL
Advanced Users
Advanced users may be interested to know where the devpaks are stored that are installed
by PackMan. The answer is in your wxDev-C++ installation directory in the folder called
packages. Why is this of interest?
I run three different installations of wxDev-C++, one on my home computer, one on my
laptop and one on a virtual vmware install of Windows which I use to test on. Instead of
repeatedly downloading and installing the packages, I install a package once on my main
computer and then install on the other machines by copying the .devpak files across and
then using the [Install] option in Packman.
Figure 1.46 Local versions of the installed DevPa ks.
Chapter 2 Compiling your first program
Introduction
So you have your new IDE installed and upgraded as you wish. So what to do with it?
This chapter will deal with how to open existing projects and how to create and save your
own projects.
Instead of drowning you in screenshots this chapter will start using certain conventions
listed below.
Menus
When you see in the text a line like
File|New|Project
it means go to the File menu on the menubar at the top of the IDE. Select File by
clicking on it, move down to the option New and s elect Project from the pop out
menu. This is shown below.
Figure 2.1 Demonstration of File|New|Project
Keyboard Shortcuts
When you see instructions like press <Ctrl><F9>, this means to hold down the key
labeled Ctrl on your keyboard and while holding i t press the key labeled <F9>. There
are three types of combination keys Ctrl, Shift and Alt. Both Ctrl and Alt can be
found on the bottom of the keyboard. Shift can be found on the left and right-hand sides
of the keyboard. Keys beginning with F can be fou nd on the top row of the keyboard
and are known as Function keys. For more information regarding keyboard shortcuts in
wxDev-C++ see Appendix 1.
Onscreen Buttons
When you see instructions like press [Close], this means to locate the button onscreen
with the text Close on it and click this with you r mouse. This is demonstrated in the
following screenshot.
Opening an existing project
DevC++, and therefore wxDev-C++, comes with a number of example projects to
compile and play with to aid your learning. We will start by opening and compiling one
of these projects.
Ensure wxDev-C++ is running. If the tip of the day window is displayed, close it by
clicking [Close]. Now go to:
File|Open Project or File
This will open the Open File dialog. Depending o n where you last opened a file this
dialog will display that directory. This dialog displays differently on other platforms so
dont worry if yours looks different to mine.
Figure 2.2 The Open File dialog
The sample we are about to use is stored in the \Dev-Cpp\Examples folder so you need to
navigate to it either using the folder list box (the one with the 'Look In' prompt) or by
using the 'Up One Level' icon. (If you installed wxDev-C++ in the default location then
the whole path will be C:\Program Files\Dev-Cpp\Examples). You should see the
following list.
Figure 2.3 The examples supplied with DevC++/wxDe v-C++
Open the folder Jackpot and examine its contents. You should see the following list of
files. The one we want to open is called Jackpot.dev. Either:
double click it to open it
or select it and press [Open].
Figure 2.4 The selecting a .dev project file
The .dev file contains various project settings. This includes things such as the names of
the files used in the project, options for the compiler, version numbers etc. Later on you
will learn how to alter all the settings which are included in this file.
Now you have opened the .dev file you are returned to the IDE. The tree control on the
left displays all the files included in this project, when the 'Project' panel has the focus.
For this project there is only one file called mai n.cpp.
Click on 'main.cpp' to open it in the IDE.
Figure 2.5 The list of files included in this pro ject
The file will open in the IDE. What you are looking at now is called the Source Code.
You will notice that different line and parts of lines are in different colours. This is called
Syntax Highlighting and enables you to easily dis tinguish different parts of the source
code at a glance. The colouring used by the syntax highlighter can be configured to suit
your preferences so dont worry if your colouring differs from mine.
Looking at the image below you will see the top three lines are coloured
green
. The lines
begin with # and are known as Preprocessor line s. We will deal with the Preprocessor
in more depth later.
Next you will see that certain words are shown in bold print. These are Reserved
Keywords. Reserved Keywords are words that are part of the programming language and
which you cannot use for your own purposes. You will also notice that they are all in
lower case. C and C++ are case sensitive languages, so 'Save' and 'save' are different.
Parts of lines beginning and ending with are known are String constants and are
coloured
red
. Number constants are shown in
purple
.
Finally lines beginning with // or beginning with /* and ending with */ are coloured
blue
. These are comments. Comments are there for you and other human readers to help
understand the meaning of the source code. The compiler takes no notice of comments,
so use them more than you think you need to. When you come back to a tricky piece of
code in a years time, well placed comments will dictate how long it takes to understand
the code.
Figure 2.6 Syntax highlighted source code.
We wont spend any time now trying to understand what all this means, because now is
the time for you to compile your first program. To compile means to pass the human
readable (I promise you will be able to read and understand this later) source code to a
program called a compiler. The compiler then translates this into binary code
understandable by a computer. Once the programme has finished compiling, providing it
finds no errors in it (See Debugging with wxDev-C++), you can run it.
There are a number of ways to compile the program but the quickest is to press
<Ctrl><F9> (See the introduction for more details). Alternatively you can use the menu
option Execute|Compile or you can press the compile button on the toolbar.
Figure 2.7 The compile button
The compile dialog will popup next. Depending on the size of your project this next part
many take a while, but for this program it will take a second or so. When the compiler
has finished the [Cancel] button will change its caption to [Close].
Click on the [Close] button.
Figure 2.8 Compiling.
You are now back at the IDE, so what happened? Where is your new program? Dont
worry we have only built the programme, so now we need to run it. This can also be done
from with in the IDE. Once again you have several options:
Press the keyboard shortcut <Ctrl><F10>.
Or select 'Run' from the menu Execute|Run.
Or use the [Run] button on the toolbar.
Figure 2.9 Running the program
Hey presto, your new program is up and running. Play with it for awhile. The object of
the game is to guess the number the computer has chosen between 0 and 30. When you
are bored press any key and then <Enter> to exit the programme .
Figure 2.10 The jackpot game
So far so good, but wouldnt it be nice to compile and run the programme all in one go?
Well dont be so lazy ☺. But in case you are and all the best programmers are lazy
(actually just interested in saving time when doing repetitive tasks). You can compile and
run using one of the following methods:
Press <F9>.
Or Execute|Compile & Run from the main menu.
Or use the Compile & Run button on the toolbar.
Figure 2.11 Compiling and running in one step
Congratulations you have not only learnt to open projects, but also how to compile and
run them in one step therefore doubling your productivity. (For the male audience, who
said Men cant do two things at once?).
Creating your own project
So you have finished playing Jackpot and you are ready to move on. This chapter was
called Compiling Your
First Program. You have now compiled a programme, but not
your own,so let us move on and do just that.
There are two ways of creating a new project:
From the menus select File|New|Project.
Or from the toolbar, select the New Project but ton.
Figure 2.12 The new project toolbar button
Either of these methods will provide the New Project dialog. Depending on what
packages you have installed on your system this will differ accordingly. You may have
more or less tabs and more or less options on each tab.
Figure 2.13 The new project dialog.
Among the options visible on this tab should be Console Application. If you have many
options here you may need to scroll down until you find it.
Click on the 'Console Application' icon.
The window labeled Description: should now alter to give you a basic description of
this project. In this case it will say A console application (MSDOS window). The other
options shown in this dialog are the project name.
Type MyHelloWorld in the name field
leave the other settings as they are
press the [OK] button.
Figure 2.14 How the New Project dialog should loo k
If you already have a project open a dialog will popup asking you if you really want to
close this project and start a new one. Select Yes. If you have any unsaved files you will
be prompted to save them.
Next you will be presented with a dialog asking where to save the project file. Personally
I browse to c:\Dev-Cpp and there I create a new folder called Projects (if it doesnt
already exist) by clicking on the [Create New Folder] button.
Figure 2.15 Creating a new folder
The new folder will be created and you will be able to edit the name.
Change the folder name to Projects, this folder will become our main store for all
future projects.
Access the 'Projects' folder by double clicking the folder name.
Create another new folder, this time call it MyHel loWorld. (For safetys sake
dont leave any spaces in the name since Dev-C++ reportedly has problems with
spaces in file names.)
Access the MyHelloWorld folder by double clicking the folder name.
Figure 2.16
The filename is already filled in from the name you chose for the project in this case
MyHelloWorld.dev so just press Save.
The project file will be saved and the IDE will display a basic source code file like the
following.
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
system
("PAUSE"
);
return EXIT_SUCCESS;
}
Again I will not go into details about what all this means as we cover this in the next two
chapters. Instead alter the source code to the following, making sure you change the
string constants to your own words.
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
//Change the text Your name goes here to your name
cout <<
"Hello my name is: "
<<
"Your name goes here"
<< endl;
//You can change the text between the quotes to describe yourself by day
cout <<
"Mild mannered reporter by day"
<< endl;
//You can change the lines between the quotes to describe your super self
cout <<
"Caped crusader by night"
<< endl;
//This line pauses the program, try putting // in front of it to see what
//happens
system
("PAUSE"
);
//This line says that the program has terminated normally, ie not crashed
return EXIT_SUCCESS;
}
Press <F9> to compile and run your first program.
A pop up dialog will prompt you to save your source code. Check that the directory
shown at the top next to the label Save in: is ou r project directory, in this case,
MyHelloWorld. wxDev-C++ will automatically have t itled the source code file
main.cpp. The .cpp extension tells the compiler and us that this is a C++ source code
file, not C or any other language. You can change the name (but not the extension) if you
wish, but I would leave it as is and press the [Save] button. Immediately the compiler will
start and a second or so later the program will run. If you made the changes suggested
they will be displayed on the screen.
Figure 2.17 Output from MyHelloWorld program.
Congratulate yourself, you have just successfully written and compiled your first
program. Welcome to the rank of C++ programmers. But to become more proficient
study the next two chapters.
Chapter 3 Basic C Programming
Introduction
In 1972 Dennis Ritchie wrote the C programming language for use on the unix operating
system. In 1978 Kernighan & Richie wrote The C Programming Language, this
provided a semi standard C known today as K&R C. In 1983 the ANSI (American
National Standards Institute) created a standard definition of the C language. This was
completed in 1988 and is known as ANSI C. This more or less makes K&R C obsolete
although you may come across it from time to time. Since then the ANSI committee have
produced a newer standard of C known as C99, the older version being known as C89.
C99 adds a few necessary features and borrows a few from C++.
Neither this nor the next chapter are designed to teach you how to design programmes,
which is a topic which could fill several more books (and start a few minor wars as well).
Neither are they designed to teach you the C and C++ languages in depth. That is the
place of a whole shelf full of books.
These two chapters will skim through the basics of these languages and by means of
examples give you a slight grounding in these. There are many excellent books on these
topics and several excellent websites. (Refer to learning resources in appendix yy)
WARNING: C and C++ are called Case Sensitive languages. This means that printf
is not the same as PRINTF or Printf. Other lang uages are not so strict
and this can cause problems for newcomers from such languages.
Break down of a simple example
To start with we shall look at a basic example of a C language source code file. We shall
create this in wxDev-C++ and compile it to see what it does. Next we will break it down
to see how it does what it does.
To begin the process:
· Ensure wxDev-C++ is open
· Create a new project (as in the previous chapter)
· Select the 'Console Application' option.
· Select the project option 'C Project'
· Name the project 'SimpleC'
Figure 3.1 Project settings for the SimpleC progr am
Click the [OK] button and you will prompted to close any open projects, then
to save this project:
Browse to the Project folder we created earlier and create a new folder inside it called
SimpleC.
Open the 'SimpleC' folder and save the project file.
You will be returned to the IDE with the following freshly generated code
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
system(
"PAUSE"
);
return
0
;
}
Firstly to make it a little easier to know which lines I am referring to, let us turn on the
line numbering feature in wxDev-C++.
Select the main menu option: Tools|Editor Options.
On the Editor Options dialog:
Click on the second tab labeled 'Display'
Click on the check box next to 'Line Numbers'
Figure 3.2 Displaying line numbers
Alter the code to match the following
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
#define TOP_MAN 2
5
#define THE_PRISONER 6
6
7 int main(int argc, char *argv[])
8 {
9 int i =
0
;
10
11 printf(
"Who are you?\n"
);
12 printf(
"I am the new number %d, "
, TOP_MAN);
13 printf(
"You are number %d\n\n"
, THE_PRISONER);
14
15 for(i =
0
; i < THE_PRISONER; i++)
16 {
17 printf(
"Thinking...\n\n"
);
18 }
19
20 if(i == THE_PRISONER)
21 printf(
"I am not a number, I am a free man!\n"
);
22
23 system(
"PAUSE"
);
24 return
0
;
25 }
Press <F9> to compile and run the program.
You will be prompted to save the source code file, save it in the same directory as the
project file. You should be greeted with the following output.
Figure 3.3 Output from the SimpleC program
I am now going to break this example down into various parts which I will discuss briefly
here and then in greater depth in the following relevant sections.
The C programming language has only 32 keywords (listed in Appendix B). None of
which include the provision to output to the screen. Before you say But wait a minute, I
just wrote a program which output a lot of nonsense to the screen, let me explain. What
C lacks in keywords it makes up for in libraries. ANSI C has a large number of libraries
containing functions of various purposes. The function printf is one of these.
Before we can use these functions we need to tell C that we wish to make use of the
library containing that function. We do this using #include statements. We can see
examples of this in lines 1 & 2. All lines beginning with # are called Prepocessor Lines
and we will deal with these in the section Preprocessor. There are also two more
examples in lines 4 & 5, these lines begin with #define and create constant values.
As we have mentioned, C is made up of functions. Later on, in the section 'Functions',
you will create your own functions to get a better feel for them. C demands that there is at
least one function present in every programme and that is the main function. A function
consists of a function header and a body section enclosed by curly braces {}. The code
enclosed within the braces on lines 8 & 25 are in what is known as the body of the
function.
Values can be stored in variables, there is one declared on line 9. The first part int is a
keyword and tells us that the variable will store an integer. An integer can only contain
whole numbers. We give the variable a name i so we can refer to it later, as in lines 15
& 20.
WARNING: In C when a variable is created it can contain any value, so it is best to
assign it a known default such as line 9 where i is assigned the value 0.
Again this is a pitfall for new programmers or those from other languages.
Lines 15 to 18 are an example of a Control Loop a nd will be covered in the next section
Basic C as will lines 20 & 21 which contain an ex ample of a Conditional Execution.
The other lines will be covered in Input/Output and other useful functions.
Basic C
To store data within a C program we use variables. These are defined as in line 8 by first
stating the type of data the variable is to hold, then assigning the variable a unique name.
It is good form to initialise the variable by assigning it a value at this point.
Data types
There are 5 basic data types in C89. These are char, int, float, double and
void. char is designed to hold data values corresponding to a character. int is
designed to hold whole numbers. float and double hold floating point numbers and
void is a null value. Some of these data types can be extended with the keywords
signed, unsigned, long, and short. int can take all of these values, char
can be signed or unsigned and double can have long applied. Unsigned data
types can only hold numbers from 0 to their maximum range. Signed data data halve this
and give half the range to negative figures and half to positive figures. The C standard
specifies a minimum range for data types, but not a maximum which can vary between
compilers and platforms. The following program called DataSize demonstrates these
sizes.
1
#include <stdio.h>
2
#include <stdlib.h>
3
4 int main(int argc, char *argv[])
5 {
6 printf(
"The size of a char is %d bits\n"
,
8
* sizeof(char));
7 printf(
"The size of a unsigned char is %d bits\n"
,
8
* sizeof(unsigned
char));
8 printf(
"The size of an int is %d bits\n"
,
8
* sizeof(int));
9 printf(
"The size of a unsigned int is %d bits\n"
,
8
* sizeof(unsigned
int));
10 printf(
"The size of a long int is %d bits\n"
,
8
* sizeof(long int));
11 printf(
"The size of a short int is %d bits\n"
,
8
* sizeof(short int));
12 printf(
"The size of a double is %d bits\n"
,
8
* sizeof(double));
13 printf(
"The size of a float is %d bits\n"
,
8
* sizeof(float));
14 printf(
"The size of a void is %d bits\n"
,
8
* sizeof(void));
15 printf(
"The size of a long double is %d bits\n"
,
8
* sizeof(long double));
16 system(
"PAUSE"
);
17 return
0
;
18 }
Variable names
Variable names have certain limitations. The name cannot be a keyword, it must be
unique and can contain any alpha numeric characters and underscores, as long as the
name does not begin with a number.
Statement blocks
You will have noticed in the code examples so far, the use of {} braces. These braces
enclose code within what is called Statement Blocks. The significance of this can be
seen in the next section Scope. Braces must alway s be used in pairs, i.e. the opening
brace {must have a corresponding closing brace}. If you have problems with
mismatched braces see the warning on under parenthesis operators.
Scope
Variables are said to have Scope in C and you can only refer to or use variables that are
in scope. There are several types of scope. One is global scope, variables of this type can
be accessed by all parts of your programme (which may involve several source files). A
second type is file scope, variables of this kind can only be accessed by code within a
single source code file. The significance of the difference between global and file scope
will be apparent later. The last type that we will discuss is local scope. Variables declared
within statement blocks are only visible to code that is also contained within the same
block.
Operators
Operators (=,&,%,!,| etc) break down into several groups: assignment, arithmetic,
relational, logical, bitwise, pointer, reference, indexing and parenthesis are all operator
types. There are a few others which we won't discuss at all. Pointer operators will be
discussed under Pointers, reference operators wil l be discussed under Structures and
indexing operators under Arrays. Bitwise operator s will not be discussed at all.
Assignment Operators
The main assignment operator is = for example int x = 0; This expression assigns
the value zero to the variable x. The value being assigned must always be on the left of
the expression, eg 0 = int x is not a valid statement. It is also possible to do multiple
assignments for example x = q = r = t = 0; In this example the variable t is
assigned the value zero, then the variable r is assigned the value of t and so on down to
x. It is also possible to declare and assign multiple variables of the same type at the same
time eg int i=0, a=5,b=10,c=15;
If you assign variables of one data type to variables of another data type, then what is
known as an automatic type conversion takes place. When the value on the right side of
the expression is assigned to the variable on the left, an attempt is made to automatically
convert it to the data type of the left side variable. If the type on the left has a smaller
range than the type on the right then data will be lost. The following example program
demonstrates this.
Create a new project as normal.
Call it TruncationAssignment.
1
#include <stdio.h>
2
#include <stdlib.h>
3
4 int main(int argc, char *argv[])
5 {
6 short int aShortInt=
0
;
7 float aFloat =
536546.64645
;
8 long int aLongInt=
2045654297
;
9
/*Print the value of the long int*/
10 printf(
"The long int value is: %d\n"
,aLongInt);
11
/*Convert the long int to a short int*/
12 aShortInt = aLongInt;
13 printf(
"The long int has been assigned to a short int\n"
);
14
/*Print the value of the short int*/
15 printf(
"The value now = %d\n\n"
,aShortInt);
16
/*Repeat for a float to int*/
17 printf(
"The float value is: %f\n"
,aFloat);
18 printf(
"The float has now been assigned to a short int\n"
);
19 printf(
"The value is now: %d\n"
,aShortInt);
20 system(
"PAUSE"
);
21 return
0
;
22 }
The compiler may warn you about the possibility of data loss when you do this. If you
intend to convert from one data type to another you can tell the compiler that you intend
this by using cast. For example if x is an integer then you can use this expression
float y = (float) x/3;
There are also shorthand assignment operators. Sometimes you will want to assign a
variable to itself plus or minus another value. For example x = x 20; you can do
this in shorthand using x -= 20; += is also equally valid. You will see this use of
shorthand operators a lot in professional programs.
Arithmetic Operators
There are seven different arithmetic operators, the basic four:
+ for addition
/ for division
* for multiplication
- for subtraction
There are two shorthand arithmetic operators. These are -- and ++ which are used to
increment or decrement a variable by one. For example you can write x = x + 1; or
x++;. The shorthand operators can be used before or after a variable, for example y =
x++; or y = ++x; . You may ask what is the difference? The difference is that the first
one sets y to equal x then sets x to equal x + 1. The second sets x to be x + 1 then assigns
the result to y. A subtle but important difference.
The final operator is the modulus operator %. This can only be used with integers and it
returns the remainder of an integer division.
Relational Operators
Relational operators compare two different values and give a result of true or false (1 or
0) . The six relational operators are:
> greater than
>= greater than or equal to
< less than
<= less than or equal to
== equal to
!= not equal to
Logical Operators
Logical operators can be used with true or false (that is 1 or 0) values. There are three
such operators:
&& AND
|| OR
! NOT
They give the following values according to this table.
X Y X && Y X || Y !X
0 (false) 0 (false) 0 (false) 0 (false) 1 (true)
0 (false) 1 (true) 0 (false) 1 (true) 1 (true)
1 (true) 1 (true) 1 (true) 1 (true) 0 (false)
1 (true) 0 (false) 0 (false) 1 (true) 0 (false)
Because logical operators work with true/false values they can be combined with
relational operators. For example 4>6 && 3<7 || 7!=5.
NOTE: There is no XOR operator in C, but this can easily be created using a
function.
Parentheses Operators
C operators work on the order of precedence. This means that in an expression like the
following x = 40 + 3 / 5 + 7 * 352; does not mean that you can evaluate it from right to
left. Depending on the precedence of operators the order of calculation may be different.
To force this to be evaluated in the way you want you need to use parentheses operators
( ). For example x = (40 + ( 3/(5+(7*352)))). The innermost pair of brackets is
calculated first and then the order works outwards from that.
WARNING: Make sure that you have the same number of closing brackets as opening
brackets otherwise the compiler will issue a complaint like this:
main.c: In function `main':
main.c:6: error: syntax error before ';' token
equally if you have more closing brackets than opening brackets you will
get a complaint like the following:
main.c: In function `main':
main.c:6: error: syntax error before ')' token
If you are having trouble with mismatched braces you can turn on brace
highlighting. Go to Tools|Editor Options. On the dialog that appears check
the box next to Highlight matching braces/parentheses as shown below.
Now if you select a bracket the editor will attempt to show you the
matching bracket.
Conditional Loops
Left to its own devices, a program starts at the top and works through to the end where it
quits. Sometimes between starting and finishing you want the program to carry out the
same sequence of commands again and again. For instance you might want to print out
Go away 20 times until someone gets the message. You could just type in the
commands one after the other like this.
printf(
Go away!\n
);
printf(
Go away!\n
);
printf(
Go away!\n
);
printf(
Go away!\n
);
This might not seem too much of a hardship, but what if you wanted to do it 2000 times,
you would soon get bored of writing the same thing. It would also be hard to maintain the
code. What if you later had to reduce it to 863 times? Fortunately there is a much simpler
method called Conditional looping.
C has 3 types of loops the for loop, the while loop and the dowhile loop. The
dowhile loop guarantees that the contents will be executed at least once since the loop
condition is not checked until the end. The code contained in while and for loops may
never be executed since the condition is checked at the beginning of the loop, and if it is
not true the loop statement is skipped.
The for statement has this general form:
for( <loop initialization>,<condition check>,<loop increment>)
It is possible to make use of the for statement in many unusual ways, but we will only
consider the basic usage here. The while and dowhile loops are much simpler
since they contain only the condition check.
Create a new project called Loopy and amend the c ode to the following.
1
#include <stdio.h>
2
#include <stdlib.h>
3
4 int main(int argc, char *argv[])
5 {
6
/* Variable to check the loop condition */
7 int i =
0
;
8 printf(
"For loop countdown to liftoff\n"
);
9 for(i=
10
;i>
0
;i--)
10 {
11 printf(
"%d\n"
,i);
12 }
13 printf(
"We have lift off.\n\n"
);
14 system(
"PAUSE"
);
15
16 printf(
"\nWhile loop count to five\n"
);
17
/*Reset i to 0, then try a while loop*/
18 i =
0
;
19 while(i <=
5
)
20 {
21 printf(
"Just checked condition i <= 5 and "
);
22 printf(
"i actually = %d\n"
,i);
23
/*Need to increment i*/
24 i++;
25 }
26 system(
"PAUSE"
);
27
28 printf(
"\nDo...while loop count to five\n"
);
29
/*Reset i to 0, then try a do...while loop*/
30 i =
0
;
31 do
32 {
33 printf(
"i = %d and "
,i);
34
/*Need to increment i*/
35 i++;
36 printf(
"just about to checked condition i <= 5\n"
);
37 }while(i <=
5
);
38 system(
"PAUSE"
);
39
40 return
0
;
41 }
Code analysis: On line 7 we create the counter variable i and initialize it to the value 0.
In lines 9 to 12 we create a for loop. Above we have shown that the 'for' statement can
take three arguments, the initialization, the condition check and the increment.
The initialization i=10 sets our variable i to 10 and is only done once.
The condition check i>0 checks that i is greater than zero and is done on each
loop. When the condition check produces a false answer, the loop ceases.
The increment i-- decreases the value of i by 1 on each iteration through the loop
In lines 19 to 25 we create a while loop. The condition is checked before the loop runs,
and must remain true for the loop to continue running. In this case that i is greater than
or equal to 5. Line 24 increases i by one during each loop.
In lines 31 to 37 we create a dowhile loop. This is very similar to the while loop,
except that the condition is checked at the end.
If the for loop contains just a single line of code then you can use the shorthand form
which leaves out the brackets. For example lines 9 to 12 could have been written as
9 for(i=
10
;i>
0
;i--)
10 printf(
"%d\n"
,i);
In this case the code executed by the for loop ends at the semicolon at the end of line
10. It is possible to escape from a loop at anytime by using the keyword break, this
will leave the loop and begin executing the code directly after the loop.
NOTE: The while loop ends on line 25 with a } bracket. However t he
dowhile loop ends on line 37 with while(); . The semicolon at the
end of the while statement is vital, if you miss it out the program will not
compile.
WARNING: All three loops altered the check condition by altering the value of i. If the
value of i had not changed the check condition would always be true and
the loop would continue for ever. To check this, delete line 35 and compile
and run the program again. To stop the program press <Alt><F2> from
within wxDev-C++ or click on the button shown.
Conditional Execution
In programming, as in life, there will be times when you want to do something and times
when you dont. For example if it is raining you wi ll probably want to stay in bed and
sleep. If it is sunny you probably wont. This is called Conditional execution and can be
achieved using the if statement.
The if statement takes the form:
if(<Check Condition>)
Sometimes you want to do several different things depending on the value of the check
statement, in this case you can follow the if check with else if checks or an else to
do something in the event of an if check failing. Example code follows, so create a new
project and call it IfBob, then modify the code t o look like the following.
1
#include <stdio.h>
2
#include <stdlib.h>
3
4 int main(int argc, char *argv[])
5 {
6 int BobsAge =
0
;
7 for(BobsAge =
0
;BobsAge <=
100
;BobsAge +=
10
)
8 {
9 if(BobsAge <=
0
)
10 {
11 printf(
"Bob has not been born yet\n"
);
12 }
13 else if (BobsAge <=
10
)
14 {
15 printf(
"Bob is a young boy\n"
);
16 }
17 else if (BobsAge >
20
&& BobsAge <=
30
)
18 {
19 printf(
"Bob is a young man\n"
);
20 }
21 else if (BobsAge <=
80
)
22 {}
23 else if (BobsAge >
80
&& BobsAge <=
90
)
24 {
25 printf(
"Bob is a old man now\n"
);
26 }
27 else
28 {
29 printf(
"Bob has just got a telegram from the Queen\n"
);
30 }
31 }
32 system(
"PAUSE"
);
33 return 0;
34 }
In a group of if else statements, each condition is checked in turn from top to bottom
until a true one is found. The first true condition is executed. If none of them are true, the
code following the else statement is executed.
In the example the if..else if..else statements are inside a for loop to make
sure that they are all executed. As we noted earlier with for statements if a single line of
code follows the check then the brackets can be omitted.
The if statement is not the only conditional execution statement. There is a shorthand
form, (sometimes called a ternery operator since it takes three arguments) ?: which
takes the form:
<Conditional Check>?<Code If True>:<Code If False>
The following short program illustrates this. Create a new project called BobsLife.
Change the code to the following.
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
#define ALIVE 1
5
#define DEAD 0
6 int main(int argc, char *argv[])
7 {
8 int BobStatus = ALIVE;
9 printf(
"Bob is "
);
10 BobStatus == ALIVE?printf(
"alive\n"
):printf(
"dead\n"
);
11 system("PAUSE");
12 return
0
;
13 }
Line 10 checks BobsStatus against the value ALIVE. If this is true the first printf
statement is executed, if not the second is executed.
The final form of conditional execution statement is the switch...case statement.
This works like a series of if..else if..else statements. The switch statement
can only check integer values. The switch statement contains an expression, the value of
which is checked against a list of case statements. If any of the case statements match the
code contained in the switch statement, that case statement is executed. Each case
statement ends with a break statement; if this is omitted then the code in the following
case statement is executed. The final statement is called default. This contains code to be
executed if none of the case statements return true.
The following program will demonstrate this. Create a project called DayCalculator.
Modify the code to match the following.
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
#define MONDAY 1
5
#define TUESDAY 2
6
#define WEDNESDAY 3
7
#define THURSDAY 4
8
#define FRIDAY 5
9
#define SATURDAY 6
10
#define SUNDAY 7
11
#define NO_DAY 8
12
13 int main(int argc, char *argv[])
14 {
15 int day = MONDAY;
16 for(day = MONDAY;day <= NO_DAY;day++)
17 {
18 switch(day)
19 {
20 case MONDAY:
21 printf(
"It's Monday, off to work\n"
);
22 break;
23 case TUESDAY:
24 printf(
"It's Tuesday, long week ahead\n"
);
25 break;
26 case WEDNESDAY:
27 printf(
"It's Wednesday, halfway there\n"
);
28 break;
29 case THURSDAY:
30 printf(
"It's Thursday, one more day to go\n"
);
31 break;
32 case FRIDAY:
33 printf(
"Thank Crunchie, it's Friday\n"
);
34 break;
35 case SATURDAY:
/*This is an example of a drop through*/
36 case SUNDAY:
37 printf(
"It's the weekend, let's live it up\n"
);
38 break;
39 default:
40 printf(
"Hey! This day cannot exist\n"
);
41 }
42 }
43 system(
"PAUSE"
);
44 return
0
;
45 }
To me at least, the switch looks a little strange and 'un' C like. Watch those break
statements, they can be the cause of major problems. Other languages like Visual Basic
have similar statements such as Select. But in those languages the break
statement is not required and the following statement is not executed by dropping through
as in line 35 in the above example. If in your program several statements seem to be
executed, make sure you have added the break statements. Remember that the default
statement will only be executed if none of the others are, or if the preceding break
statement is forgotten.
You may wonder why C is designed this way after a ll would it not just be simpler for
execution to stop at the start of the next case statement. Doing this would remove the
advantage of being able to execute the same code for more than one case such as in lines
35 to 37 where both Saturday and Sunday require the same output.
NOTE: You may come across statements like if(x), what does this mean. Since
an if statement checks for true/false values if x equals 0 the if check will
fail, anything higher than 0 is considered to be true. This could be written
if(x != 0) , but this is considered bad form.
WARNING: C and C++ are unusual in that to assign a value to a variable you use = as
in MyAge = 243;. To test for equality you need to use == as in
if(MyAge == 243). This is a feature that can cause many errors,
especially since this code if(MyAge = 243) will compile without the
compiler telling you there is an error. This if statement will always be
true and the code after it will always be executed.
Preprocessor
The preprocessor is an unusual feature of C. It runs before the compiler and alters your
source code by inserting function declarations from header files, expanding macro
definitions, and determining which code should or should not be compiled. Preprocessor
statements always begin with a # and unlike C the lines dont end with a semi-colon.
The most common preprocessor is the #include statement. This takes the form of
either #include <filename.h> for library header files or #include
filename.h for your own header files. As you will learn in the next section
Functions, C does not allow a programmer to use a function until it knows what the
function name is, what parameters it should expect to receive, and what value the
function will return. #include statements add all that information to the start of your
source code file. In the SimpleC example we include the files stdio.h and
stdlib.h. We need stdio.h for the function printf, and stdlib.h for the
function system.
NOTE: On platforms other than Windows include file names are case sensitive
and a common error is to use the incorrect case, which results in the
compiler not finding the correct file.
The second most common is the #define statement. This is used to define a constant
name which has a value. Wherever that constant name appears in your code the
preprocessor will swap it for its value. This is often used for constant variables (variables
which dont change their value). A useful feature of this is it helps to make your code self
documenting. For example you can create a define like this:
#define DAYS_IN_A_WEEK 7
Then use it in your code:
for(i = 0;i <DAYS_IN_A_WEEK;i++)
which makes it much easier for others to work out what you intend the code to do, than
the line:
for(i=0;i<7;i++)
It is convention to write constant variables in uppercase.
Along with #define are #ifdef, #ifndef, #else, #endif and #undef.
These can be used to include or exclude blocks of code based on the value of a #define
statement. Code following #ifdef FRED will only be compiled if FRED has been
defined. Code following #ifndef FRED will only be compiled if FRED has not been
defined. #endif ends the code block and #undef undefines a previous #define
constant.
Finally in a similar vein are the statements #if, and #elif, they test for the truth of a
statement and work in the same manner as #ifdef including code if the statement is
true.
The following code example uses all these preprocessor statements. Create a new
Console Application called Prepro. Save it in a folder called Prepro and then edit it
to resemble the following code example. See if you can work out what the output will be
before you compile and run it.
1
#include <stdio.h>
/*include this library to allow us access to printf*/
2
#include <stdlib.h>
/*include this library to allow us to use system*/
3
4
#define RED_BALLOONS 99
/*Define RED_BALLOONS to be equal to 99*/
5 int main(int argc, char *argv[])
6 {
7
#ifdef RED_BALLOONS
/*Check if RED_BALLOONS has been defined*/
8 printf(
"There were %d red balloons\n"
,RED_BALLOONS);
9
#else
/*Do this if the previous #ifdef was false*/
10 printf(
"There were no red ballons\n"
);
11
endif
/*End this conditional block*/
12
13
#if RED_BALLOONS < 98
/*Check if RED_BALLOONS is lower than 98*/
14 printf(
"There were less than 98 red balloons\n"
);
15
elif RED_BALLOONS > 98
/*If previous #if was false check this one*/
16 printf(
"There were more than 98 red balloons\n"
);
17
#endif
/*End this conditional block*/
18
19
#undef RED_BALLOONS
/*Remove define RED_BALLOONS*/
20 printf(
"\nBIG BANG!\n\n"
);
21
22
#ifndef RED_BALLOONS
/*Check if RED_BALLOONS has not been defined*/
23 printf(
"There were no red ballons\n"
);
24
#else
/*Do this if the previous #ifndef was false*/
25 printf(
"There were %d red balloons\n"
,RED_BALLOONS);
26
#endif
/*End this conditional block*/
27
28 system(
"PAUSE"
);
29 return
0
;
30 }
Functions
Functions are self contained blocks of code, they can be thought of as mini programs that
take in various parameters, do something with these and return a result. Functions are
defined like this:
Return_Type Function_Name (Parameter_Type Parameter_Name, )
{
Block of code;
}
The return type is either a data type such as int, float, etc, a pointer to a memory
location, a user defined data type such as a struct, or void. In the case of void you
are specifying that the function will return nothing. The function ends when it reaches a
return statement, (or the end of the code block if the return type is void). Any code
after a return statement is called Unreachable code since it wi ll never be executed.
The function name can be anything you wish with a few caveats. The name must be
unique, therefore you cannot create a function called printf if you #include
stdio.h, since this would confuse the compiler. The name must also conform to
the same naming conventions as variables. It is good form to give the function a name
that indicates its purpose, e.g. DisplayMenu instead of MyThingyFunction.
A function can take any number of parameters or none. Each parameter must be given a
name and associated data type. These data types are the same as those previously
discussed. Within the function, the parameters act as variables with local scope.
In your C programs you will always use at least one function, this is the main function.
This is a special function since program execution will start at the beginning of this
function and finish at the end of it. main follows the same rules as other functions, it has
a return type int, which is used to indicate whether the program executed without error
or not. It also takes parameters, these are passed to the program when it starts.
Functions can serve two different purposes. Firstly they can break your program into
smaller subunits to make them easier to understand. Secondly they allow you to reuse
blocks of code again and again rather than repeatedly writing the same code block.
We will create a program which uses a couple of basic functions to get a feel for them.
Ensure wxDev-C++ is running.
create a new C project called Functions
and save it in a folder called Functions in your Project folder.
The code follows below.
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
/*This function has no parameters and returns nothing*/
5 void DisplayMenu()
6 {
7 printf(
"\n1. Calculate 5 + 4\n"
);
8 printf(
"2. Print 3 Names\n"
);
9 printf(
"3. Quit this lunacy\n"
);
10 }
11
12
/*This function has two parameters both are integers it adds
13
these together and returns a integer which is the result*/
14 int Calculate(int FirstNumber, int SecondNumber)
15 {
16 return FirstNumber + SecondNumber;
17 }
18
19
/*This function has no parameters and returns nothing*/
20 void DisplayNames()
21 {
22 printf(
"\nThree Names\nHumphrey\nIngrid\nPeter\n"
);
23 }
24
25 int main(int argc, char *argv[])
26 {
27 int UsersChoice =
0
;
28
29 while (UsersChoice !=
3
)
30 {
31
/*Call function to show menu*/
32 DisplayMenu();
33
/*Function from stdio.h which reads the users input*/
34 scanf(
"%d"
,&UsersChoice);
35
36 if(UsersChoice ==
1
)
37
/*Call the Calculate function from within the printf function*/
38 printf(
"\n5 + 4 = %d\n"
,Calculate(
5
,
4
));
39 else if (UsersChoice ==
2
)
40
/*Call the DisplayNames function*/
41 DisplayNames();
42 }
43
44 return
0
;
45 }
The programme starts at the beginning of the main function. It declares a variable
UsersChoice and sets its value to 0. It then enters a condit ional loop, and as long as
the variable UsersChoice doesnt equal 3, it will continually execute the statements
inside. Within the loop, the first call is to the function DisplayMenu. This prints the
menu on the screen. Then it calls a function that is new to us, scanf. (We will learn
more about scanf later.) The programme now enters a conditional execution area,
where, depending on the value of UsersChoice, it either calls the function
Calculate or DisplayNames. Finally, once UsersChoice equals 3, the return
statement is executed and, as we have learnt, that is the end of the main function so the
programme ends.
Does it matter where we put a function in our source code? The answer is both yes and
no. To demonstrate this we will create another project.
Carry out the usual project creation process calling the new project PostFunction.
Create a new folder called PostFunction and save the project there.
1
#include <stdio.h>
2
#include <stdlib.h>
3
4 int main(int argc, char *argv[])
5 {
6 DisplayBoringMessage();
7 system("PAUSE");
8 return
0
;
9 }
10
/*This is a boring function*/
11 void DisplayBoringMessage()
12 {
13 printf(
"This is a boring message\n"
);
14 }
Before trying to compile this programme, try to work out what will happen when it runs.
Then press <F9>. You should find the programme doesnt run and inside the message
window on the bottom of the IDE, displays the following errors.
Figure 3.4 Error message.
Get used to such messages you will see them a lot as you progress. But what was wrong?
Let us try to work it out from the message. The first line says conflicting types for
DisplayBoringMessage, thats the name of our funct ion so what is wrong with it. Well
the first error has come in line 12 of our source code. The next error message tells us that
in line 6 there was a previous implicit declaration of DisplayBoringMessage. Why is
this? Because before you use a function C needs to know about it.
We can get around it by Declaring the function th at is by telling the compiler what the
function name is, what the return type is and what parameters it takes. Try adding the
following line into the source code in line 3.
void DisplayBoringMessage();
Since this is a declaration it ends with a semi-colon. Press <F9> to compile and run. You
should see that the program runs just fine now. The line you added is called the
Declaration of the function and the code in lines 11-14 is called the Definition of the
function. When you include header files you are actually including the declaration of
function like printf so that you can use them.
Log in to post a comment