www.digitalmars.com         C & C++   DMDScript  

D - out struct parameters are by value!?

reply "Matthew Wilson" <matthew stlsoft.org> writes:
I have a C function, whose effective signature is:

  void __stdcall Recls_GetSizeProperty(recls_info_t fileInfo,
recls_filesize_t *size);

recls_info_t is actually a typedef of a pointer to a structure. Hence, the
first argument is 4 bytes.
recls_filesize_t is, in Win32, a FILETIME structure. Hence the second
argument is 4 bytes.

In D, I declared it as

public struct recls_time_t
{
  uint dwLowDateTime;
  uint dwHighDateTime;
};

extern(Windows)
{
  . . .

  private void  Recls_GetSizeProperty(in recls_info_t fileInfo, out
recls_filesize_t size);

However, this fails to link. It cannot find _Recls_GetSizeProperty 12 which
clearly indicates that the out parameter is by value. If I define it as

extern(Windows)
{
  . . .

  private void  Recls_GetSizeProperty(in recls_info_t fileInfo,
recls_filesize_t *size);

It links fine.

This seems more than a little odd. What if the struct is very large?

In fact, why is an out parameter passed by value? And how is the out-ness
effected? Very odd.

Please explain.

Matthew
Oct 10 2003
next sibling parent "Matthew Wilson" <matthew stlsoft.org> writes:
Clarification: the size is not FILETIME. (That's the time!). It's actually a
ulong.

"Matthew Wilson" <matthew stlsoft.org> wrote in message
news:bm7hj0$20pq$1 digitaldaemon.com...
 I have a C function, whose effective signature is:

   void __stdcall Recls_GetSizeProperty(recls_info_t fileInfo,
 recls_filesize_t *size);

 recls_info_t is actually a typedef of a pointer to a structure. Hence, the
 first argument is 4 bytes.
 recls_filesize_t is, in Win32, a FILETIME structure. Hence the second
 argument is 4 bytes.

 In D, I declared it as

 public struct recls_time_t
 {
   uint dwLowDateTime;
   uint dwHighDateTime;
 };

 extern(Windows)
 {
   . . .

   private void  Recls_GetSizeProperty(in recls_info_t fileInfo, out
 recls_filesize_t size);

 However, this fails to link. It cannot find _Recls_GetSizeProperty 12
which
 clearly indicates that the out parameter is by value. If I define it as

 extern(Windows)
 {
   . . .

   private void  Recls_GetSizeProperty(in recls_info_t fileInfo,
 recls_filesize_t *size);

 It links fine.

 This seems more than a little odd. What if the struct is very large?

 In fact, why is an out parameter passed by value? And how is the out-ness
 effected? Very odd.

 Please explain.

 Matthew
Oct 10 2003
prev sibling parent "Walter" <walter digitalmars.com> writes:
The struct *is* passed by reference. It's the name mangling generated by the
compiler that's wrong.

"Matthew Wilson" <matthew stlsoft.org> wrote in message
news:bm7hj0$20pq$1 digitaldaemon.com...
 I have a C function, whose effective signature is:

   void __stdcall Recls_GetSizeProperty(recls_info_t fileInfo,
 recls_filesize_t *size);

 recls_info_t is actually a typedef of a pointer to a structure. Hence, the
 first argument is 4 bytes.
 recls_filesize_t is, in Win32, a FILETIME structure. Hence the second
 argument is 4 bytes.

 In D, I declared it as

 public struct recls_time_t
 {
   uint dwLowDateTime;
   uint dwHighDateTime;
 };

 extern(Windows)
 {
   . . .

   private void  Recls_GetSizeProperty(in recls_info_t fileInfo, out
 recls_filesize_t size);

 However, this fails to link. It cannot find _Recls_GetSizeProperty 12
which
 clearly indicates that the out parameter is by value. If I define it as

 extern(Windows)
 {
   . . .

   private void  Recls_GetSizeProperty(in recls_info_t fileInfo,
 recls_filesize_t *size);

 It links fine.

 This seems more than a little odd. What if the struct is very large?

 In fact, why is an out parameter passed by value? And how is the out-ness
 effected? Very odd.

 Please explain.

 Matthew
Oct 11 2003