From: Victor Porton <porton@narod.ru>
Subject: Re: Need a way to convert a constant to a variable
Date: Sat, 05 Aug 2017 18:11:06 +0300
Date: 2017-08-05T18:11:06+03:00 [thread overview]
Message-ID: <om4n6n$1lsi$1@gioia.aioe.org> (raw)
In-Reply-To: om4lra$1jku$1@gioia.aioe.org
Dmitry A. Kazakov wrote:
> On 2017-08-05 15:41, Victor Porton wrote:
>> I've sent the following email to ada-comment mailing list. I duplicate it
>> here.
>>
>> !topic Need a way to convert a constant to a variable
>> !reference Ada 2012 RM
>> !from Victor Porton 17-08-05
>> !keywords constant, variable, view, conversion
>> !discussion
>>
>> Sometimes one needs to convert a constant view into variable view (I am
>> fully conscious that after this the programmer should take care not to
>> change the object of the view).
>>
>> In the following (not compilable with GNAT 7.1.0) code I present my
>> best attempt to solve the following problem:
>>
>> Write a function with an "in" indefinite holder with a string, return
>> chars_ptr corresponding to the string.
>>
>> It looks like there is no solution of this in Ada 2012 :-(
>>
>> with Interfaces.C; use Interfaces.C;
>> with Interfaces.C.Strings; use Interfaces.C.Strings;
>> with Ada.Containers.Indefinite_Holders;
>>
>> procedure Conv is
>>
>> package Char_Array_Holders is
>> new Ada.Containers.Indefinite_Holders(char_array);
>>
>> type C_String_Holder is new Char_Array_Holders.Holder
>> with null record;
>>
>> function To_C_String (Object: C_String_Holder) return chars_ptr is
>> Value: char_array renames Constant_Reference(Object).Element.all;
>> Value2: aliased Char_Array(Value'Range) with Import;
>> for Value2'Address use Value'Address;
>> begin
>> return To_Chars_Ptr(Char_Array_Access'(Value2'Access));
>> end;
>> begin
>> null;
>> end;
>
> AFAIK, Ada.Containers.Indefinite_Holders was designed in a way to
> prevent specifically what you want.
>
>> Can any problem with different representation of constant and variables
>> appear?
>
> 1. Don't use Ada.Containers.Indefinite_Holders?
>
> 2. Don't use char_array. It has restricted use when interfacing C. You
> probably need chars_ptr put into a controlled type if you want safe C
> strings. This is basically same as Holder internally is, except that you
> are in full control.
I do use char_array for interfacing with C.
It is a pity that I need to reimplement Indefinite_Holders for this task.
--
Victor Porton - http://portonvictor.org
next prev parent reply other threads:[~2017-08-05 15:11 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-05 13:41 Need a way to convert a constant to a variable Victor Porton
2017-08-05 14:48 ` Dmitry A. Kazakov
2017-08-05 15:11 ` Victor Porton [this message]
2017-08-05 16:44 ` Dmitry A. Kazakov
2017-08-05 17:45 ` Victor Porton
2017-08-05 19:37 ` Dmitry A. Kazakov
2017-08-05 15:41 ` Jeffrey R. Carter
2017-08-05 16:25 ` Victor Porton
2017-08-05 20:12 ` Jeffrey R. Carter
2017-08-05 17:59 ` Per Sandberg
2017-08-15 20:05 ` Eryndlia Mavourneen
2017-08-15 20:07 ` Eryndlia Mavourneen
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox