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
prev 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