PDF An Introduction To C GUI Programming Simon Long Download
PDF An Introduction To C GUI Programming Simon Long Download
com
https://textbookfull.com/product/an-introduction-
to-c-gui-programming-simon-long/
https://textbookfull.com/product/effective-c-an-introduction-to-
professional-c-programming-1st-edition-robert-c-seacord/
textbookfull.com
https://textbookfull.com/product/an-introduction-to-orthodontics-
simon-j-littlewood/
textbookfull.com
https://textbookfull.com/product/introduction-to-programming-
with-c-1st-edition-nhce/
textbookfull.com
https://textbookfull.com/product/the-prison-boundary-between-society-
and-carceral-space-1st-edition-jennifer-turner-auth/
textbookfull.com
Envisioning Empire The New British World from 1763 to 1773
James M. Vaughn
https://textbookfull.com/product/envisioning-empire-the-new-british-
world-from-1763-to-1773-james-m-vaughn/
textbookfull.com
https://textbookfull.com/product/millers-review-of-orthopaedics-7th-
edition-mark-miller/
textbookfull.com
https://textbookfull.com/product/the-startup-owner-s-manual-the-step-
by-step-guide-for-building-a-great-company-1st-edition-steve-blank-
bob-dorf/
textbookfull.com
https://textbookfull.com/product/the-cowboy-s-cop-caston-springs-
colorado-book-2-1st-edition-melissa-williams-williams-melissa/
textbookfull.com
https://textbookfull.com/product/freshwater-ecosystems-in-protected-
areas-conservation-and-management-1st-edition-arthington/
textbookfull.com
AN INTRODUCTION TO
& GUI
PROGRAMMING
Simon Long
2 AN INTRODUCTION TO C AND GUI PROGRAMMING
AN INTRODUCTION TO C AND GUI PROGRAMMING
3
First published in 2019 by Raspberry Pi Trading Ltd, Maurice Wilkes Building,
St. John's Innovation Park, Cowley Road, Cambridge, CB4 0DS
ISBN: 978-1-912047-65-9
The GTK logo is copyright The GNOME Foundation and licensed under LGPL v2.1+
Welcome to
An Introduction to C
& GUI Programming
T
he C programming language was invented in the early 1970s, and since then has
become one of the most popular and widely used general-purpose languages. C can
be used to create simple command-line programs, or embedded code to operate the
tiny microcontrollers in toasters and watches. At the other extreme, it can be used to create
rich graphical desktop applications – in fact, most of Linux (and Raspbian itself) is written
in it. It can give you control over the smallest details of how a processor operates, but is still
simple to learn and read. The first part of this book is an introduction to programming in C for
absolute beginners; the second part shows how to use C to create desktop applications for
Raspbian, using the GTK toolkit. You don’t need any programming experience, and a Raspberry
Pi running Raspbian is all you need to get started.
5
About the Author
S imon Long is an engineer working
for Raspberry Pi. He is responsible
for the Raspberry Pi Desktop and its
associated applications. Before joining
Raspberry Pi, he worked for Broadcom,
where he first met Eben Upton, and before
that spent ten years working as a software
engineer and user interface designer for
a major consultancy firm. In his spare
time, he enjoys solving those really hard
crosswords without any black squares.
Contents
Chapter 1: Getting started 010
Learn how to use C to program the Raspberry Pi
7
Chapter 11: More about types and variables 063
Type definitions, enumerations, and more
9
Chapter 1
Getting started
C is one of the most widely used programming languages
– learn how to use it to program the Raspberry Pi!
#include <stdio.h>
#include <stdio.h>
This is known as a hash-include. As mentioned above, the C language has a large library of
functions that can be included, and we need to use one of them in this program: the formatted
print command printf. This is part of the standard input-output library, or stdio for short.
So what this line does is to warn the compiler that the program needs the stdio library to be
included as part of the compile process.
/* A print statement */
First, we have a comment telling us what’s going on. Comments in C start with the symbol
/*, and end with */ – anything between those two symbols is ignored by the compiler.
The code itself is just one line:
This is a call to the printf (‘print formatted’) function from the stdio library. In this case,
it takes a single argument, which is a text string enclosed within double quotes. As mentioned
above, function arguments are enclosed in round brackets.
Note that the line ends with a semicolon. All statements in C must finish with a semicolon;
this tells the compiler that this is the end of a statement. One of the most common beginner
mistakes in C is to forget a semicolon somewhere!
What about the string itself? The Hello World! bit is straightforward enough, but what
about that \n at the end? Remember this function is called ‘print formatted’? Well, the \n is a
bit of formatting; it’s the symbol for a newline character. So this line will print the string ‘Hello
World!’, followed by a new line.
This calls the gcc C compiler with the option -o myprog, which tells it to create an
executable output file called myprog, and to use hello.c as the input source code.
If you entered your C code correctly (did you make sure the semicolon was there?), this
should take a second or so and then return you to the command line. There should now be a
file in the current directory called myprog – try running it by typing:
./myprog
Hello World!
5You interact with both the C compiler and your compiled C programs from the command
line; you can either do this in a terminal window in the desktop, or by booting your
Raspberry Pi straight to the command line
That’s your first C program written, compiled, and run. In the next chapter, we’ll start using C
for something a bit more useful…
Variables
and arithmetic
Doing some real work in C: creating variables and performing
mathematical operations on them
I
n some languages, you can create variables as you go along and put whatever data you
want into them. C isn’t like that: to use a variable in C, you need to have created it first,
and at the time you create it, you have to set what type of value it’s going to store. By
doing this, a block of memory of the correct size can be allocated by the compiler to hold the
variable. This process of creating a variable is known as declaration.
Integers
There are several fundamental data types in C, but we’ll start by looking at one of the most
commonly used: the int type, used to store an integer value.
#include <stdio.h>
a = 2;
c = a + b;
printf ("The sum of adding %d and %d is %d\n", a, b, c);
}
The top three lines inside the main function here are declarations. They tell the compiler
that we would like to use variables called a, b, and c respectively, and that each one is of type
int, i.e. an integer.
In the second line, we see an example of an initialisation at the same time as a declaration:
this stores an initial value of 3 in the variable b. Note that the values of a and c at this point are
undefined; you might assume that a variable which hasn’t had a value stored in it is always 0, but
that isn’t the case in C. Before reading the value from a variable or using it in a calculation, you
must store a value in it; reading a variable before initialising it is a common error in C.
The next two lines do some actual work with the variables we have declared.
a = 2;
This stores a value of 2 in the variable a, which will now have this value until it’s changed.
The reason a is called a variable is that it can vary: you can change its value as often as you
like, but only to another integer. The value of a variable can change, but its type is fixed when it
is declared.
c = a + b;
This is another use of the formatted print function we saw in the previous chapter. Note the
three %d symbols inside the string: these are format specifiers, and they are how you output
numbers in C. When the printf function is executed, each %d is replaced by a decimal
representation (d for decimal integer) of the variable in the corresponding position in the list
after the string. So the first %d will be replaced by the value of a, the second with the value of
b, and the third with the value of c.
Compile the program above and then run it. You should see this in the terminal:
MULTIPLE DECLARATIONS
You can declare multiple variables of the same type in one line, separated by commas.
For the example here, instead of three separate int declarations, you could type
int a, b = 3, c; on one line.
Floating-point numbers
So we can add two integers together; what else can we do? One thing we might want to do
is to use floating-point numbers: numbers with a decimal point. These have a different type,
called float. Try changing the code above so instead of:
int a;
float a;
This tells the compiler that a is now a floating-point value, rather than an integer. Compile
and run your program. What happens?
Oops! That doesn’t look right, does it? What has happened is that, while the maths is still
all correct, the printf statement is now wrong; you’re telling it to print a, which is a floating-
point value, as a decimal integer. To fix that, change the first %d in the printf function to %f,
which is the format specifier for a floating-point number, like this:
That should produce something a lot more sensible when you run it. This is an important
lesson about C: it will do exactly what you tell it to, even if it makes no sense. You told it to
show you a floating-point number as if it were a decimal integer, and the compiler assumed
that was what you wanted, even though the result was nonsense.
When you’re working with variables, always keep track of what values you’re putting in what
types, as it’s easy to introduce errors by assuming a variable is of one type when it’s actually
another. One common error is to put the results of a calculation on floating-point values into
an integer.
Try this: make b a float as well (not forgetting to change its format specifier in the printf),
but leave c as an int, and set the two floats to values with decimal points, like this:
float a;
float b = 3.641;
int c;
a = 2.897;
c = a + b;
printf ("The sum of adding %f and %f is %d\n", a, b, c);
6? That’s not right! But it’s exactly what you’ve asked for. What the compiler did was to add
the two floating-point values together, and got the answer 6.538, but you then told the compiler
to put that into c, an integer variable. So the compiler just threw away everything after the
decimal point! If you change c to a float, and change the final %d to %f, you’ll find it gives the
correct answer.
ARITHMETIC SHORTHAND
C allows shortcuts for some common operations; for example, instead of typing a = a + 1,
you can just enter a++. Or for a = a * 3, you can enter a *= 3.
DECIMAL PLACES
You can set the number of decimal places to display for a floating-point type specifier in
printf by putting a decimal point and the number of places between the % and the f – so
%.3f will show a float value with three digits after the decimal point.
Other types
Another common variable type is char, a character value. This is used, as the name suggests,
to store a single character. The ASCII character encoding uses a single value between 0 and
127 for each letter, number, and punctuation symbol, so a char is a single byte; it's really just
an integer value which can only hold small numbers. The compiler allocates several bytes to
store an int or a float, but only allocates a single byte of memory to store a char.
char a;
…declares a variable which can hold values from -128 to 127, while…
unsigned char a;
When doing arithmetic with chars, it is important to make sure that the answers to any
calculation will fit into the variable. If, say, you have a char containing the value 100, and you
add 30 to it, you would expect to end up with the result 130 – but as above, a char can only
hold values up to 127. So the value your char will actually end up containing is -126, because
values over 127 – the highest value a char can store – wrap around to the lowest value (-128)
and start counting up from there. This 'overflow' behaviour is a common cause of bugs in C
programs which do arithmetic.
REMEMBER PRECEDENCE
C obeys the common rules for operator precedence – so a = a + 2 * 3 evaluates
the multiply first and then adds the result, 6, to a. You can use round brackets to change
precedence – a = (a + 2) * 3 gives 3a + 6.
That gives you some idea about how C handles numbers, and how you can use it for
arithmetic; in the next chapter, we’ll look at how to use the results of calculations to
make decisions.
Chapter 3
Conditions
and comparisons
Branches and loops: controlling the flow of your C program
O
ne of the fundamentals of any programming language is the ability to make
conditional operations – to change the program’s flow depending on the result
of a test.
In this chapter, we’ll look at how you test conditions within your C programs, and how you
use the results to determine what happens next.
In C, the mechanism for controlling flow based on testing a condition is the if-else
statement. Here’s a simple example:
#include <stdio.h>
if (a == 0)
{
printf ("a is equal to 0\n");
}
else
{
printf ("a is not equal to 0\n");
}
}
Here, the keyword if is followed by a test enclosed in round brackets, in this case
(a == 0). If the test evaluates as true, the operations enclosed by the curly brackets after
the test are executed.
This example also shows the use of an else clause. At the end of the curly brackets around
the operations which you want to execute if the test is true, there’s an else followed by
CURLY BRACKETS
Curly brackets are used to group together a set of statements which always execute together.
If your loop or if statement only needs to execute one single statement, you can leave out the
curly brackets after the test, but this can make the code's purpose less obvious to a human!
= or ==
That’s all fine, but what’s this a == 0 all about? Surely if we want to know whether a is equal
to 0, we just put a = 0? Why the two equals signs? Well, try replacing the double equals sign
with a single equals and see what happens.
This is a very important aspect of C syntax, and a common source of bugs. The equals sign
is used for two different things: one is to assign a value to a variable, whereas the other is to
test whether a variable is equal to a value. A single equals sign (=) assigns a variable; a double
equals sign (==) tests a variable.
So the statement…
if (a == 0)
…tests to see if a is equal to 0. If it is, then the test evaluates as true, and the code
immediately after the if is executed.
But the statement…
if (a = 0)
…doesn’t compare a against 0 at all: it just sets a to 0. So how does the compiler decide
what to do next? In this case, it just looks at the value of what’s in the brackets; you’ve set a to
0, so the value inside the brackets is 0.
In C, a value of 0 is equivalent to false, and a non-zero value is equivalent to true. So by
replacing the double equals with a single equals, you’ve changed the value of a, and then you
look to see if the value you’ve set a to is equivalent to true or false; neither of which were what
you wanted to do! If a C program is behaving strangely, check very carefully that all your tests
are actually tests and not assignments: this is a very easy mistake to make.
So == is the test to see if a value is equal to another one. There are other useful
symbols that can be used in a test. The symbol !=, for example, means ‘is not equal to’.
The mathematical operators > and < are used to test for ‘is greater than’ and ‘is less than’
respectively, and they can also be combined with an equals sign to give >= and <=, the tests
for ‘is greater than or equal to’ and ‘is less than or equal to’.
You can combine tests with logical operators. The symbol && is a Boolean AND (i.e. test
whether both sides are true), and || is Boolean OR (i.e. test if either side is true). So, to
execute code only if both a and b are 0, you would use if (a == 0 && b == 0). To test if
either a or b is 0, you use if (a == 0 || b == 0).
Similarly, you can use the operator ! as a Boolean NOT to invert the result of a test, so
if (!(a == 0)) is the same as if (a != 0) .
’ve set a to
0, so the value inside the brackets is 0.
Make sure that you use a double equals sign in the brackets after the if, not a single one!
5
ELSE-IF
You can have multiple else statements in one test. Instead of one simple else for one
alternative, use else if () with a new test for each alternative you want. We’ll look more
at this in the next chapter.
Looping
The if statement is useful for making a single decision, but what if you want to do something
repeatedly until a test is true or false? We use a while loop for this, and here’s an example:
while (a < 5)
{
printf ("a is equal to %d\n", a);
a++;
}
printf ("a is equal to %d and I've finished\n", a);
}
This is very similar to an if statement, but the code in the curly brackets is executed
repeatedly for as long as the test in the round brackets is true, not just once.
So in our example code, a is initialised to 0. We enter the while loop, and test to see if a
is less than 5, which it is, so the code inside the curly brackets is executed. The value of a is
printed out, then we have one of C’s useful shortcuts to save too much typing…
a++ is the same as a=a+1; the double plus means ‘add one to this variable’. Similarly, a--
means ‘subtract one from this variable’; these are very commonly used to count the times
around a loop. The notation a+=1 can also be used to add a value to a variable; this also
works for other arithmetic operators, so a*=3 multiplies a by 3, and so on.
In the while loop, each time the code in the curly brackets has been executed, the test in the
round brackets is repeated; if it’s still true, the loop code is repeated again. As soon as the test
is false, execution continues with the line after the closing curly bracket.
INFINITE LOOPS
Make sure your loops always finish! If the condition you test in a while loop never evaluates to
false, your program will sit in the loop forever and never finish. If a program appears to be doing
nothing when you run it, check your loop tests.
Sometimes, we might want a loop which always runs at least once before a test is made.
We do this with a small modification to the syntax to create a do-while loop:
#include <stdio.h>
int a = 0;
do
{
printf ("a is equal to %d\n", a);
a++;
} while (a < 5);
printf ("a is equal to %d and I've finished\n", a);
}
The keyword do now goes before the curly bracket, and the while and test go after the
closing curly bracket. When this runs, the code in the loop always executes once before the
test; you can test this by running both the loop examples above with a initialised to 5 rather
than 0, and seeing how the behaviour differs.
In the next chapter, we’ll look at some more complex examples of looping and flow control.
5A loop executes the same code multiple times until the loop test is false
More advanced
flow control
For loops and case statements – more advanced
ways of controlling the flow of a program
T
he if statement and while loop described in the previous chapter are fairly simple
control structures. In this chapter, we’re going to look at a few more complex
structures that can help to make your code shorter and reduce the amount of typing
you need to do…
Although the while loop we saw in the previous article is very useful, the for loop tends to be
favoured by many programmers, as it puts all the logic controlling the loop in one place. Here’s
an example:
#include <stdio.h>
This isn’t all that different from a while loop, but all of the control for the loop lives in
the round brackets after the for keyword. This contains three statements, separated by
semicolons: in order, these are the initial condition, the test, and the increment.
a = 0 is the initial condition; the variable a is initialised to 0 at the start of the loop.
a < 5 is the test, just like in a while loop. This is checked on each iteration of the loop,
and the loop code is only executed if the test evaluates to true; as soon as the test is false,
execution continues after the curly bracket at the end of the loop code.
a++ is the increment; this is code which is executed at the end of each iteration of the loop,
before the test is evaluated again. In this case, it adds 1 to a.
So when this for loop runs, what happens? First, a is set to 0. The test is then checked: is
a (which is 0) less than 5? Yes it is, so the code inside the curly brackets is executed, and the
value of a is printed. Finally, the increment is applied, meaning 1 is added to a.
The test is then repeated. If true, the loop code is executed again, and the increment is again
applied; this repeats over and over until the test is false, at which point execution continues
after the closing curly bracket.
5The output when the for loop runs is identical to that of the while loop in
the previous chapter – they both do exactly the same thing
In terms of what they do, for loops and while loops are pretty much identical; both wrap up a
section of code you want to run more than once in some logic that controls how many times it
runs. You can use whichever makes the most sense, or whichever looks tidiest to you!
MULTIPLE INITIALISATIONS
You can initialise multiple variables in a for loop – just separate them by commas. So if you
want to set two variables at the start of the loop, you can use:
for (a = 0, b = 1; <test>; <increment>)
Illustrator: J. H. Hartley
Language: English
ENGLISH NURSERY
RHYMES.
SONGS FROM
ALICE IN
WONDERLAND
AND
THROUGH THE
LOOKING-GLASS.
Words by LEWIS CARROLL.
Music by LUCY E. BROADWOOD.
Illustrations by CHARLES
FOLKARD.
Containing 12 full-page
illustrations in colour, decorative
borders, and many small
illustrations. Demy 4to, cloth.
HARMONISED BY
LUCY E. BROADWOOD
ILLUSTRATED BY
J.H. HARTLEY
CONTENTS
PAGE
GOOD KING WENCESLAS 12
AS JOSEPH WAS A-WALKING 14
CHRISTMAS DAY IN THE MORNING 15
GOD REST YOU MERRY, GENTLEMEN 16
THE HOLY WELL 18
THE FIRST NOWELL 20
THE CHERRY TREE CAROL 23
DIVES AND LAZARUS 24
THE HOLLY AND THE IVY 25
A VIRGIN MOST PURE 26
THE WASSAIL SONG. Part I. 28
THE WASSAIL SONG. Part II. 29
THE BOAR’S HEAD CAROL 30
ALL THAT ARE TO MIRTH INCLINED 33
KING PHARAOH: Part I. The Miracle of the Cock 34
KING PHARAOH: Part II. The Miraculous Harvest 37
THE BLACK DECREE 38
SOMERSETSHIRE WASSAIL 40
A CHILD THIS DAY IS BORN 43
THE MOON SHINES BRIGHT 44
A CAROL FOR TWELFTH DAY 47
THE LORD AT FIRST DID ADAM MAKE 48
THE SEVEN JOYS OF MARY 50
THE SUSSEX MUMMERS’ CAROL 52
AS I SAT ON A SUNNY BANK 53
PACE-EGGING SONG 54
I’VE BEEN RAMBLING ALL THE NIGHT 57
GOOD CHRISTIAN MEN, REJOICE 58
ILLUSTRATIONS IN COLOUR
BY
J.H. HARTLEY