comp.lang.ada
 help / color / mirror / Atom feed
From: smize@Starbase.NeoSoft.COM (Samuel Mize)
Subject: Re: "Subtract C, add Ada"
Date: 31 Jan 1995 12:07:22 -0600
Date: 1995-01-31T12:07:22-06:00	[thread overview]
Message-ID: <3glu8q$rv9@Starbase.NeoSoft.COM> (raw)
In-Reply-To: 3gebnq$7f3@cronkite.seas.gwu.edu


Some of my earlier postings were not as clear as they should
have been.  Let me clarify.

In article <3gebnq$7f3@cronkite.seas.gwu.edu>,
David O'Brien <dobrien@seas.gwu.edu> wrote:
>Samuel Mize (smize@Starbase.NeoSoft.COM) wrote:
>: In article <3g4p94$g07@cronkite.seas.gwu.edu>,
>: David O'Brien <dobrien@seas.gwu.edu> wrote:
>: >Robert Firth (firth@sei.cmu.edu) wrote:
>: >
>: >: 	LOOP
>: >: 	   get(c);
>: >: 	   EXIT WHEN c /= ASCII.SP;
>: >: 	END LOOP;
>: >
>: >: Note also that if there are *no more* non space characters, the C code
>: >: dies in an infinite loop, while the Ada code automatically does the
>: >: right thing, namely raises the END_ERROR exception.
>: >

[discussion in Mize post of reading from a file deleted]

>: If this is scanning a string that has no more spaces, Ada will
>: raise an exception at the end of the string.  C will scan merrily
>: off the end of the array and through the memory following until it
>: hits a space or you get "segmentation error (core dumped)".
>
>Boy are we making assumptions about the processing that follows counting
>the number of spaces.  Would you care to explain how C will core dump?

I meant, if the NUL at the end of a string was clobbered,
or the array pointer was corrupted, and you started scanning
the wrong part of memory.  That isn't what I said, but is what
I meant.  I didn't clearly state that I was changing subject
somewhat, and I also got the logic of the test backward.  Sorry.

If the end-marker of a string is missing, or the array pointer
is corrupted, you can core dump right here.  No further
processing needed.

>
>The loop will stop when there are no more spaces IN A ROW.  The original
>C code was:
>	while ( (c = getchar()) == ' ' ) { /* count spaces */ }
>
>The Ada code and the C code ARE THE SAME.  That being, both count the

They aren't the same code lexically or logically. They ARE not THE SAME.
Someone else said that the C would go into an infinite loop, and that
this was the equivalent Ada code.  They were wrong.

The logically equivalent Ada (using text_io) would be

    while not end_of_file loop
        get (c);
        exit when c /= ' ';
    end loop;

>number of spaces in a sequence.  Once the first non-space character is
>read (could be A thru Z, EOF, ASCII NUL, what ever), both of these code
>fragments will exit the while loop.  There is nothing in these code
>fragments that may be used to complain about C's handling of strings.
>Code layout and where expressions may be used is what this thread was
>about.
>
>If you really want to get into it, the Ada way is worse.  If the input
>string contained only spaces, Ada would exception when EOF was hit.
>C on the other hand would exit the loop cleanly and what ever came next
>would execute.  In Ada I hope you wrapped the while loop with an
>exception handler.

No, you just have to understand how EOF is handled in both languages,
and write the Ada correctly.  This was not your error originally,
and since you're taking the pro-C side I won't dis you for not
recognizing an Ada error.  :-)

The C code is more terse, but not necessarily more efficient; that
depends on your compiler.  The C getc is probably checking for EOF
behind your back, instead of it being explicitly coded in.

I am now switching topics back to strings.  Someone in the thread 
brought up C going into an infinite loop.  I thought that person
may be confusing a file read with a string scan.  (Yes, it *is*
a file read; standard input is a file, as are standard output and
standard error.)

Anyway, on a string, you would ward the loop with a range check,
probably using a "for" clause:

     for I in String'range loop
         exit when String(i) = ' ';
     end loop;

or, if not starting at the start of the string:

     for I in Current_Pos .. String'last loop
         if String (I) = ' ' then
             Current_Pos := I;
             exit;
         end if;
     end loop;

