comp.lang.ada
 help / color / mirror / Atom feed
From: Victor Porton <porton@narod.ru>
Subject: Re: unconstrained subtype in component declaration
Date: Sun, 27 Jul 2014 18:27:37 +0300
Date: 2014-07-27T18:27:37+03:00	[thread overview]
Message-ID: <lr35p6$d30$1@speranza.aioe.org> (raw)
In-Reply-To: lr34tq$air$1@speranza.aioe.org

Victor Porton wrote:

> As I've told in my previous thread in c.l.a, I want a function to return
> two values.
> 
> A fragment of my real code:
> 
>    type Filename_And_Fragment is
>       record
>          Filename: String;
>          Fragment: String;
>       end record;
> 
>    function URI_String_To_Filename_And_Fragment(Str: String) return
> Filename_And_Fragment;
> 
> rdf-raptor-uri.ads:63:20: unconstrained subtype in component declaration
> 
> The compiler does not accept this. What to do? (I do not want to create a
> full fledged object with access-to-String fields and Get_*() accessors and
> Unchecked_Deallocation in finalization.)
> 
> Should I step back to "out" argument of a procedure instead of returning a
> record like this as a return value of a function? (there were reasons why
> this would be better).
> 
> Or should I just add two discriminants to the record?
> 
> After some practice with Ada, I feel that it is probably not that good as
> I thought earlier.

I've solved this problem. Here is my real code:

   -- In package:
   type Filename_And_Fragment (Filename_Length, Fragment_Length: Natural) is
      record
         Filename: String(1..Filename_Length);
         Fragment: String(1..Fragment_Length);
      end record;

   function URI_String_To_Filename_And_Fragment(Str: String) return Filename_And_Fragment;

   -- In package body:
   function URI_String_To_Filename_And_Fragment(Str: String) return Filename_And_Fragment is
      C_Filename : chars_ptr;
      C_Fragment : aliased chars_ptr;
   begin
      C_Filename := C_Raptor_Uri_Uri_String_To_Filename_Fragment (To_C (Str), C_Fragment'Unchecked_Access);
      declare
         Filename: constant String := Value (C_Filename);
         Fragment: constant String := Value (C_Fragment);
         Result  : constant Filename_And_Fragment :=
            (Filename_Length => Filename'Length, Fragment_Length => Fragment'Length, Filename => Filename, Fragment => Fragment);
      begin
         RDF.Raptor.Memory.raptor_free_memory (C_Filename);
         if C_Fragment /= Null_Ptr then
            RDF.Raptor.Memory.raptor_free_memory (C_Fragment);
         end if;
         return Result;
      end;
   end;

-- 
Victor Porton - http://portonvictor.org


      parent reply	other threads:[~2014-07-27 15:27 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-27 15:13 unconstrained subtype in component declaration Victor Porton
2014-07-27 15:21 ` Peter Chapin
2014-07-27 15:27 ` Victor Porton [this message]
replies disabled

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