www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - What is the proper way to handle pointers in variable arguments list?

reply "Tyro[17]" <nospam home.com> writes:
The following fails because the compiler assumes I am trying to 
dereference non-pointer variables. Can this be done?

void main()
{
     int i;
     int* pi;
     double d;
     double* pd;
     char c;
     char* pc;

     scan(i, pi, d, pd, c, pc);
}

void scan(A...)(ref A data)
{
     import std.traits;
     foreach (element; data) {
         if(isPointer!(typeof(element)) && isIntegral!(typeof(*element))) {
             *element = 10;
         }
     }
}

Thanks
Oct 28 2012
parent reply Dmitry Olshansky <dmitry.olsh gmail.com> writes:
On 29-Oct-12 00:36, Tyro[17] wrote:
 The following fails because the compiler assumes I am trying to
 dereference non-pointer variables. Can this be done?

 void main()
 {
      int i;
      int* pi;
      double d;
      double* pd;
      char c;
      char* pc;

      scan(i, pi, d, pd, c, pc);
 }

 void scan(A...)(ref A data)
 {
      import std.traits;
      foreach (element; data) {
          if(isPointer!(typeof(element)) && isIntegral!(typeof(*element))) {
              *element = 10;
          }
      }
 }

 Thanks
Well, first things first: if ---> static if -- Dmitry Olshansky
Oct 28 2012
parent reply "Tyro[17]" <nospam home.com> writes:
On 10/28/12 4:44 PM, Dmitry Olshansky wrote:
 On 29-Oct-12 00:36, Tyro[17] wrote:
 The following fails because the compiler assumes I am trying to
 dereference non-pointer variables. Can this be done?

 void main()
 {
      int i;
      int* pi;
      double d;
      double* pd;
      char c;
      char* pc;

      scan(i, pi, d, pd, c, pc);
 }

 void scan(A...)(ref A data)
 {
      import std.traits;
      foreach (element; data) {
          if(isPointer!(typeof(element)) &&
 isIntegral!(typeof(*element))) {
              *element = 10;
          }
      }
 }

 Thanks
Well, first things first: if ---> static if
Changing it to static allows compilation, however I get the following runtime error: "Segmentation fault: 11" This happens whether I try to read from *element or modify it.
Oct 28 2012
parent reply "Simen Kjaeraas" <simen.kjaras gmail.com> writes:
On 2012-08-28 22:10, Tyro[17] <nospam home.com> wrote:

 On 10/28/12 4:44 PM, Dmitry Olshansky wrote:
 On 29-Oct-12 00:36, Tyro[17] wrote:
 The following fails because the compiler assumes I am trying to
 dereference non-pointer variables. Can this be done?

 void main()
 {
      int i;
      int* pi;
      double d;
      double* pd;
      char c;
      char* pc;

      scan(i, pi, d, pd, c, pc);
 }

 void scan(A...)(ref A data)
 {
      import std.traits;
      foreach (element; data) {
          if(isPointer!(typeof(element)) &&
 isIntegral!(typeof(*element))) {
              *element = 10;
          }
      }
 }

 Thanks
Well, first things first: if ---> static if
Changing it to static allows compilation, however I get the following runtime error: "Segmentation fault: 11" This happens whether I try to read from *element or modify it.
I assume you've actually initialized the pointers to something? Given the above code, all the pointers point to null, and a segfault would be a reasonable reaction. -- Simen
Oct 28 2012
parent "Tyro[17]" <nospam home.com> writes:
On 10/28/12 5:16 PM, Simen Kjaeraas wrote:
 On 2012-08-28 22:10, Tyro[17] <nospam home.com> wrote:

 On 10/28/12 4:44 PM, Dmitry Olshansky wrote:
 On 29-Oct-12 00:36, Tyro[17] wrote:
 The following fails because the compiler assumes I am trying to
 dereference non-pointer variables. Can this be done?

 void main()
 {
      int i;
      int* pi;
      double d;
      double* pd;
      char c;
      char* pc;

      scan(i, pi, d, pd, c, pc);
 }

 void scan(A...)(ref A data)
 {
      import std.traits;
      foreach (element; data) {
          if(isPointer!(typeof(element)) &&
 isIntegral!(typeof(*element))) {
              *element = 10;
          }
      }
 }

 Thanks
Well, first things first: if ---> static if
Changing it to static allows compilation, however I get the following runtime error: "Segmentation fault: 11" This happens whether I try to read from *element or modify it.
I assume you've actually initialized the pointers to something? Given the above code, all the pointers point to null, and a segfault would be a reasonable reaction.
Wow, so obvious yet so obviously overlooked... *banging my head on the monitor* Thanks
Oct 28 2012