TweetFollow Us on Twitter

Pascal/C II
Volume Number:10
Issue Number:1
Column Tag:Pascal/C workshop

The Pascal Programmer’s Guide
To Understanding ‘C’

Teach yourself to read another language - Part II

By Ken Gladstone, MacTech Magazine Technical Editor

Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.

This article is the second half of my Pascal Programmer’s Guide to Understanding “C”. If you haven’t already, I suggest you read the first half, which appeared in our December 1993 issue - otherwise you will probably be thoroughly confused by this half! That first half covered the following “C” concepts: comments, identifiers, operators, constants, program structure, and variable declarations and scope. So, let’s continue

PARAMETER PASSING

One key difference between C and Pascal is that C always passes parameters by value, never by reference. Therefore, you may be wondering how a C function can ever modify a passed in parameter. It can’t - but you can accomplish the same thing by passing a pointer to the value you wish to modify, and having the function modify the pointed to value. Here is an example:

/* 1 */
/************************ C Version *************************/

void doubleIt( int * pointerToIntParam )
{
  (*pointerToIntParam) *= 2;
}

int main()
{
  int myInt = 3;

  doubleIt( & myInt );

  return myInt;
}

/******************** End of C Version **********************/

(********************* Pascal Version ***********************)
program myProgram;
  var
    myInt: INTEGER;

  procedure doubleIt( var IntParam: INTEGER );
  BEGIN
    IntParam := IntParam * 2
  END;

BEGIN
  myInt := 3;

  doubleIt( myInt )
END.

(****************** End of Pascal Version *******************)

OLD VERSUS NEW FUNCTION DECLARATIONS

So far, I’ve been showing functions as follows:

int MyFunc( int a, char b, float c )
{
  /* Code goes here */
}

This way of writing functions is an ANSI extension that allows C to perform parameter type checking when calling a function. Things weren’t always so nice. In the original K&R C, functions were written as follows:

int MyFunc( a, b, c )
int a;
char b;
float c;
{
  /* Code goes here */
}

In original C compilers, when calling a function, there was no checking of parameter types, or often even of the number of parameters! In old C, you could write a call to a function before it had ever been defined, declared or mentioned in any way! Now, C compilers have much stronger type-checking. For example, Think C has a compiler option to require you to write a function prototype for every function.

FLOW CONTROL

So far, all of the examples that I’ve shown execute code sequentially - in fact, I’ve only shown declarations, assignment statements, function calls, and function return statements. Like Pascal, C has various loops and other constructs to control the flow of code. We’ll start with the while loop. The while loop in C is nearly identical to the one in Pascal, except that it needs parens around the test expression and it doesn’t have a DO keyword. Examples:

/* 2 */

while ( i < j ) i *= 2;   // First C example

while i < j DO i := i * 2;  {Pascal Equiv.}

while ( i < j )  // C example w/compound statement
{
  sysBeep( 1 );
  i *= 2;
}

while i < j DO   {Pascal Equiv.}
BEGIN
  sysBeep( 1 );
  i := i * 2
END

Next we have the C do statement. This is a loop with the test at the end of each iteration, like the Pascal REPEAT statement, but the sense of the while test at the end is the opposite of the Pascal UNTIL test. Unlike the Pascal version, the C version needs braces if the loop contains a compound statement. And again, the while condition needs parens. Example:

/* 3 */

do // C version
{
  sysBeep( x );
  ++ x;
}
while ( x != 10 );

REPEAT  {Pascal equiv.}
  sysBeep( x );
  x := x + 1
UNTIL x = 10;

Next we have the for loop.  The for loop in C is far more general than the one in Pascal. 
 It looks like this:

for ( expr1; expr2; expr3 )
  statement;

What it does is this: expr1 is an initialization that is performed before executing the loop for the first time. expr2 is a test that is performed before each iteration. As long as expr2 evaluates to non-zero, the looping continues. expr3 is a statement that is performed at the end of every iteration. C does not limit loops to simple count up and count down types. Any or all of the three expressions may be omitted, but the semicolons must remain. Any C for loop can be rewritten as follows:

/* 4 */

expr1;
while( expr2 )
{
  statement;
  expr3;
}
Example:

for ( i = 10; i != 0; --i ) // C example
  DoIt( i );

for ( i = 10; i; --i )    // An equivalent variation
  DoIt( i );

i = 10; // Another equivalent variation
while ( i )
{
  DoIt( i );// Could use pre or post decrement
  -- i;
}

i = 10; // Yet another equivalent variation
while ( i )
  DoIt( i-- );   // Must use post decrement

FOR i := 10 DOWNTO 0 DO   {Pascal equivalent}
 DoIt( i );

The C if statement is very similar to the Pascal version: The else clause is optional, and the statements can be either simple or compound. The only difference is that C needs parens around the expression, it doesn’t use the THEN keyword, and as always, every statement needs a semicolon. Example:

/* 5 */

if ( condition ) // C
  DoOneThing();
else
{
  DoAnother();
  AndAnother();
}

IF condition THEN {Pascal version}

/* 6 */

  DoOneThing
ELSE
BEGIN
  DoAnother;
  AndAnother
END

C has a case statement that is very similar to the Pascal version. An example should suffice:

/* 7 */

switch ( x )// C version
{
  case 1:
  case 2:
    DoTheOneOrTwoThing();
    break;  // Must explicitly leave each case
  case 3:
    DoTheThreeThing();
    AndTheOtherThreeThing();// Purposely fall through
  case 7:
    DoTheThreeAndSevenThing();
    break;
  default:
    DoTheDefaultThing();
}

CASE x OF { Pascal Version }

/* 8 */

  1, 2:  DoTheOneOrTwoThing;
  3:
    BEGIN
      DoTheThreeThing;
      AndTheOtherThreeThing;
      DoTheThreeAndSevenThing; { In Pascal, we need this twice }
    END;
  7:
      DoTheThreeAndSevenThing; {In Pascal, we need this twice}
  OTHERWISE DoTheDefaultThing
END

The previous example used the C break keyword. This keyword is like the Pascal Leave statement, and can be used to break out of the innermost while, do, for, or switch. C also has a continue keyword that like the Pascal Cycle statement. It skips to the next iteration of the innermost while, do or for loop.

Finally, C also has the dreaded goto statement (nothing seems to split programmers into warring factions as well as a goto statement does). Unlike in Pascal, you don’t declare labels in C, you just stick ‘em in the code, and they follow the same syntax as other identifiers. Example:

/* 9 */

{// C
  MyLabel:
    x := Function();
    if ( x == 10 ) goto MyLabel;
}

LABEL 333; { Pascal }
BEGIN   
  333: x = Function;
  IF x=10 THEN GOTO 333
END

LIBRARY FUNCTIONS

Standard C has oodles of library functions, such as malloc() and fread(), that you would use if you were programming on any computer unless you are programming on a Macintosh which you are. So for the most part, you will use calls like NewPtr() and FSRead() instead. You’ll need to look at your C compiler manual if you are interested in the standard C libraries.

STRINGS

Amazingly enough, standard C doesn’t really provide much built-in language support for strings. There are several standard C library functions that process strings, but no real string type or operators. C handles strings as simple arrays of the char type. In general, you would create a string in one of the following ways:

{
  char myString[100]; // 100 bytes of storage
  char Another[] = "LetTheCompilerCountTheSize";
  char * ptrToString;

  ptrToString = NewPtr( 100 );
}

C also has a different way of representing strings than the Pascal way. Instead of having a length byte followed by a number of characters, C starts immediately with characters, and the string is considered to continue until the occurrence of a zero byte. So this declaration:

char myString[] = "Foo";

creates four bytes of storage. It fills the first three with the word "Foo" and puts a zero byte in the fourth. This convention allows strings of arbitrary length.

This string representation doesn’t fit well with Pascal nor with the Mac toolbox, but don’t despair. C only uses this convention in two places: In string constants (like the "Foo" shown above) and in its library functions. The Mac solves the second problem by shunning the C library that is used by the rest of the world, in favor of its own toolbox. And the compilers on the Mac solve the first problem by introducing an ingenious extension, the \p escape sequence. Here is an example:

char pascalString[] = "\pFoo";

This causes the compiler to insert a Pascal-style length byte at the beginning of the string. It still generates a zero-byte at the end, however. So the above declaration would use five bytes: The first byte contains a 3 (for the Pascal length), the next three bytes contain the string, and the final byte contains the C-style zero byte. So pascalString can be used as a Pascal string, and (pascalString+1) or &pascalString[1] can be used as a C string.

THE PREPROCESSOR

C compilers include a preprocessor step that reads in the source file, expands macros, and then writes back a temporary file that is fed into the actual compiler. Keep in mind that preprocessor commands are purely compile-time, not run-time operations. They are similar to Pascal {$ } compiler directives. Instead of being embedded within comments, C preprocessor instructions begin with a number sign ‘#’. Here is a (somewhat contrived) code fragment that includes many of the common preprocessor instructions:

/* 10 */

#include <stdio.h>
#include "myheader.h"

#define DEBUG    // Delete this line before shipping program.
#define PI3.14159
#define square(a)( ( a ) * ( a ) )
#define cube(a)  ( ( a ) * square( a ) )
#define max(a,b) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) )

#pragma segment mySegment

double MaxSurfaceOrVolume( double radius )
/*
 * This is a strange function which will return either the 
 * surface area or the volume of a sphere, whichever is 
 * larger, for a given radius.
 */
{
#ifdef DEBUG
  printf( "Hey, we're in the MaxSurfaceOrVolume function" );
#else
  printf( "Hey, we're running the non-debug version" );
#endif

#if 0

I could have a bunch of lines of code in here, and they

wouldn't ever be executed, or even compiled.

/* 11 */

#endif

  return max( 4 * PI * square( radius ), 
    4.0/3.0 * PI * cube( radius ) );
}

The following table describes the preceding preprocessor statements:


Preprocessor Statement Meaning

#include <stdio.h> Similar to the Pascal {$I filename} directive. Paste the contents of the included file into here as if they had actually been typed into this file. The angle brackets generally tell the compiler to look for the include file in its list of “system” file folders. Include files are generally named with a .h at the end. They generally consist of things like typedefs, global variable definitions, function prototypes, preprocessor macros, etc. The Mac compilers provide header files that prototype all the toolbox functions so you don’t have to.

#include "myHeader.h" Same as above, but look in the list of “user” file folders instead of system file folders.

#define DEBUG Similar to the Pascal {$SETC DEBUG = 1} directive. Define the existence of a preprocessor variable. The existence of the variable can be checked later.

#define PI 3.14159 A simple text substitution. Replace all future occurences of PI with 3.14159.

#define square(a) ((a)*(a)) A substitution that takes parameters. Keep in mind that while a macro like this may look like a function call, it is purely text substitution, and therefore incurs none of the overhead of a function call.

#pragma segment mySegment The #pragma feature allows compiler specific instructions that are not actually part of the C language. Each compiler has its own pragmas. They are used for such things as turning optimizations on and off, disabling compiler warnings, or in this case, telling the compiler in what code segment to put this code. They perform many of the same functions as the miscellaneous Pascal {* } directives.

#ifdef DEBUG Similar to {$IFC } in Pascal. The subsequent statements will only be compiled if the variable is defined.

#else Similar to {$ELSEC}. The subsequent statements will only be compiled in the “else” case of the preceding #if.

#endif Similar to {$ENDC}. Ends a preprocessor #if or #ifdef construction.

#if 0 This is a quick way to disable a chunk of code. Change it to #if 1 to re-enable.

SUMMARY

You should now know enough C to be able to read C code listings. If you would like to get some more practice at seeing the differences between C and Pascal, you may wish to check out Dave Mark’s first few “Getting Started” articles. Dave wrote both a C and Pascal version for all of his programs in the 1992 columns. And while we didn’t print all of the listings in the magazine, we did include them in the source code disks and in our CD-ROM. Beyond that, you’ll probably have to break down a buy a couple of C books.

Million dollar (no, we won’t pay you, even if you have a good answer!) bonus question: K&R say that the term define is used when actually creating storage for a variable, and that the term declare is used when describing the characteristics of a variable (and only possibly creating storage). So why is it that type declarations, which allocate no storage, are spelled typedef (short for type definition) instead of being spelled typedecl? Perhaps this has been discussed somewhere before, but not that I’ve seen. Personally, I like the C keyword, and think that K&R have the define and declare terms backwards throughout their book!

 
AAPL
$102.99
Apple Inc.
+0.52
MSFT
$44.38
Microsoft Corpora
-0.50
GOOG
$532.71
Google Inc.
+6.17

