* Interface Ada string with C++ std::string
@ 2018-07-03 12:59 Roger
2018-07-03 13:13 ` Dan'l Miller
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Roger @ 2018-07-03 12:59 UTC (permalink / raw)
I am need to interface an Ada procedure to a C++ function that takes a std::string as an input parameter.
Can someone advise me how to do this?
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Interface Ada string with C++ std::string
2018-07-03 12:59 Interface Ada string with C++ std::string Roger
@ 2018-07-03 13:13 ` Dan'l Miller
2018-07-03 13:16 ` Roger
2018-07-03 16:56 ` Lucretia
2018-07-05 23:32 ` Roger
2 siblings, 1 reply; 13+ messages in thread
From: Dan'l Miller @ 2018-07-03 13:13 UTC (permalink / raw)
On Tuesday, July 3, 2018 at 7:59:56 AM UTC-5, Roger wrote:
> I am need to interface an Ada procedure to a C++ function that takes a std::string as an input parameter.
> Can someone advise me how to do this?
Is GNAT your Ada compiler? Is GCC your C++ compiler?
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Interface Ada string with C++ std::string
2018-07-03 13:13 ` Dan'l Miller
@ 2018-07-03 13:16 ` Roger
2018-07-03 16:34 ` Jacob Sparre Andersen
0 siblings, 1 reply; 13+ messages in thread
From: Roger @ 2018-07-03 13:16 UTC (permalink / raw)
On Tuesday, July 3, 2018 at 11:13:33 PM UTC+10, Dan'l Miller wrote:
> On Tuesday, July 3, 2018 at 7:59:56 AM UTC-5, Roger wrote:
> > I am need to interface an Ada procedure to a C++ function that takes a std::string as an input parameter.
> > Can someone advise me how to do this?
>
> Is GNAT your Ada compiler? Is GCC your C++ compiler?
Mac OSX 10.13.5
Xcode 9.4.1
GNAT 2018
I config GNAT to use LLVM compilers
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Interface Ada string with C++ std::string
2018-07-03 13:16 ` Roger
@ 2018-07-03 16:34 ` Jacob Sparre Andersen
2018-07-03 16:52 ` Roger
0 siblings, 1 reply; 13+ messages in thread
From: Jacob Sparre Andersen @ 2018-07-03 16:34 UTC (permalink / raw)
Roger <rogermcm2@gmail.com> writes:
> Mac OSX 10.13.5
> Xcode 9.4.1
> GNAT 2018
>
> I config GNAT to use LLVM compilers
I don't think GNAT can use LLVM as its backend.
Have you checked if the GNAT Ada and C++ ABI is compatible with the LLVM
C++ ABI?
Greetings,
Jacob
--
"Genes don't matter. It's all physics."
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Interface Ada string with C++ std::string
2018-07-03 16:34 ` Jacob Sparre Andersen
@ 2018-07-03 16:52 ` Roger
0 siblings, 0 replies; 13+ messages in thread
From: Roger @ 2018-07-03 16:52 UTC (permalink / raw)
On Wednesday, July 4, 2018 at 2:34:53 AM UTC+10, Jacob Sparre Andersen wrote:
>
> I don't think GNAT can use LLVM as its backend.
>
> Have you checked if the GNAT Ada and C++ ABI is compatible with the LLVM
> C++ ABI?
>
> Greetings,
>
> Jacob
> --
> "Genes don't matter. It's all physics."
gprconfig provides selection of LLVM for C and C++
Regards
Roger
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Interface Ada string with C++ std::string
2018-07-03 12:59 Interface Ada string with C++ std::string Roger
2018-07-03 13:13 ` Dan'l Miller
@ 2018-07-03 16:56 ` Lucretia
2018-07-04 3:33 ` Roger
2018-07-05 23:32 ` Roger
2 siblings, 1 reply; 13+ messages in thread
From: Lucretia @ 2018-07-03 16:56 UTC (permalink / raw)
On Tuesday, 3 July 2018 13:59:56 UTC+1, Roger wrote:
> I am need to interface an Ada procedure to a C++ function that takes a std::string as an input parameter.
> Can someone advise me how to do this?
See https://github.com/Lucretia/test_binding
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Interface Ada string with C++ std::string
2018-07-03 16:56 ` Lucretia
@ 2018-07-04 3:33 ` Roger
2018-07-04 4:13 ` Roger
2018-07-04 11:23 ` Lucretia
0 siblings, 2 replies; 13+ messages in thread
From: Roger @ 2018-07-04 3:33 UTC (permalink / raw)
On Wednesday, July 4, 2018 at 2:56:15 AM UTC+10, Lucretia wrote:
> On Tuesday, 3 July 2018 13:59:56 UTC+1, Roger wrote:
> > I am need to interface an Ada procedure to a C++ function that takes a std::string as an input parameter.
> > Can someone advise me how to do this?
>
> See https://github.com/Lucretia/test_binding
Thanks for this, it looks promising.
I have cloned test_binding, built and run it and am now using it as a basis for my own situation.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Interface Ada string with C++ std::string
2018-07-04 3:33 ` Roger
@ 2018-07-04 4:13 ` Roger
2018-07-04 11:23 ` Lucretia
1 sibling, 0 replies; 13+ messages in thread
From: Roger @ 2018-07-04 4:13 UTC (permalink / raw)
On Wednesday, July 4, 2018 at 1:33:59 PM UTC+10, Roger wrote:
> On Wednesday, July 4, 2018 at 2:56:15 AM UTC+10, Lucretia wrote:
> > On Tuesday, 3 July 2018 13:59:56 UTC+1, Roger wrote:
> > > I am need to interface an Ada procedure to a C++ function that takes a std::string as an input parameter.
> > > Can someone advise me how to do this?
> >
> > See https://github.com/Lucretia/test_binding
>
> Thanks for this, it looks promising.
> I have cloned test_binding, built and run it and am now using it as a basis for my own situation.
Having said that; it is true for one of my Macs but not the other.
On the other linking fails with numerous errors which I have been unable to fix:
Undefined symbols for architecture x86_64:
"std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in libtest_binding.a(b_base.o)
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libtest_binding.a(b_base.o)
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in libtest_binding.a(b_derived1.o)
etc.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Interface Ada string with C++ std::string
2018-07-04 3:33 ` Roger
2018-07-04 4:13 ` Roger
@ 2018-07-04 11:23 ` Lucretia
2018-07-04 11:45 ` Roger
1 sibling, 1 reply; 13+ messages in thread
From: Lucretia @ 2018-07-04 11:23 UTC (permalink / raw)
On Wednesday, 4 July 2018 04:33:59 UTC+1, Roger wrote:
> On Wednesday, July 4, 2018 at 2:56:15 AM UTC+10, Lucretia wrote:
> > On Tuesday, 3 July 2018 13:59:56 UTC+1, Roger wrote:
> > > I am need to interface an Ada procedure to a C++ function that takes a std::string as an input parameter.
> > > Can someone advise me how to do this?
> >
> > See https://github.com/Lucretia/test_binding
>
> Thanks for this, it looks promising.
> I have cloned test_binding, built and run it and am now using it as a basis for my own situation.
All you probably need is a C function which returns the string c_str() to Ada which Ada can then use, wrap that in Ada. Just define a private type for the string class which is an address and pass that to the C function.
package CPP_Strings is
type CPP_String is private;
function Get (S : in CPP_String) return String; -- Wrap the C->Ada stuff inside here.
private
type CPP_String is System.Address;
end CPP_Strings;
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Interface Ada string with C++ std::string
2018-07-04 11:23 ` Lucretia
@ 2018-07-04 11:45 ` Roger
2018-07-04 11:52 ` Lucretia
0 siblings, 1 reply; 13+ messages in thread
From: Roger @ 2018-07-04 11:45 UTC (permalink / raw)
On Wednesday, July 4, 2018 at 9:23:23 PM UTC+10, Lucretia wrote:
> All you probably need is a C function which returns the string c_str() to Ada which Ada can then use, wrap that in Ada. Just define a private type for the string class which is an address and pass that to the C function.
>
> package CPP_Strings is
> type CPP_String is private;
>
> function Get (S : in CPP_String) return String; -- Wrap the C->Ada stuff inside here.
> private
> type CPP_String is System.Address;
> end CPP_Strings;
Thanks,
I was playing around today modifying your test_binding code then managed to accidentally delete everything I'd done!
I think I'll have another go at it as it is an educational experience.
Once I've done that, I'll be in a better position to understand and implement what you've just suggested.
Everything is pretty much in line with my thinking. My main problem is my minimal experience with C++ so your helping hand is very welcome.
Once I found it impossible to directly interface std::string to Ada, I thought the way ahead would be to write a C interface to C++ and then wrap the C interface to Ada as you have suggested.
My original post was due to not being sure how to do it. So your advice has been a tremendous help and makes me confident that I'll get there eventually.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Interface Ada string with C++ std::string
2018-07-04 11:45 ` Roger
@ 2018-07-04 11:52 ` Lucretia
2018-07-05 1:08 ` Roger
0 siblings, 1 reply; 13+ messages in thread
From: Lucretia @ 2018-07-04 11:52 UTC (permalink / raw)
On Wednesday, 4 July 2018 12:45:30 UTC+1, Roger wrote:
> On Wednesday, July 4, 2018 at 9:23:23 PM UTC+10, Lucretia wrote:
>
> > All you probably need is a C function which returns the string c_str() to Ada which Ada can then use, wrap that in Ada. Just define a private type for the string class which is an address and pass that to the C function.
> >
> > package CPP_Strings is
> > type CPP_String is private;
> >
> > function Get (S : in CPP_String) return String; -- Wrap the C->Ada stuff inside here.
> > private
> > type CPP_String is System.Address;
> > end CPP_Strings;
>
> Thanks,
> I was playing around today modifying your test_binding code then managed to accidentally delete everything I'd done!
> I think I'll have another go at it as it is an educational experience.
> Once I've done that, I'll be in a better position to understand and implement what you've just suggested.
> Everything is pretty much in line with my thinking. My main problem is my minimal experience with C++ so your helping hand is very welcome.
> Once I found it impossible to directly interface std::string to Ada, I thought the way ahead would be to write a C interface to C++ and then wrap the C interface to Ada as you have suggested.
> My original post was due to not being sure how to do it. So your advice has been a tremendous help and makes me confident that I'll get there eventually.
The test_binding is the extreme way to do it.
The simpler, kind of, and preferred way would be to work out what you need from the string class. Pass around the C++ pointer inside Ada. Then have C functions which are imported to Ada which handle the messy C/C++ stuff, then wrap those in Ada handling the Messy Ada/C stuff there.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Interface Ada string with C++ std::string
2018-07-04 11:52 ` Lucretia
@ 2018-07-05 1:08 ` Roger
0 siblings, 0 replies; 13+ messages in thread
From: Roger @ 2018-07-05 1:08 UTC (permalink / raw)
On Wednesday, July 4, 2018 at 9:52:35 PM UTC+10, Lucretia wrote:
> The test_binding is the extreme way to do it.
>
> The simpler, kind of, and preferred way would be to work out what you need from the string class. Pass around the C++ pointer inside Ada. Then have C functions which are imported to Ada which handle the messy C/C++ stuff, then wrap those in Ada handling the Messy Ada/C stuff there.
Thanks for all your advice.
It turns out that my original effort was almost there and now works.
As you advise, it just needs a C function between Ada and C++.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Interface Ada string with C++ std::string
2018-07-03 12:59 Interface Ada string with C++ std::string Roger
2018-07-03 13:13 ` Dan'l Miller
2018-07-03 16:56 ` Lucretia
@ 2018-07-05 23:32 ` Roger
2 siblings, 0 replies; 13+ messages in thread
From: Roger @ 2018-07-05 23:32 UTC (permalink / raw)
Just to complete the story, the solution was extremely simple, just a C++ wrapper in which a std::string constructor is used to generate a std::string from a char* string which is then used in calling the required C++ routine.
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2018-07-05 23:32 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-03 12:59 Interface Ada string with C++ std::string Roger
2018-07-03 13:13 ` Dan'l Miller
2018-07-03 13:16 ` Roger
2018-07-03 16:34 ` Jacob Sparre Andersen
2018-07-03 16:52 ` Roger
2018-07-03 16:56 ` Lucretia
2018-07-04 3:33 ` Roger
2018-07-04 4:13 ` Roger
2018-07-04 11:23 ` Lucretia
2018-07-04 11:45 ` Roger
2018-07-04 11:52 ` Lucretia
2018-07-05 1:08 ` Roger
2018-07-05 23:32 ` Roger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox