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!

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Geekbench 4.4.0 - Measure processor and...
Geekbench provides a comprehensive set of benchmarks engineered to quickly and accurately measure processor and memory performance. Designed to make benchmarks easy to run and easy to understand,... Read more
CleanMyMac X 4.4.4 - Delete files that w...
CleanMyMac makes space for the things you love. Sporting a range of ingenious new features, CleanMyMac lets you safely and intelligently scan and clean your entire system, delete large, unused files... Read more
TeamViewer 14.4.2669 - Establish remote...
TeamViewer gives you remote control of any computer or Mac over the Internet within seconds or can be used for online meetings. Find out why more than 200 million users trust TeamViewer! Free for non... Read more
Paperless 3.0.6 - $69.95
Paperless is a digital documents manager. Remember when everyone talked about how we would soon be a paperless society? Now it seems like we use paper more than ever. Let's face it - we need and we... Read more
BetterTouchTool 3.141 - Customize multi-...
BetterTouchTool adds many new, fully customizable gestures to the Magic Mouse, Multi-Touch MacBook trackpad, and Magic Trackpad. These gestures are customizable: Magic Mouse: Pinch in / out (zoom)... Read more
TextMate 2.0.rc.29 - Code/markup editor...
TextMate is a versatile plain text editor with a unique and innovative feature set which caused it to win an Apple Design Award for Best Mac OS X Developer Tool in August 2006 A rapidly growing... Read more
Little Snitch 4.4.1 - Alerts you about o...
Little Snitch gives you control over your private outgoing data. Track background activity As soon as your computer connects to the Internet, applications often have permission to send any... Read more
Little Snitch 4.4 - Alerts you about out...
Little Snitch gives you control over your private outgoing data. Track background activity As soon as your computer connects to the Internet, applications often have permission to send any... Read more
MPlayer OSX Extended 16 - Multimedia pla...
MPlayer OSX Extended is the future of MPlayer OSX. Leveraging the power of the MPlayer and FFmpeg open source projects, MPlayer OSX Extended aims to deliver a powerful, functional and no frills video... Read more
Google Chrome 75.0.3770.142 - Modern and...
Google Chrome is a Web browser by Google, created to be a modern platform for Web pages and applications. It utilizes very fast loading of Web pages and has a V8 engine, which is a custom built... Read more

Latest Forum Discussions

See All

TEPPEN guide - Tips and tricks for new p...
TEPPEN is a wild game that nobody asked for, but I’m sure glad it exists. Who would’ve thought that a CCG featuring Capcom characters could be so cool and weird? In case you’re not completely sure what TEPPEN is, make sure to check out our review... | Read more »
Dr. Mario World guide - Other games that...
We now live in a post-Dr. Mario World world, and I gotta say, things don’t feel too different. Nintendo continues to squirt out bad games on phones, causing all but the most stalwart fans of mobile games to question why they even bother... | Read more »
Strategy RPG Brown Dust introduces its b...
Epic turn-based RPG Brown Dust is set to turn 500 days old next week, and to celebrate, Neowiz has just unveiled its biggest and most exciting update yet, offering a host of new rewards, increased gacha rates, and a brand new feature that will... | Read more »
Dr. Mario World is yet another disappoin...
As soon as I booted up Dr. Mario World, I knew I wasn’t going to have fun with it. Nintendo’s record on phones thus far has been pretty spotty, with things trending downward as of late. [Read more] | Read more »
Retro Space Shooter P.3 is now available...
Shoot-em-ups tend to be a dime a dozen on the App Store, but every so often you come across one gem that aims to shake up the genre in a unique way. Developer Devjgame’s P.3 is the latest game seeking to do so this, working as a love letter to the... | Read more »
Void Tyrant guide - Guildins guide
I’ve still been putting a lot of time into Void Tyrant since it officially released last week, and it’s surprising how much stuff there is to uncover in such a simple-looking game. Just toray, I finished spending my Guildins on all available... | Read more »
Tactical RPG Brown Dust celebrates the s...
Neowiz is set to celebrate the summer by launching a 2-month long festival in its smash-hit RPG Brown Dust. The event kicks off today, and it’s divided into 4 parts, each of which will last two weeks. Brown Dust is all about collecting, upgrading,... | Read more »
Flappy Royale is an incredibly clever ta...
I spent the better part of my weekend playing Flappy Royale. I didn’t necessarily want to. I just felt like I had to. It’s a hypnotic experience that’s way too easy to just keep playing. | Read more »
Void Tyrant guide - General tips and tri...
Void Tyrant is a card-based dungeon-crawler that doesn’t fit in the mold of other games in the genre. Between the Blackjack-style combat and strange gear system alone, you’re left to your own devices to figure out how best to use everything to your... | Read more »
Webzen’s latest RPG First Hero is offici...
You might be busy sending your hulking Dark Knight into the midst of battle in Webzen’s other recent release: the long-anticipated MU Origin 2. But for something a little different, the South Korean publisher has launched First Hero. Released today... | Read more »