MacTech Search:
Community Search:

Software Updates via MacUpdate

Evernote 5.6.2 - Create searchable notes...
Evernote allows you to easily capture information in any environment using whatever device or platform you find most convenient, and makes this information accessible and searchable at anytime, from... Read more
OmniOutliner 4.1.3 - Organize your ideas...
OmniOutliner is a flexible program for creating, collecting, and organizing information. Give your creativity a kick start by using an application that's actually designed to help you think. It's... Read more
BBEdit 11.0 - Powerful text and HTML edi...
BBEdit is the leading professional HTML and text editor for the Mac. Specifically crafted in response to the needs of Web authors and software developers, this award-winning product provides a... Read more
Apple Security Update 2014-005 - For OS...
Apple Security Update is recommended for all users and improves the security of Mac OS X. For information on the security content of this update, please visit this website: http://support.apple.com/... Read more
EyeTV 3.6.6 - Watch and record TV on you...
EyeTV brings a rich TV experience to your Mac. Watch live TV on your Mac. Pause, rewind, and record whenever you want. EyeTV gives you powerful control over what you watch and how you watch it. Put... Read more
RapidWeaver 6.0 - Create template-based...
RapidWeaver is a next-generation Web design application to help you easily create professional-looking Web sites in minutes. No knowledge of complex code is required, RapidWeaver will take care of... Read more
NTFS 12.0.39 - Provides full read and wr...
Paragon NTFS breaks down the barriers between Windows and OS X. Paragon NTFS effectively solves the communication problems between the Mac system and NTFS, providing full read and write access to... Read more
RestoreMeNot 2.0.3 - Disable window rest...
RestoreMeNot provides a simple way to disable the window restoration for individual applications so that you can fine-tune this behavior to suit your needs. Please note that RestoreMeNot is designed... Read more
Command-C 1.1.5 - Clipboard sharing tool...
Command-C is a revolutionary app which makes easy to share your clipboard between iOS and OS X using your local WiFi network, even if the app is not currently opened. Copy anything (text, pictures,... Read more
Macgo Blu-ray Player 2.10.9.1750 - Blu-r...
Macgo Mac Blu-ray Player can bring you the most unforgettable Blu-ray experience on your Mac. Overview Macgo Mac Blu-ray Player can satisfy just about every need you could possibly have in a Blu-ray... Read more

Latest Forum Discussions

See All

Pro Strategy Football 2014 (Games)
Pro Strategy Football 2014 2014.141001 Device: iOS Universal Category: Games Price: $4.99, Version: 2014.141001 (iTunes) Description: Take the proven strategy of the PSF franchise and add in Casual Play, improved graphics and... | Read more »
Super Glyph Quest (Games)
Super Glyph Quest 1.01 Device: iOS Universal Category: Games Price: $2.99, Version: 1.01 (iTunes) Description: Adventure is back Questers! Combine elemental glyphs together to cast powerful spells and vanquish adorable monsters in... | Read more »
Fighting Fantasy: Caverns of the Snow Wi...
Fighting Fantasy: Caverns of the Snow Witch 1.0 Device: iOS Universal Category: Games Price: $5.99, Version: 1.0 (iTunes) Description: Travel to Northern Allansia’s perilous Icefinger Mountains to defeat the wicked Snow Witch in this... | Read more »
Star Warfare 2: Payback Review
Star Warfare 2: Payback Review By Blake Grundman on October 22nd, 2014 Our Rating: :: ONE-TRICK PONYUniversal App - Designed for iPhone and iPad Unfortunately, it doesn’t take long for Star Warfare 2’s free-firing fun to turn into... | Read more »
TinType by Hipstamatic (Photography)
TinType by Hipstamatic 1.0 Device: iOS iPhone Category: Photography Price: $.99, Version: 1.0 (iTunes) Description: Create hauntingly beautiful, soul capturing portraits with TinType by Hipstamatic. Inspired by daguerreotypes,... | Read more »
The Latest Update for Heroes of Dragon A...
The Latest Update for Heroes of Dragon Age Introduces Daily PvE Challenges Posted by Ellis Spice on October 22nd, 2014 [ permalink ] | Read more »
Bee Brilliant Review
Bee Brilliant Review By Jennifer Allen on October 22nd, 2014 Our Rating: :: SAMEY MATCH-3Universal App - Designed for iPhone and iPad Want even more Match-3 gaming and fancy a bee based twist? Bee Brilliant is that game. Don’t... | Read more »
A New Trailer has Been Revealed for Epic...
A New Trailer has Been Revealed for Epic of Kings Posted by Jessica Fisher on October 22nd, 2014 [ permalink ] Dead Mage Inc. has released a new, action-packed trailer for the upcoming Epic of Kings. | Read more »
Find the Line Review
Find the Line Review By Campbell Bird on October 22nd, 2014 Our Rating: :: INSLIDE THE LINESUniversal App - Designed for iPhone and iPad Tease out beautiful line drawings in this unique, free-to-play puzzle game.   | Read more »
Things Get Magical in The Sims FreePlay...
Things Get Magical in The Sims FreePlay with a New Halloween Update Posted by Ellis Spice on October 22nd, 2014 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »

Price Scanner via MacPrices.net

Save with Best Buy’s College Student Deals
Take an additional $50 off all MacBooks and iMacs at Best Buy Online with their College Students Deals Savings, valid through November 1st. Anyone with a valid .EDU email address can take advantage... Read more
iPad Air 2 & iPad mini 3 Best Tablets Yet...
The new iPads turned out to be pretty much everything I’d been hoping for and more than I’d expected.”More” particularly in terms of a drinking-from-a-firehose choice of models and configurations,... Read more
Drafts 4 Reinvents iOS Productivity App
N Richland Hills, Texas based Agile Tortoise has announced the release of Drafts 4 for iPhone and iPad. Drafts is a quick capture note taking app with flexible output actions. Drafts 4 scales from... Read more
AT&T accepting preorders for new iPads fo...
AT&T Wireless is accepting preorders for the new iPad Air 2 and iPad mini 3, cellular models, for $100 off MSRP with a 2-year service agreement: - 16GB iPad Air 2 WiFi + Cellular: $529.99 - 64GB... Read more
Apple offering refurbished Mac Pros for up to...
The Apple Store is offering Apple Certified Refurbished 2013 Mac Pros for up to $600 off the cost of new models. An Apple one-year warranty is included with each Mac Pro, and shipping is free. The... Read more
Select MacBook Airs $100 off MSRP, free shipp...
B&H Photo has 2014 a couple of MacBook Airs on sale for $100 off MSRP. Shipping is free, and B&H charges NY sales tax only. They also include free copies of Parallels Desktop and LoJack for... Read more
13-inch 2.5GHz MacBook Pro on sale for $100 o...
B&H Photo has the 13″ 2.5GHz MacBook Pro on sale for $999.99 including free shipping plus NY sales tax only. Their price is $100 off MSRP. Read more
Strong iPhone, Mac And App Store Sales Drive...
Apple on Monday announced financial results for its fiscal 2014 fourth quarter ended September 27, 2014. The Company posted quarterly revenue of $42.1 billion and quarterly net profit of $8.5 billion... Read more
Apple Posts How-To For OS X Recovery
OS X 10.7 Lion and later include OS X Recovery. This feature includes all of the tools you need to reinstall OS X, repair your disk, and even restore from a Time Machine backup. OS X Recovery... Read more
Mac OS X Versions (Builds) Supported By Vario...
Apple Support has posted a handy resource explaining which Mac OS X versions (builds) originally shipped with or are available for your computer via retail discs, downloads, or Software Update. Apple... Read more

Jobs Board

Senior Event Manager, *Apple* Retail Market...
…This senior level position is responsible for leading and imagining the Apple Retail Team's global event strategy. Delivering an overarching brand story; in-store, Read more
*Apple* Solutions Consultant (ASC) - Apple (...
**Job Summary** The ASC is an Apple employee who serves as an Apple brand ambassador and influencer in a Reseller's store. The ASC's role is to grow Apple Read more
Project Manager / Business Analyst, WW *Appl...
…a senior project manager / business analyst to work within our Worldwide Apple Fulfillment Operations and the Business Process Re-engineering team. This role will work Read more
*Apple* Retail - Multiple Positions (US) - A...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
Position Opening at *Apple* - Apple (United...
…customers purchase our products, you're the one who helps them get more out of their new Apple technology. Your day in the Apple Store is filled with a range of Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.