'goto" gone from computer languages or is it!

Dave Dunfield dave04a at dunfield.com
Mon May 16 18:05:15 CDT 2005


Various messages compined into one - quotes are not all from the
same person(s).


>Straighten up and get serious. You used twice as much printf as
>everybody else. Have you ever seen the setup for a printf call in
>assembler?
>I wonder if even the compiler can save you from this shameless bit of excess.

Unlikely - as there are two different format strings.


>... the wrong answer being to dump out each array element followed by a
>comma, then output ^H as the final step in the function ;-)

Works poorly on hardcopy devices :-)


>Real Programmers would presumably use putc exclusively in favour of the
>more computationally expensive printf...

Naw, printf() is a simple and versatile tool, and since the code is only
linked once it's usually worth it as it's handy "all over" - besides,
printf() doesn't have to be huge - here is my CSTATS output for my integer-
only printf format routine (which is a single function that does not call
ANY other functions - all tests and conversions are internal):

Characters:
  in file(s)   : 2263
  in comments  : 733
  whitespace   : 620
  significant  : 910
Lines:
  in file(s)   : 97
  blank/comment: 23
  significant  : 74
Cism's:
  '{'s         : 13
  '}'s         : 13
  ';'s         : 47
  comments     : 20

74 lines and 47 statements (including variable declarations) in 13 blocks.
This is an integer-only printf() formatter (real programmers don't use FP)
written in pure C which supports the following free form types:
  %c (character)
  %s (string)
  %d (signed decimal)
  %u (unsigned decimal)
  %x (hexidecimal)
  %o (octal)
  %b (binary)
  %% (single '%')
And formatting of any of the above types in the form:
  %5x   <= 5 character, right justify, space fill
  %05x  <= 5 character, right justify, zero  fill
  %-5x  <= 5 character, left  justify, space fill
  %-05x <= 5 character, left  justify, zero  fill (kinds useless :-)
[and yes, other format widths besides 5 are supported!]

- Codesize compiled from C for the 8086 (my Micro-C) is 688 bytes.
- Code size of comparable routine hand crafted in assembly language
  for my 8051 compiler library is 437 bytes (although this adds a
  new %i for strings in internal memory).
- Code size for the C-FLEA (a virtual processor I developed which is
  an optimized C target) is 335 bytes.

Just because winbloat leads us to expect multi-megabyte executables and
massive libraries - it duzn't has to be so!


>> void print_ary (int *aryp, int n)
>> {
>>     int i;
>>     for (i=0; i<n; aryp++, i++)
>>        {
>>            if (i>0)
>>                printf (", ");
>>            printf ("%u", *aryp);
>>        }
>>     printf ("\n");
>> }
>
>Um, if you're anal like me, you don't want to print a comma after the last
>value, so:
>
>...
>       printf ("%u", *aryp);
>       if (i<n) printf (", ");

Um, the original code won't print a comma after the last value.

You could of course do something "clever" to make the
extra conditional harder to see like:

    for(i=0; i < n; ++i)
      printf("%u%s", aryp[i], ","+(i >= n));

This is getting silly!

Regards,
-- 
dave04a (at)    Dave Dunfield
dunfield (dot)  Firmware development services & tools: www.dunfield.com
com             Collector of vintage computing equipment:
                http://www.parse.com/~ddunfield/museum/index.html




More information about the cctalk mailing list