HDTenEightyP/NetNews huggingface dataset:
From: misar@rbg.informatik.th-darmstadt.de (walter misar)
Subject: Re: How does the Address-of Operator (&) really work?
Date: Thu, 12 Nov 1992 15:07:32 GMT
Organization: TU Darmstadt

In article <1ds9htINNd81@agate.berkeley.edu>, achoi@soda.berkeley.edu (Andrew Choi) writes:
> Hi netters:
> 
>   I was told that the address-of operator & (along with sizeof)
> is done at compilation done, therefore, it becomes legal to
> do the followings:
> 
>   &(((struct S *) NULL)->field)

Use offsetof (defined in stddef.h) instead.:
offsetof(struct S,field)
 
> However, what I don't understand is how it works under multiple
> files.  Considered the followings:
> 
>   /* file "foo.c" */
> 
>   char *a = "This is a test";
> 
>   /* file "bar.c" */
> 
>   char **b = &a;	/* note that char *b = a; is ILLEGAL */
>
> When the 2 files, "bar.c" and "foo.c" are separately compiled,
> what does the compiler put for "&a", since it does not know where
> the definition for "a" is?

That's the job of the linker (/bin/ld on UNIX). In the .o files the compiler
stores the names and the positions in the code of all variables that have
external linkage. So bar.o contains a dummy-adress instead of &a and the
linker exchanges it with the real value found in foo.o .  
 
>   Also, I need a definitive bible to the C language.  What book(s)
> are considered to be the bible for the C language?

Definitely K&R ( 2nd edition ANSI) :
The C Programming Language 2nd edition
Brian W. Kernighan
Dennis M. Ritchie
Prentice Hall
ISBN 0-13-110362-8

-- 
Walter Misar
misar@rbhp56.rbg.informatik.th-darmstadt.de
Newsgroups: comp.lang.c
From: vasco@jessica.bvl.pt (Antonio Vasconcelos)
Subject: Re: Finding length of file?
Reply-To: vasco@jessica.bvl.pt (Antonio Vasconcelos)
Organization: Bolsa de Valores de Lisboa 
Date: Thu, 12 Nov 1992 10:28:03 GMT

	>  I have created a file for reading using fopen.  Is there a simple
	>quick way to find out how many bytes there are until EOF?  I would
	>prefer something that is part of the standard, which I think rules
	>out the read command.  I thought I might be able to do this using
	>p -> cnt for p a pointer to FILE, but that didn't work.

How about usin'stat' function ?

	#include <sys/types.h>
	#include <sys/stat.h>

	struct stat info;

	stat("filename",&info);
	printf("%ld\n",info.st_size);

This does not open the file, there are some stat variations then let you get info
apout files opened with fopen. Read the man pages about stat, you will see that
stat returns a lot of info about a file.

This is true for every *nix I ever saw and for Borland's ms-dos Ces, I don't know about
Micro$oft...

regards,

|/asco

Xref: sparky comp.lang.c:16458 comp.software-eng:4266
From: birnbaum@cor5.pica.army.mil (Richard C. Birnbaum (GC-ACCURATE) <birnbaum>)
Newsgroups: comp.lang.c
Subject: Re: Help.  (Unix C)
Date: 5 Nov 92 15:46:36 GMT
Organization: U.S. Army Armament Research Dev. & Eng. Ctr, Dover NJ

.. discussion of qsort and comparison function for comparing float members
of structures deleted....

instead of the comparison function doing

     if (ptr->item1 == ptr->item 2) return 0;
     if (ptr->item1 > ptr->item 2) return 1;
     return -1;

you could do simply

     return (ptr->item1 - ptr->item2);

You need not return only the values 0, 1, or -1 - you must return 0,
positive number, or negative number.
Newsgroups: comp.lang.c
From: jbs@rti.rti.org
Subject: Re: DEC VMS VERSION OF C - HOW TO ASSIGN FILE NAME?
Organization: Research Triangle Institute, RTP, NC
Date: Fri, 6 Nov 92 15:25:50 GMT