Price Scanner via MacPrices.net

Amazon drops prices, now offers clearance 13″...
Amazon has new dropped prices on clearance 13″ 2.3GHz Dual-Core non-Touch Bar MacBook Pros by $200 off Apple’s original MSRP, with prices now available starting at $1099. Shipping is free. Be sure to... Read more
2018 15″ MacBook Pros now on sale for $500 of...
Amazon has dropped prices on select clearance 2018 15″ 6-Core MacBook Pros to $500 off Apple’s original MSRP. Prices now start at $1899 shipped: – 2018 15″ 2.2GHz Touch Bar MacBook Pro Silver: $1899.... Read more
Price drop! Clearance 12″ 1.2GHz Silver MacBo...
Amazon has dropped their price on the recently-discontinued 12″ 1.2GHz Silver MacBook to $849.99 shipped. That’s $450 off Apple’s original MSRP for this model, and it’s the cheapest price available... Read more
Apple’s 21″ 3.0GHz 4K iMac drops to only $936...
Abt Electronics has dropped their price on clearance, previous-generation 21″ 3.0GHz 4K iMacs to only $936 shipped. That’s $363 off Apple’s original MSRP, and it’s the cheapest price we’ve seen so... Read more
Amazon’s Prime Day savings on Apple 11″ iPad...
Amazon has new 2018 Apple 11″ iPad Pros in stock today and on sale for up to $250 off Apple’s MSRP as part of their Prime Day sale (but Prime membership is NOT required for these savings). These are... Read more
Prime Day Apple iPhone deal: $100 off all iPh...
Boost Mobile is offering Apple’s new 2018 iPhone Xr, iPhone Xs, and Xs Max for $100 off MSRP. Their discount reduces the cost of an Xs to $899 for the 64GB models and $999 for the 64GB Xs Max. Price... Read more
Clearance 13″ 2.3GHz Dual-Core MacBook Pros a...
Focus Camera has clearance 2017 13″ 2.3GHz/128GB non-Touch Bar Dual-Core MacBook Pros on sale for $169 off Apple’s original MSRP. Shipping is free. Focus charges sales tax for NY & NJ residents... Read more
Amazon Prime Day deal: 9.7″ Apple iPads for $...
Amazon is offering new 9.7″ WiFi iPads with Apple Pencil support for $80-$100 off MSRP as part of their Prime Day sale, starting at only $249. These are the same iPads found in Apple’s retail and... Read more
Amazon Prime Day deal: 10% (up to $20) off Ap...
Amazon is offering discounts on new 2019 Apple AirPods ranging up to $20 (10%) off MSRP as part of their Prime Day sales. Shipping is free: – AirPods with Charging Case: $144.99 $15 off MSRP –... Read more
Amazon Prime Day deal: $50-$80 off Apple Watc...
Amazon has Apple Watch Series 4 and Series 3 models on sale for $50-$80 off Apple’s MSRP as part of their Prime Day deals with prices starting at only $199. Choose Amazon as the seller rather than a... Read more

Jobs Board

*Apple* Systems Architect/Engineer, Vice Pre...
…its vision to be the world's most trusted financial group. **Summary:** Apple Systems Architect/Engineer with strong knowledge of products and services related to Read more
*Apple* Graders/Inspectors (Seasonal/Hourly/...
…requirements. #COVAentryleveljobs ## Minimum Qualifications Some knowledge of agricultural and/or the apple industry is helpful as well as the ability to comprehend, Read more
Best Buy *Apple* Computing Master - Best Bu...
**710003BR** **Job Title:** Best Buy Apple Computing Master **Job Category:** Store Associates **Location Number:** 000171-Winchester Road-Store **Job Description:** Read more
Best Buy *Apple* Computing Master - Best Bu...
**709786BR** **Job Title:** Best Buy Apple Computing Master **Job Category:** Sales **Location Number:** 000430-Orange Park-Store **Job Description:** **What does a Read more
Geek Squad *Apple* Master Consultation Agen...
**709918BR** **Job Title:** Geek Squad Apple Master Consultation Agent **Job Category:** Services/Installation/Repair **Location Number:** 000106-Palmdale-Store Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.