digitalmars.D.learn - What is the proper way to handle pointers in variable arguments list?
- "Tyro[17]" <nospam home.com> Oct 28 2012
- Dmitry Olshansky <dmitry.olsh gmail.com> Oct 28 2012
- "Tyro[17]" <nospam home.com> Oct 28 2012
- "Tyro[17]" <nospam home.com> Oct 28 2012
- "Simen Kjaeraas" <simen.kjaras gmail.com> Oct 28 2012
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
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
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
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
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









"Tyro[17]" <nospam home.com> 