In article <92310.16240634R33O7@CMUVM.CSV.CMICH.EDU> Robert A Rawlinson <34R33O7@CMUVM.CSV.CMICH.EDU> writes:
>I HAVE A COUPLE OF STUDENTS DOING SOME C PROGRAMING FOR ME. I AM NOT A
>GOOD C PROGRAMER SO I COULD NOT SEEM TO FIND THE ANSWER IN THE MANUALS.
>IN COBOL I CAN CODE A FILE NAME AND THEN WHEN I RUN THE PROGRAM I CAN
>ASSIGN A FILE NAME AND DIRECTORY. MY STUDENTS CODE IN C AND INDICATED THE
>FILE AND DIRECTORY HAVE TO BE HARD CODED. I SUSPECT THERE IS A WAY TO
>USE A NAME THAT I COULD ASSIGN A FILE AND DIRECTORY TO LATER AS IN COBOL.
>COULD SOMEONE POINT ME IN THE CORRECT DIRECTION TO SOLVE THIS?

Your suspicion is correct. There are at least two approches to solving this
problem.

First, you can use a logical name instead of an actual file name in the
program, and then assign the logical name to point to a physical file before
you execute the program:

/* contents of file "testopen.c" */
#include <stdio.h>
main()
{
	FILE *infile;
	if ((infile = (fopen("file1","r")) == NULL)
	{
		printf("Couldn't open input file.\n");
		exit();
	}
	else
	{
		printf("File opened successfully.\n");
		close(infile);
	}
}
/* end of file testopen.c */


$ cc testopen
$ link testopen
$ assign mynode::disk1:[mydir]test.file;1 file1
$! { or, alternatively, $ define file1 mynode::disk1:[mydir]test.file;1 }
$ run testopen
File opened successfully.

$ deassign file1


-----------------------------------------------------------------------
Approach #2: use command-line arguments and feed in the filenames in the
program invocation:

/* Contents of testopen.c */
#include <stdio.h>
main(argc,argv)
int argc;    /* Number of arguments passed to program, including program
                name */
char *argv[];    /* Array of pointers to arguments */
{
	FILE *infile;
	int i;

	printf("Number of arguments passed to testopen was %d.\n",argc);
	printf("Argument list follows:\n\n:");
	for (i=0; i < argc; i++)
		printf("%s\n",argv[i]);
	printf("\n");

	if ((infile = fopen(argv[1],"r") == NULL)
	{
		printf("Can't open file %s for input.\n",argv[1]);
		exit();
	}
	else {
		printf("Succesfully opened %s for input.\n",argv[1])
		close(infile);
	}
}
/* end of file testopen.c */


$ cc testopen
$ link testopen
$! { next line creates a global symbol that allows you to execute the
$!   program with arguments }
$ testopen == "$disk1:[mydir]testopen.exe"
$ testopen mynode::disk1:[mydir]test.file "dummy argument here" and three more
Number of arguments passed to testopen was 6.
Argument list follows:

DISK1:[MYDIR]TESTOPEN.EXE
MYNODE::DISK1:[MYDIR]TEST.FILE
dummy argument here
AND
THREE
MORE

Successfully opened TEST.FILE for input.

$ delete/symbol/global testopen

----------------------------------------------------------------------

Hope this helps.  Hope it's correct, as well. I didn't test any of it ;-)
Corrections are welcome.

  -joe
Newsgroups: comp.lang.c
From: bibhas@pico.engr.mun.ca (Bibhas Bhattacharya)
Subject: Want function to eval. math expression string...
Keywords: math
Organization: Memorial University of Newfoundland
Date: Tue, 10 Nov 1992 16:08:14 GMT

Hi!
If you have a funtion which accepts a string of math expression and returns
the value for a supplied x-value, I would like to use it in one of my
programs. A typical function call should look similar to this..
	y = evaluate(10.5, " 2 + 3 * sin(x)");
For which it should return:
	2 + 3 * sin(10.5) whatever that amounts up to.
Thanks in advance.
Bibhas.
--
	+==========================+=========================+
	| login name: DR. Jackyl   |  In real life: Mr. Hyde.|
	+==========================+=========================+
		    |   bibhas@pico.engr.mun.ca  |
Xref: sparky comp.lang.c:16391 comp.edu:1896
From: mjs@hubcap.clemson.edu (M. J. Saltzman)
Subject: Re: Fortran to C conversion: Why bother?
Organization: Clemson University, Clemson SC
Date: Wed, 11 Nov 1992 18:54:31 GMT

In article <1992Nov11.172747.1959@mksol.dseg.ti.com> mccall@mksol.dseg.ti.com (fred j mccall 575-3539) writes:
>In <20849@fritz.filenet.com> scotth@felix.filenet.com (Scott Hopson) writes:
>
>>In article <1992Nov9.131601.167@gems.vcu.edu> hleaves@gems.vcu.edu writes:
>>>I was wondering why anyone would bother using the f2c (or similar) program to
>>>translate fortran code directly into C. 
>>>[...]

>>[...]
>>Many companies think seriously about converting their old code into new code,
>>even if the functionality is the same. This is because they usually want the
>>same functionality but with the opportunity to enhance old systems.
>
>The problem with this decision is that the code resulting from
>automatic translations is usually something less than maintainable, so
>you would still have to either maintain the FORTRAN or reimplement in
>maintainable C.  

That's right, but maintaining the Fortran isn't such a bad way to go.
One of the points in this thread is that "f2c | cc" is a perfectly
servicable Fortran compiler substitute for many applications.

>Converters are useful for those cases where you need
>to get the first release of a product out the door when you are in a
>new environment, but IMHO trying to maintain the output of a converter
>after chucking the original code is rather like maintaining object
>after chucking the source code.  It is somewhat more difficult than taking
>the time to reimplement properly in the new language.

I don't think it's widely a widely-advocated strategy to maintain the
*output* of any program generator.  You always maintain the input.
It's more or less like compiling your C code, throwing away the source
and trying to maintain the code using the assembler listing.

>
>-- 
>"Insisting on perfect safety is for people who don't have the balls to live
> in the real world."   -- Mary Shafer, NASA Ames Dryden
>------------------------------------------------------------------------------
>Fred.McCall@dseg.ti.com - I don't speak for others and they don't speak for me.

-- 
		Matthew Saltzman
		Clemson University Math Sciences
		mjs@clemson.edu
Newsgroups: comp.lang.c
From: "hans friedrich steffani" <GM08@DKAUNI2.BITNET>
Subject: Re: Hows this for odd
Organization: University of Karlsruhe, Germany
Date: Tue, 10 Nov 1992 16:42:25 GMT



> From: dkeisen@leland.Stanford.EDU (Dave Eisen)
> In article <BxGq4z.8oA@portal.hq.videocart.com> dfuller@portal.hq.videocart.co
m
> (Dave Fuller) writes:
> >bena@yoyo.cc.monash.edu.au (Ben Aveling) writes:
> >:      ... ,(i==0)?TRUE:FALSE,...
> >: Am I going mad, or is this slightly redundant ?
> >
> >Not at all. Depends on what TRUE & FALSE are, and what they mean to the
> >calling function. possible that TRUE is defined as -1, FALSE as -2.
>
> I think using anything other that 0 for FALSE and 1 for TRUE is
> confusing. After all, I would hope that 1 < 3 yields TRUE. And
> for this reason, I never use TRUE and FALSE in my code; 1 and
> 0 are quite clear enough. Besides any nonzero value is TRUE and
> using #defines for TRUE and FALSE is going to lead *somebody*
> to do something like:
>
>    if (isdigit (x) == TRUE)
better is
     if (isdigit(x)  )
but if you do not like this perhaps you can try
     if ( isdigit(x) |= FALSE)
wich is correct if you #define FALSE 0.

You really need FALSE and TRUE as a rvalue in statments
like
error = FALSE; /* error is boolean */
and nowhere else.
I think this looks better than
error = 0;     /* error is int, perhaps the number of errors */

---
hans friedrich  steffani@imbaibrs1.bau-verm.uni-karlsruhe.de
steffani        gm08@dkauni2.bitnet
From: n087ec@tamuts.tamu.edu (Hessel Kooistra)
Newsgroups: comp.lang.c
Subject: Looking for Jim Bumgardner, author of Lasrflow
Date: 11 Nov 92 17:17:22 GMT
Article-I.D.: tamsun.1992Nov11.171722.24406
Organization: ~/lib/organization

I am looking for Jim Bumgardner, the author of Lasrflow, a flowchart
maker available on Simtel.  He seems to have moved from his apartment
address of 1988.  Has anyone seen him?  Thanks.

    Hess

.
From: mctaww@dct.ac.uk
Newsgroups: comp.lang.c
Subject: Re: Line Drawing Algorithm +
Date: 9 Nov 92 17:37:13 GMT
Organization: Dundee Institute of Technology

I would recommend delving into Dr Dobbs Journal for the past two years
and reading the Graphics Programming column which has been addressing
the issues of fast line drawing as well as fast everything else about
3-D graphics on the PC/VGA combination.

Andy Wakelin

//================================================\\
|| Dundee Institute of Technology                 ||
|| Dept. of Mathematical and Computer Sciences    ||
|| Bell St.                                       ||
|| Dundee                                         ||
|| Scotland                                       ||
|| DD1 1HG                                        ||
||                                                ||
|| Tel. No.     :  0382 - 308622                  ||
|| Fax          :  0382 - 308877                  ||
|| E-mail       :  mctaww@uk.ac.dct               ||
\\================================================//
Newsgroups: comp.lang.c
From: pal@regent.e-technik.tu-muenchen.dbp.de (Peter Loibl)
Subject: Re: Macros
Organization: Technical University of Munich, Germany
Date: Mon, 9 Nov 1992 10:42:45 GMT

wct@po.CWRU.Edu (William C. Thompson) writes:

>I'm trying to write a macro that allocates memory for Rows double *,
>and then allocating for Cols double.  Basically, A is a double **,
>which points to a row of double *, which point to a buffer of doubles.
>A[i][j] is then the jth element in the ith row.  But I'm having
>trouble with this macro business.  I don't want to write a function
>to do it.

>ALL.H
>-----
>#define malloc2d(A,rows,cols); (
>{
>  int i;
>
>  if (((A)=(double **)malloc(sizeof(double *)*(rows)))==NULL)
>    printf("Allocation error!\n");
>  for (i=0; i<(cols); i++)
>    if (((A)[i]=(double *)malloc(sizeof(double)*(cols)))==NULL)
>     printf("Allocation error!\n");
>}
>)

>TEST PROGRAM
>------------
>#include <stdio.h>
>#include <all.h>

>double **A;
>int i,j;

>main()
>{
>  malloc2d(A,50,50);
>  for (i=0; i<50; i++)
>    for (j=0; j<50; j++)
>      A[i][j]=1.0/(i+j+1.0);
>  return 0;
>}

>It doesn't compile, though.  What gives?  E-mail responses, please...

Hi!

1. It would be very usefull to know which compiler you are using. I
   know a few compilers, whose pre-processors don't expand long macros!

2. Your macros is wrong! Well as a function it should work, bit you have
   to tell the pre-processor, that your macro continues on the next
   line. It looks then like this:

#define malloc2d(A,rows,cols); \
{ \
  int i; \
  if (((A)=(double **)malloc(sizeof(double *)*(rows)))==NULL) \
    printf("Allocation error!\n"); \
  for (i=0; i<(cols); i++) \
    if (((A)[i]=(double *)malloc(sizeof(double)*(cols)))==NULL) \
     printf("Allocation error!\n"); \
}

Tip: use fprintf(stderr, "Allocation error!\n") insead of printf(...).

Peter Loibl
pal@regent.e-technik.tu-muenchen.de
From: rxo868@huxley.anu.edu.au (Remo Ostini)
Newsgroups: comp.lang.c
Subject: Borland computer-phobic C user needs help
Keywords: Borland Turbo C+ 3.0, library functions,
Date: 6 Nov 92 17:25:55 GMT
Organization: Australian National University
NNTP-Posting-Host: 150.203.2.12
Originator: rxo868@huxley

I have completed reading The Waite Group's New C Primer Plus, by Waite and 
Prata.  As a PhD candidate (not in computers), I need to write a program which
will use text screen painting, graphics, and other assorted features.  I use
the Borland C++ 3.0 system and am very intimidated by the manual (it is way
too technical for me), though I feel I know C pretty well from the Waite and 
Prata book (which was written at my level).  Can anyone recommend any other
books which would guide a computer-phobic person through the Borland system's
features?  Would I need to learn C++ to use those features?  Could you also 
recommend any books, software, or networks which would have listings
(e.g. indexes) of library functions and macros, or even public domain routines
which could be used in my program?  My advisor mentioned "toolboxes?"
HELP!!! 

Zachary

-- 
Remo Ostini 		       *  rxo868@huxley.anu.edu.au
NCEPH, ANU		       *  "Morality is a vast and inescapable
GPO Box 4, 		       *  conspiracy in which we all participate."
Canberra  ACT 2601, Australia  *  				- Norma Haan
From: voorhees@sdd.hp.com (Joe Voorhees)
Newsgroups: comp.lang.c
Subject: File Finder s/c wanted
Date: 6 Nov 1992 18:16:53 GMT
Organization: Hewlett-Packard, San Diego Division
Distribution: world
NNTP-Posting-Host: hpsdlm14.sdd.hp.com
Keywords: HP-UX, C, UNIX, file, directory


I was wondering if anyone out there on the net has a C program (source code)
to do the following:

			Operator issues command
			to execute program
				|
				V
			Program prompts for search
			string which is equal to
			(hopefully) beginning char-
			acters of a filename(s)
				|
				V
			Program searches for file-
			name(s) beginning with search
			string in (for example):
			~bob/*/cad_files/
			~larry/*/cad_files/
				|
				V
			file(s) found? ------no-------> print message:
				|			"No files found"
				yes				|
				|				|
				V				|
			print path(s) to 			|
			file(s)					|
				|				|
				V				|
			exit program <---------------------------

I realize this may be very tedious to write a program like this. I'd do it
myself but I know *VERY* little about C. The reason I would like something
like this in C is because of speed; even perl is slow for something like this
where the wildcard directories are extremely large. Any help with this would be
greatly appreciated. Platform is HP9000/380TSRX, HP-UX 8.0, X11R4.


Thanks-in-advance!

Joe Voorhees
voorhees@sdd.hp.com


Newsgroups: comp.lang.c
From: eager@eagercon.com (Michael J. Eager)
Subject: Re: How does the Address-of Operator (&) really work?
Reply-To: eager@eagercon.com
Organization: Eager Consulting
Date: Thu, 12 Nov 1992 19:20:32 GMT

In article 1ds9htINNd81@agate.berkeley.edu, achoi@soda.berkeley.edu (Andrew Choi) writes:
>Hi netters:
>
>  I was told that the address-of operator & (along with sizeof)
>is done at compilation done, therefore, it becomes legal to
>do the followings:
>
>  &(((struct S *) NULL)->field)
>
>However, what I don't understand is how it works under multiple
>files.  Considered the followings:
>
>  /* file "foo.c" */
>
>  char *a = "This is a test";
>
>  /* file "bar.c" */
>
>  char **b = &a;	/* note that char *b = a; is ILLEGAL */

char *b = a; is illegal only if static, if automatic, it will be 
evaluated upon entry to the function.

>
>When the 2 files, "bar.c" and "foo.c" are separately compiled,
>what does the compiler put for "&a", since it does not know where
>the definition for "a" is?

If you do not have a declartion for a in bar.c, you will get an
error.  You need to say something like 
	extern char * a;

What the compiler does is generate a relocatable reference to a which
will get updated by the linker and loader to have the correct address.

The compiler cannot always tell where an object is at compilation time, 
but it can always generate a (usually short) sequence of code which 
will load it's address.

>
>  Also, I need a definitive bible to the C language.  What book(s)
>are considered to be the bible for the C language?

ANSI Std. X3.159-1989, Programming Language -- C
Harbison & Steele, C: A Reference Manual, 2nd Ed.
Kernighan & Ritchie, The C Programming Language, 2nd Ed.

---
Michael J. Eager		Michael.Eager@eagercon.com
Eager Consulting		(415) 325-8077 
1960 Park Boulevard, Palo Alto, CA 94306-1141
From: kdq@quest.UUCP (Kevin D. Quitt)
Newsgroups: comp.lang.c
Subject: Re: The Correct Way To Write C if-Statements
Date: Sun, 08 Nov 92 16:34:01 PST
Reply-To: srhqla!quest!kdq
Organization: Job quest  (805) 251-8210,  So Cal: (800) 400-8210

    Somehow the original article did not get to this site.  Would
