File[string] associative array & initialization of static member
Vidar Wahlberg
canidae at exent.net
Sun Feb 12 12:21:04 PST 2012
Take a look at the following input:
naushika:~/tmp> cat foo.d
import std.stdio;
File[string] files;
void main() {
files["test"] = File("test", "w");
files["test"].writefln("meh: %s", "heh");
}
naushika:~/tmp> dmd foo.d
Internal error: ../ztc/cgcs.c 162
naushika:~/tmp> dmd foo.d -O
naushika:~/tmp> ./foo
object.Exception at std/stdio.d(1131): Enforcement failed
----------------
./foo(pure @safe bool std.exception.enforce!(bool, "std/stdio.d",
1131).enforce(bool, lazy const(char)[])+0x45) [0x45711d]
./foo(std.stdio.File.LockingTextWriter
std.stdio.File.LockingTextWriter.__ctor(ref std.stdio.File)+0x38) [0x4564ac]
./foo(@property std.stdio.File.LockingTextWriter
std.stdio.File.lockingTextWriter()+0x29) [0x4565d9]
./foo(void std.stdio.File.writefln!(immutable(char)[],
immutable(char)[]).writefln(immutable(char)[], immutable(char)[])+0x44)
[0x44816c]
./foo(_Dmain+0x10f) [0x44811b]
./foo(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x17)
[0x452e1f]
./foo(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void
delegate())+0x2a) [0x4529c6]
./foo(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x42)
[0x452e72]
./foo(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void
delegate())+0x2a) [0x4529c6]
./foo(main+0xd3) [0x452957]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xfd) [0x7fbe6cb5cead]
----------------
My first question would be: Why do I get an internal error when I try to
compile this code without optimization flag? I'm using "DMD64 D Compiler
v2.057".
Then the second question would be:
I'm writing a simple module for logging, it's going to write to some few
files over a longer duration and my idea was to keep a reference to the
handler instead of calling the constructor of File all the time.
Apparently the way I've tried above was not the right way to do it, any
suggestions would be most welcome.
And finally a question about initialization of static members:
Why can't you write "static Foo foo = new Foo();"?
Instead you'll have to create a static constructor that pretty much does
the same thing, just using more lines:
static Foo foo;
static this() {
foo = new Foo();
}
Is it not possible for the compiler to do this for me?
More information about the Digitalmars-d-learn
mailing list