In C, with a string, most programmers would just look for a
non-blank, including the NUL that is "always" at the end of
a string.  You can also explicitly code in a limit, as shown
by a previous poster in this thread (I don't have it handy).

In Ada, if you screw up and don't check the range, you can
get an exception.  In C, if you don't check the range, most
people don't consider it an error, but if the data gets
screwed up (no NUL or bad pointer) you can core dump.

To bring this back to code layout:  Ada provides a way to
check the range as part of the loop construct, and a
lexically-scoped way to handle the error case.  In C, you
*can* check for a bad array index but usually don't, and
have no way to check whether the array pointer has been
rewritten.  You have to register a signal handler to deal
gracefully with error cases.

>
>-- David O'Brien	(dobrien@seas.gwu.edu)





  reply	other threads:[~1995-01-31 18:07 UTC|newest]

Thread overview: 85+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1995-01-20 10:20 "Subtract C, add Ada" R.A.L Williams
1995-01-20 13:22 ` Renaud HEBERT
1995-01-24  3:35   ` David Moore
1995-01-25  5:38     ` Robert Dewar
1995-01-28 16:35     ` Jules
1995-01-29  8:06       ` Matt Kennel
1995-01-30  5:31       ` Michael Feldman
1995-01-31 22:22         ` David O'Brien
1995-01-24 20:23   ` N. Mellor
1995-01-25  8:50     ` Robb Nebbe
1995-01-25 14:19     ` John Volan
1995-01-26  5:07     ` Samuel Mize
1995-01-26 18:51       ` Mark A Biggar
1995-01-21 15:18 ` Robert Dewar
1995-01-21 21:03 ` David O'Brien
1995-01-23  3:09   ` Jay Martin
1995-01-23 12:50     ` Andrew McConnell
1995-01-24  0:54     ` Matt Kennel
1995-01-25 17:03       ` Norman H. Cohen
1995-01-26  1:13         ` Dr. Richard Botting
1995-01-26 14:32         ` Anders Juul Munch
1995-01-24  0:17   ` Bob Kitzberger
1995-01-23 20:46 ` Robert Firth
1995-01-24 14:25   ` Samuel Mize
1995-01-25  7:27     ` David O'Brien
1995-01-25 12:14     ` Robert A Duff
1995-01-25  5:57   ` David O'Brien
     [not found]     ` <3g9rf0$71k@Starbase.NeoSoft.COM>
1995-01-28 21:08       ` David O'Brien
1995-01-31 18:07         ` Samuel Mize [this message]
1995-02-01 10:23         ` Samuel Mize
1995-01-30  0:24     ` Mark S. Hathaway
1995-01-31  3:30       ` Jay Martin
1995-02-01 13:25         ` Jesper Kaagaard
  -- strict thread matches above, loose matches on Subject: below --
1995-02-10 13:49 R.A.L Williams
     [not found] <3gsr0e$oin@miranda.gmrc.gecm.com>
1995-02-07 16:58 ` Mark S. Hathaway
1995-02-08  7:39   ` Travis C. Porco
1995-02-08 16:07     ` Fred J. McCall
1995-02-08 21:30       ` Garlington KE
1995-01-31  9:34 R.A.L Williams
1995-02-01 16:45 ` Charles H. Sampson
1995-01-23  8:49 R.A.L Williams
1995-01-25 23:18 ` Charles H. Sampson
1995-01-20  9:33 R.A.L Williams
     [not found] <3fgphd$sc3@rational.rational.com>
1995-01-20  5:51 ` RonaldS60
1995-02-07 13:55   ` Robert C. Soong
     [not found] <3fdcoi$chn@miranda.gmrc.gecm.com>
1995-01-20  5:01 ` Samuel Mize
1995-01-20 22:07   ` Garlington KE
1995-01-24  5:02     ` R_Tim_Coslet
     [not found] <3etund$hnr@miranda.gmrc.gecm.com>
1995-01-12  9:56 ` Erik Svensson
1995-01-12 14:44 ` Norman H. Cohen
1995-01-13  1:51 ` David O'Brien
1995-01-13 12:38   ` Laurent Gasser
1995-01-13 20:53     ` John DiCamillo
     [not found]       ` <3f8fnf$c8p@gamma.ois.com>
1995-01-16 11:02         ` Matt Kennel
     [not found]         ` <milodD2IFpG.329@netcom.com>
1995-01-17 21:39           ` R. William Beckwith
     [not found]       ` <3fa11q$sdh@gnat.cs.nyu.edu>
1995-01-16 20:20         ` David Moore
1995-01-14  0:24     ` David O'Brien
1995-01-20  4:43     ` Samuel Mize
1995-01-21 20:28       ` David O'Brien
1995-01-22 21:12         ` Robert Dewar
1995-01-23 18:35         ` Norman H. Cohen
1995-01-23 19:18         ` John Cosby - The Coz
1995-01-24 14:11         ` Samuel Mize
1995-01-14 10:37   ` Keith Thompson
     [not found]     ` <3fcjgt$b0v@cronkite.seas.gwu.edu>
1995-01-16 18:47       ` Robert Dewar
     [not found]   ` <D2It0r.4rp@inmet.camb.inmet.com>
1995-01-17 14:11     ` Norman H. Cohen
1994-12-30 16:06 Mitch Gart
1995-01-03 19:04 ` whiting_ms@corning.com (Matt Whiting)
1995-01-05  4:31   ` Michael Feldman
1995-01-04 21:40 ` Fred McCall
1995-01-05  4:30   ` Richard Pattis
1995-01-05 16:07   ` Kevin Weise
1995-01-06 13:06   ` Jahn Rentmeister
1995-01-06 16:47     ` Laurent Gasser
1995-01-06 17:29       ` David Weller
1995-01-06 17:30         ` David Weller
1995-01-10 18:28       ` Bob Kitzberger
1995-01-06 23:36   ` Kenneth Almquist
1995-01-04 22:45 ` Jay M. Martin
1995-01-05  4:37   ` Michael Feldman
1995-01-05 18:08     ` Jay Martin
1995-01-05 23:56       ` Robert Dewar
1995-01-08  8:04         ` Jay Martin
1995-01-06  0:07       ` Michael M. Bishop
1995-01-10 21:30         ` Jay Martin
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox