Thread overview
Templates, interfaces, access violation problem
Just a problem with my C++ mind
Mar 21, 2004
J Anderson
Mar 21, 2004
Matthew
Mar 21, 2004
Matthew
Mar 22, 2004
Phill
Mar 22, 2004
Phill
March 21, 2004
Having a little problem here with the code below. It compiles all right, but when run it gives me the descriptive error message of "Error: Access Violation". What am I doing wrong?

template StreamInterfaces(T)
{
	interface ReadableStreamInterface
	{
		void read(out T[] buffer, in uint number);
		void sync();
	}
}

template MemoryStream(T)
{
	class MemoryStream : StreamInterfaces!(T).ReadableStreamInterface
	{
		void read(out T[] buffer, in uint number)
		{
			printf("read\n");
		}

		void sync()
		{
			printf("sync\n");
		}
	}
}

int main()
{
	alias MemoryStream!(ubyte) MemoryUByteStream;
	MemoryUByteStream testStream;
	testStream.sync();
	
	ubyte[] buffer;
	testStream.read(buffer, 100);
	
	return 0;
}

Cheers,
Sigbjørn Lund Olsen
March 21, 2004
Fllrb! Obviously, I am still living the the C++ dreamscape where an object is automatically constructed when declared. Adding "= new MemoryUByteStream" fixed it.

Is there any reason why one has to explicitly 'new' an object?

Cheers,
Sigbjørn Lund Olsen
March 21, 2004
Sigbjørn Lund Olsen wrote:

> Fllrb! Obviously, I am still living the the C++ dreamscape where an object is automatically constructed when declared. Adding "= new MemoryUByteStream" fixed it.
>
> Is there any reason why one has to explicitly 'new' an object? 

Yes and no.

Objects in D are pointers to objects not objects themselves, therefore its pretty close to C++ (because u have to use new there as well, except D is one symbol shorter).   Whenever u use new, think gc.  I think it may be easier to parse as well.

Of course the syntax could have been simplified (and this has been discussed before).  If you really want the C++ behaviour then it would be the auto version of object creation that you'd want to simplify.

auto object o = new object;

to

auto object o;

That was discussed before.

-- 
-Anderson: http://badmama.com.au/~anderson/
March 21, 2004
"J Anderson" <REMOVEanderson@badmama.com.au> wrote in message news:c3jpf3$rus$1@digitaldaemon.com...
> Sigbjørn Lund Olsen wrote:
>
> > Fllrb! Obviously, I am still living the the C++ dreamscape where an object is automatically constructed when declared. Adding "= new MemoryUByteStream" fixed it.
> >
> > Is there any reason why one has to explicitly 'new' an object?
>
> Yes and no.
>
> Objects in D are pointers to objects not objects themselves, therefore its pretty close to C++ (because u have to use new there as well, except D is one symbol shorter).   Whenever u use new, think gc.  I think it may be easier to parse as well.
>
> Of course the syntax could have been simplified (and this has been discussed before).  If you really want the C++ behaviour then it would be the auto version of object creation that you'd want to simplify.
>
> auto object o = new object;
>
> to
>
> auto object o;

This should be done. The auto qualifier prevents it from being ambiguous (to compiler or human) and it removes the quite confusing new'ing of an object that's automatic.




March 21, 2004
J Anderson wrote:

> Sigbjørn Lund Olsen wrote:
> 
>> Fllrb! Obviously, I am still living the the C++ dreamscape where an object is automatically constructed when declared. Adding "= new MemoryUByteStream" fixed it.
>>
>> Is there any reason why one has to explicitly 'new' an object? 
> 
> 
> Yes and no.
> 
> Objects in D are pointers to objects not objects themselves, therefore its pretty close to C++ (because u have to use new there as well, except D is one symbol shorter).   Whenever u use new, think gc.  I think it may be easier to parse as well.
> 
> Of course the syntax could have been simplified (and this has been discussed before).  If you really want the C++ behaviour then it would be the auto version of object creation that you'd want to simplify.
> 
> auto object o = new object;
> 
> to
> 
> auto object o;
> 
> That was discussed before.

Mmhm. Remember what the thread was named (just out of curiousity)? I'm not too fussed about wanting C++ behaviour just for the sake of it - there are too many who'd like D to me an amalgamation of languages Foo, Bar, Doodad, Fwabble, Q--, Visual Perl# Duper Duper etc. Actually explicitly writing 'new object' isn't going to be a problem, for me at least, as long as I remember to do it.

My principal worry is that I'm going to make hordes of bugs while my mind adjusts (and afterwards too?). Error messages, really. I had no idea what was going on for quite a while there, or where it was. Presumably it wouldn't be hard for the compiler to see that 'oh, here's a fool trying to do something to an object that hasn't been constructed - let's throw a compilation error at her' instead of leaving it untill runtime, with as giving a message as "Access Violation, and I'm not going to give you fools a line number, module name, function name, nothing to help you along. So long, and see you next time." (paraphrase)

Cheers,
Sigbjørn Lund Olsen
March 21, 2004
"Sigbjørn Lund Olsen" <sigbjorn@lundolsen.net> wrote in message news:c3jqj9$ti2$1@digitaldaemon.com...
> J Anderson wrote:
>
> > Sigbjørn Lund Olsen wrote:
> >
> >> Fllrb! Obviously, I am still living the the C++ dreamscape where an object is automatically constructed when declared. Adding "= new MemoryUByteStream" fixed it.
> >>
> >> Is there any reason why one has to explicitly 'new' an object?
> >
> >
> > Yes and no.
> >
> > Objects in D are pointers to objects not objects themselves, therefore its pretty close to C++ (because u have to use new there as well, except D is one symbol shorter).   Whenever u use new, think gc.  I think it may be easier to parse as well.
> >
> > Of course the syntax could have been simplified (and this has been discussed before).  If you really want the C++ behaviour then it would be the auto version of object creation that you'd want to simplify.
> >
> > auto object o = new object;
> >
> > to
> >
> > auto object o;
> >
> > That was discussed before.
>
> Mmhm. Remember what the thread was named (just out of curiousity)? I'm not too fussed about wanting C++ behaviour just for the sake of it - there are too many who'd like D to me an amalgamation of languages Foo, Bar, Doodad, Fwabble, Q--, Visual Perl# Duper Duper etc. Actually explicitly writing 'new object' isn't going to be a problem, for me at least, as long as I remember to do it.

It's appropriate to have to write new when you're constructing a heap based object, but it's a dose of cognitive dissonance to have to do it when the object is auto. We don't have to new structs, do we?

> My principal worry is that I'm going to make hordes of bugs while my mind adjusts (and afterwards too?). Error messages, really. I had no idea what was going on for quite a while there, or where it was. Presumably it wouldn't be hard for the compiler to see that 'oh, here's a fool trying to do something to an object that hasn't been constructed - let's throw a compilation error at her' instead of leaving it untill runtime, with as giving a message as "Access Violation, and I'm not going to give you fools a line number, module name, function name, nothing to help you along. So long, and see you next time." (paraphrase)

The assertion messages are Sh, and need addressing asap. I think there's not much debate on that point, and hopefully Walter'll deal with that just as soon as he's done the whole list of new libraries I just sent him. ;-)




March 22, 2004
"Sigbjørn Lund Olsen" <sigbjorn@lundolsen.net> wrote in message news:c3jqj9$ti2$1@digitaldaemon.com...
> J Anderson wrote:
>
> > Sigbjørn Lund Olsen wrote:
> >
> >> Fllrb! Obviously, I am still living the the C++ dreamscape where an object is automatically constructed when declared. Adding "= new MemoryUByteStream" fixed it.
> >>
> >> Is there any reason why one has to explicitly 'new' an object?
> >
> >
> > Yes and no.
> >
> > Objects in D are pointers to objects not objects themselves, therefore its pretty close to C++ (because u have to use new there as well, except D is one symbol shorter).   Whenever u use new, think gc.  I think it may be easier to parse as well.
> >
> > Of course the syntax could have been simplified (and this has been discussed before).  If you really want the C++ behaviour then it would be the auto version of object creation that you'd want to simplify.
> >
> > auto object o = new object;
> >
> > to
> >
> > auto object o;
> >
> > That was discussed before.
>
> Mmhm. Remember what the thread was named (just out of curiousity)? I'm not too fussed about wanting C++ behaviour just for the sake of it - there are too many who'd like D to me an amalgamation of languages Foo, Bar, Doodad, Fwabble, Q--, Visual Perl# Duper Duper etc. Actually explicitly writing 'new object' isn't going to be a problem, for me at least, as long as I remember to do it.
>
> My principal worry is that I'm going to make hordes of bugs while my mind adjusts (and afterwards too?). Error messages, really. I had no idea what was going on for quite a while there, or where it was. Presumably it wouldn't be hard for the compiler to see that 'oh, here's a fool trying to do something to an object that hasn't been constructed - let's throw a compilation error at her'

Does this mean that you are the first DWoman
on the NG?

Phill.


March 22, 2004
Phill wrote:

> "Sigbjørn Lund Olsen" <sigbjorn@lundolsen.net> wrote in message
> news:c3jqj9$ti2$1@digitaldaemon.com...
> 
>>J Anderson wrote:
>>
>>
>>>Sigbjørn Lund Olsen wrote:
>>>
>>>
>>>>Fllrb! Obviously, I am still living the the C++ dreamscape where an
>>>>object is automatically constructed when declared. Adding "= new
>>>>MemoryUByteStream" fixed it.
>>>>
>>>>Is there any reason why one has to explicitly 'new' an object?
>>>
>>>
>>>Yes and no.
>>>
>>>Objects in D are pointers to objects not objects themselves, therefore
>>>its pretty close to C++ (because u have to use new there as well, except
>>>D is one symbol shorter).   Whenever u use new, think gc.  I think it
>>>may be easier to parse as well.
>>>
>>>Of course the syntax could have been simplified (and this has been
>>>discussed before).  If you really want the C++ behaviour then it would
>>>be the auto version of object creation that you'd want to simplify.
>>>
>>>auto object o = new object;
>>>
>>>to
>>>
>>>auto object o;
>>>
>>>That was discussed before.
>>
>>Mmhm. Remember what the thread was named (just out of curiousity)? I'm
>>not too fussed about wanting C++ behaviour just for the sake of it -
>>there are too many who'd like D to me an amalgamation of languages Foo,
>>Bar, Doodad, Fwabble, Q--, Visual Perl# Duper Duper etc. Actually
>>explicitly writing 'new object' isn't going to be a problem, for me at
>>least, as long as I remember to do it.
>>
>>My principal worry is that I'm going to make hordes of bugs while my
>>mind adjusts (and afterwards too?). Error messages, really. I had no
>>idea what was going on for quite a while there, or where it was.
>>Presumably it wouldn't be hard for the compiler to see that 'oh, here's
>>a fool trying to do something to an object that hasn't been constructed
>>- let's throw a compilation error at her'
> 
> 
> Does this mean that you are the first DWoman
> on the NG?

No, it means I like writing 'she' where everyone else (it seems) likes writing 'him', because it catches people off guard and tends to make them think a little bit. Which can't possibly be a bad thing :-)

Cheers,
Sigbjørn Lund Olsen
March 22, 2004
fair enough :o))


"Sigbjørn Lund Olsen" <sigbjorn@lundolsen.net> wrote in message news:c3m9ct$1rn5$1@digitaldaemon.com...
> Phill wrote:
>
> > "Sigbjørn Lund Olsen" <sigbjorn@lundolsen.net> wrote in message news:c3jqj9$ti2$1@digitaldaemon.com...
> >
> >>J Anderson wrote:
> >>
> >>
> >>>Sigbjørn Lund Olsen wrote:
> >>>
> >>>
> >>>>Fllrb! Obviously, I am still living the the C++ dreamscape where an object is automatically constructed when declared. Adding "= new MemoryUByteStream" fixed it.
> >>>>
> >>>>Is there any reason why one has to explicitly 'new' an object?
> >>>
> >>>
> >>>Yes and no.
> >>>
> >>>Objects in D are pointers to objects not objects themselves, therefore its pretty close to C++ (because u have to use new there as well,
except
> >>>D is one symbol shorter).   Whenever u use new, think gc.  I think it may be easier to parse as well.
> >>>
> >>>Of course the syntax could have been simplified (and this has been discussed before).  If you really want the C++ behaviour then it would be the auto version of object creation that you'd want to simplify.
> >>>
> >>>auto object o = new object;
> >>>
> >>>to
> >>>
> >>>auto object o;
> >>>
> >>>That was discussed before.
> >>
> >>Mmhm. Remember what the thread was named (just out of curiousity)? I'm not too fussed about wanting C++ behaviour just for the sake of it - there are too many who'd like D to me an amalgamation of languages Foo, Bar, Doodad, Fwabble, Q--, Visual Perl# Duper Duper etc. Actually explicitly writing 'new object' isn't going to be a problem, for me at least, as long as I remember to do it.
> >>
> >>My principal worry is that I'm going to make hordes of bugs while my mind adjusts (and afterwards too?). Error messages, really. I had no idea what was going on for quite a while there, or where it was. Presumably it wouldn't be hard for the compiler to see that 'oh, here's a fool trying to do something to an object that hasn't been constructed - let's throw a compilation error at her'
> >
> >
> > Does this mean that you are the first DWoman
> > on the NG?
>
> No, it means I like writing 'she' where everyone else (it seems) likes writing 'him', because it catches people off guard and tends to make them think a little bit. Which can't possibly be a bad thing :-)
>
> Cheers,
> Sigbjørn Lund Olsen