someone email a copy to me?  Thanks.  (I should start a pool on how
many I'll get).

 _
Kevin D. Quitt                                 Job Quest (805) 251-8210
srhqla!quest!kdq                               Learn How to Get a Job in SoCal

                96.37% of all statistics are made up.
Newsgroups: comp.lang.c
From: dfuller@portal.hq.videocart.com (Dave Fuller)
Subject: Re: TRUE & FALSE
Organization: VideOcart Inc.
X-Newsreader: Tin 1.1 PL3
Date: Wed, 11 Nov 1992 22:57:49 GMT

this is a repost. our line wa sdown for a few hours, and i wasn't sure if
it got out correctly.

:  This is to clear up my response under "how's this for odd"
: 
:   I said I define TRUE and FALSE values. I meant that I have values that 
: mean TRUE and FALSE (logically, not #defined). I do not redefine the
: values of TRUE and FALSE.
: 
: I defined values like C_SUCCESS and C_FAILURE as return values for routines.
: 
: these are as return values only, and would never be used to test the result 
: of a comparison or other c logic.
: 
: sorry about the confusion, my original response was not clear on this.
: 
: Dave Fuller
: dfuller@portal.hq.videocart.com
From: throopw@sheol.UUCP (Wayne Throop)
Newsgroups: comp.lang.c
Subject: Re: Two-dimensional Array
Summary: stupid sizeof tricks
Date: 10 Nov 92 01:14:37 GMT

: From: niu@prancer.eche.ualberta.ca (Shaohua Niu)
: Message-ID: <1992Nov6.163315.20337@kakwa.ucs.ualberta.ca>
: [.. error checks omitted for space ..]
: typedef float **MATRIX;
: MATRIX calloc_matrix(int row, int col) {
:   int i;  MATRIX mat;
:   mat = calloc(row, sizeof(float *));
:   for (i=0; i<row; i++)
:         mat[i] = calloc(col, sizeof(MATRIX));
:    return mat;
: }

There are two problems here.  I'll deal with the allocation size
problem first.  Each column is being allocated as an array with
element size of (float**), when it should actually be of the
size of (float).  I suggest a way of getting this right below.

The second problem is the use of calloc on arrays of non-integral
type.  The calloc routine will set the memory to all-bits-zero
(essentially), while a null pointer of type (float*), and a float
value, may not be represented by all-bits-zero words of memory.
(This second problem is one of theoretical portability, and
probably won't bite you.  I still wouldn't tempt fate, and it's
not standard-conforming.)

So, fix the element size and explicitly clear arrays of
non-integral type, and you're all set.  I suggest the following
as a way of getting the allocation sizes right:

+ typedef float **MATRIX;
+ MATRIX alloc_matrix(int row, int col) {
+   int i;  MATRIX mat;
+   mat = malloc(row * sizeof(mat[0]));
+   for (i=0; i<row; i++)
+         mat[i] = malloc(col * sizeof(mat[0][0]));
+    return mat;
+ }

(I've omitted initializations and error checks for brevity...)

You might think that the expression (sizeof(mat[0])) would be
undefined, since the variable mat has no defined value at this point.
But I think this is guaranteed to work by the ANSI standard, because of
the properties of the "sizeof" operator.  Comment from higher level
adepts appreciated on this point.
--
Wayne Throop  ...!mcn)c!dg-rtp!sheol!throopw
From: jfw@ksr.com (John F. Woods)
Newsgroups: comp.lang.c
Subject: Re: pointer explanation
Date: 6 Nov 92 13:57:43 EST

jcl@bdrc.bd.com (John C. Lusth) writes:
>I am teaching an introductory course in C.  One of my students,
>working on a programming assignment, posed me a question.
>    Why would the following lines of code generate an error message
>    that states "value has no  members"
>    " if((strcmp (*records[min].last, *records[j].last)) > 0) "
>    OR
>    " if((strcmp (records[min].last, records[j].last)) > 0) "
>    where records is a struct entry **.

>The answer I gave was...
>    Given
>	struct entry **records;
>    then
>	*records[i].last
>    is wrong because * binds tighter than [], so the above is really
>	(*records)[i].last

This part of the explanation is *false*.  [] binds more tightly than *,
as does ".", so these the expression is equivalent to

	*(records[i].last)

which is incorrect for the reasons you gave later (records[i] is a pointer
not a structure).

Rather than explaining why the statements were wrong, try encouraging reasoning
about what would be correct:

What the student wants to do is take the i'th pointer from the records array
and dereference it to obtain a structure.  So, take the i'th pointer from the
records array:

	records[i]

derefence it

	*records[i]

and you have a structure, which you can then select an element of:

	(*records[i]).last

Note the parenthesization to get the operators evaluated in the desired order;
practice will eventually ingrain the precedence table.

In C, this would be idiomatically expressed as

	records[i]->last

which I think is much clearer, since it doesn't require parenthesization to
get right, and is easier to explain:  the pointer is records[i], and it points
to something with a "last" element.