comp.lang.ada
 help / color / mirror / Atom feed
* if Restrict_Func /= null confusion
@ 2008-03-30 20:58 ma740988
  2008-03-30 21:34 ` jimmaureenrogers
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: ma740988 @ 2008-03-30 20:58 UTC (permalink / raw)


Well folks its been at least 4 years since I've perused and/or written
Ada source.  That aside I'm perusing source code written in Ada.   So
consider:

-- used to restrict a variable within a range
-- for example: -PI to +PI
type Restrict_Function is access function (X: Real4) return Real4;

type Filt_Data is
  record
     Restrict_Func   : Restrict_Function ;

  end record ;


   --  within a procedure we have
  Fdata             : Filt_Data;
  Restrict_Func : Restrict_Function := FData.Restrict_Func ;

  if  Restrict_Func /= null then
   -- stuff
  endif

At issue:  I'm not following the conditional logic 'if (Restrict_Func /
= null)'.  Not understanding the impetus behind the check for null.



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: if Restrict_Func /= null confusion
  2008-03-30 20:58 if Restrict_Func /= null confusion ma740988
@ 2008-03-30 21:34 ` jimmaureenrogers
  2008-03-30 21:36 ` Ludovic Brenta
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: jimmaureenrogers @ 2008-03-30 21:34 UTC (permalink / raw)


On Mar 30, 2:58 pm, ma740...@gmail.com wrote:
> Well folks its been at least 4 years since I've perused and/or written
> Ada source.  That aside I'm perusing source code written in Ada.   So
> consider:
>
> -- used to restrict a variable within a range
> -- for example: -PI to +PI
> type Restrict_Function is access function (X: Real4) return Real4;
>
> type Filt_Data is
>   record
>      Restrict_Func   : Restrict_Function ;
>
>   end record ;
>
>    --  within a procedure we have
>   Fdata             : Filt_Data;
>   Restrict_Func : Restrict_Function := FData.Restrict_Func ;
>
>   if  Restrict_Func /= null then
>    -- stuff
>   endif
>
> At issue:  I'm not following the conditional logic 'if (Restrict_Func /
> = null)'.  Not understanding the impetus behind the check for null.

Type Restrict_Function is an access type. It is possible for an
instance of Restrict_Function to have a null value. This kind of
problem can occur if you are creating an array of Restrict_Function
and only some of the elements of the array are set to non-null values.
You will encounter a run-time error if you try to dereference a null
access value.

Jim Rogers



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: if Restrict_Func /= null confusion
  2008-03-30 20:58 if Restrict_Func /= null confusion ma740988
  2008-03-30 21:34 ` jimmaureenrogers
@ 2008-03-30 21:36 ` Ludovic Brenta
  2008-03-30 21:37 ` Robert A Duff
  2008-03-30 21:44 ` Georg Bauhaus
  3 siblings, 0 replies; 5+ messages in thread
From: Ludovic Brenta @ 2008-03-30 21:36 UTC (permalink / raw)


ma740988@gmail.com writes:
> I'm not following the conditional logic 'if (Restrict_Func / =
> null)'.  Not understanding the impetus behind the check for null.

If Restrict_Func is null and you try to call the subprogram it
designates, you get a Constraint_Error (ARM 4.9(13)).  If you disable
runtime checks, your program is likely to crash.

-- 
Ludovic Brenta.



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: if Restrict_Func /= null confusion
  2008-03-30 20:58 if Restrict_Func /= null confusion ma740988
  2008-03-30 21:34 ` jimmaureenrogers
  2008-03-30 21:36 ` Ludovic Brenta
@ 2008-03-30 21:37 ` Robert A Duff
  2008-03-30 21:44 ` Georg Bauhaus
  3 siblings, 0 replies; 5+ messages in thread
From: Robert A Duff @ 2008-03-30 21:37 UTC (permalink / raw)


ma740988@gmail.com writes:

> Well folks its been at least 4 years since I've perused and/or written
> Ada source.  That aside I'm perusing source code written in Ada.   So
> consider:
>
> -- used to restrict a variable within a range
> -- for example: -PI to +PI
> type Restrict_Function is access function (X: Real4) return Real4;
>
> type Filt_Data is
>   record
>      Restrict_Func   : Restrict_Function ;
>
>   end record ;
>
>
>    --  within a procedure we have
>   Fdata             : Filt_Data;
>   Restrict_Func : Restrict_Function := FData.Restrict_Func ;
>
>   if  Restrict_Func /= null then
>    -- stuff
>   endif
>
> At issue:  I'm not following the conditional logic 'if (Restrict_Func /
> = null)'.  Not understanding the impetus behind the check for null.

Restrict_Func is a pointer to a function.  To call the function,
you say something like "Restrict_Func.all(X)".  You can leave
the ".all" implicit: "Restrict_Func(X)", but the ".all" still
happens.  ".all" on a null pointer raises an exception.

In your example, presumably "stuff" calls the function -- so it needs to
be protected by the 'if'.

It's usually better to declare:

    type Restrict_Function is not null access function ...;
                              ^^^^^^^^

so you don't need to worry about null, which is just a tripping hazard.

Or use primitive operations of tagged types and dispatching calls.

- Bob



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: if Restrict_Func /= null confusion
  2008-03-30 20:58 if Restrict_Func /= null confusion ma740988
                   ` (2 preceding siblings ...)
  2008-03-30 21:37 ` Robert A Duff
@ 2008-03-30 21:44 ` Georg Bauhaus
  3 siblings, 0 replies; 5+ messages in thread
From: Georg Bauhaus @ 2008-03-30 21:44 UTC (permalink / raw)



On Sun, 2008-03-30 at 13:58 -0700, ma740988@gmail.com wrote:

> -- used to restrict a variable within a range
> -- for example: -PI to +PI
> type Restrict_Function is access function (X: Real4) return Real4;
> 
> type Filt_Data is
>   record
>      Restrict_Func   : Restrict_Function ;
> 
>   end record ;
> 
> 
>    --  within a procedure we have
>   Fdata             : Filt_Data;
>   Restrict_Func : Restrict_Function := FData.Restrict_Func ;
> 
>   if  Restrict_Func /= null then
>    -- stuff
>   endif
> 
> At issue:  I'm not following the conditional logic 'if (Restrict_Func /
> = null)'.  Not understanding the impetus behind the check for null.

The type Restrict_Function includes the null value.
The FData.Restrict_Func record component gets the default
initial value for access values. It is therefore null.
So Filt_Data.Restrict_Func is actually null.






^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2008-03-30 21:44 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-03-30 20:58 if Restrict_Func /= null confusion ma740988
2008-03-30 21:34 ` jimmaureenrogers
2008-03-30 21:36 ` Ludovic Brenta
2008-03-30 21:37 ` Robert A Duff
2008-03-30 21:44 ` Georg Bauhaus

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