comma operator: keep away?

Rich Neitzel thor at stout.ucar.edu
Tue May 2 03:02:48 AEST 1989


In article <19378 at adm.BRL.MIL> Kemp at DOCKMASTER.NCSC.MIL writes:
>
>Arrays:
>  Although C has an array notation, it is not used very effectively. I
>don't know of any C compilers that do array bounds checking (which does
>not mean that none exist, but they are not on the machines I use).
>Fortran programmers take such checking for granted.

BTW, on all Fortran compilers I've ever used, bounds checking is a compiler
option, typically NOT a default option. Certainly when I used to write
realtime programs for RSX-11M no one used the bounds checking. Not 
something taken for granted.

>  In addition, C programmers use the *p++=*q++ construct to copy an array
>because historically C compilers have been too stupid to optimize
>"p[i] = q[i]".

Sorry, but looking at the assembler output for several Fortran compilers
versus C compilers on the same machine, I find that Fortran compilers are
equally "too stupid to optimize" this construct. Alas, for
	do i = 1, 100			for (i = 0; i < 100; i++)
	   j(i) = k(i)			   j[i] = k[i];
   10   continue

virtually the same assembler output was generated for both languages. 
If you want "smart", C is better here, since it let's the programmer
optimize "around" the "dumb" compiler.

Besides, if one wants to do a straight copy between two arrays, 
then
	j(1:100000) = k(1:100000)    vs.     bcopy(k,j,sizeof(k);
In this case, for large upper bounds the C form is more efficient
and certainly less data-dependent.

>
>Fortran includes I/O within the language definition, which allows
>the compiler to detect errors that C compilers can't.  

Granted, but there are times when I need to "violate" the rules. 
For example, I once needed to print out the bit patterns for 32
bit floating point numbers. In C this was simple and easy to follow:

	printf("%g = %x\n",float,float);
In Fortran it would require double declarations and equivalences and be
less clear (at least to me :-)).

>Strings:
>  Fortran strings are represented by a pointer and a length; C strings
                                                ^^^^^^^^^^^^
>are just a pointer, with a null byte representing the end of the string.
>Now what kind of a scuzzy, data-dependent, low-level hack is that?

In my humble opinion it is Fortran that is data dependent here. Try
finding out how big the actual string data is versus the amount of storage
allocated for the maximum size. Most Fortran compilers I've used have
initialized strings with blanks! Since these are often significant 
characters in a string, how do you finds the end of valid data? That's
right, you do it yourself. Now you need a variable to keep track of the
end of data index. And as for parsing, tell me what Fortran routine 
can do anything similar to strtok? Gosh, you mean I have to have 
separate strings big enough to hold the maximum exspected character
size for every parsed item? Nope, I believe it's Fortran that data-
dependent. 


>  There indeed may be no objective reality to the term "high level", but

Agreed, but it seems to me that the term is used to distingish languages
like C and Fortran from assembler. I would have a hard time being 
convinced that C is not higher level is those terms.
-------------------------------------------------------------------------------

			Richard Neitzel
			National Center For Atmospheric Research

			thor at thor.ucar.edu

    	Torren med sitt skjegg		Thor with the beard
    	lokkar borni under sole-vegg	calls the children to the sunny wall
    	Gjo'i med sitt shinn		Gjo with the pelts
    	jagar borni inn.		chases the children in.





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



More information about the Comp.unix.questions mailing list