www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - strange problem with typeinfo (...) in functions from other files

reply clayasaurus <clayasaurus_member pathlink.com> writes:
Hello all. I've made a global logging system that makes use of streams and
TypeInfo (...).

I'm also using multiple files for my projects. 

In the file that I declare main(), my logger works perfectly as expected. I just
call gLog.info("Whatever I want ", 4, "me"); and I look in the .log file and it 
is in there just fine. 

However, when I call gLog.info from other files that don't have main in them, I
get a segmentation fault. 

The reason I'm blaming the typeinfo _arguments and _argptr stuff is that, even
when I comment out the functionality of my log.info(...) function, i still get
segmentation faults. 

Also, when I replace log.info(...) with log.info(char[] message), it works just
fine. The program doesn't crash. 

So, is there something about (...) that I don't know about and causes it to
crash? thx.
Jul 18 2004
parent reply clayasaurus <clayasaurus_member pathlink.com> writes:
oh yes. I forgot to add that I'm using linux with the latest dmd (.95). 

My Log is a struct, and I declare the global within the the log module. So all i
have to do is import log; 
Jul 18 2004
next sibling parent clayasaurus <clayasaurus_member pathlink.com> writes:
trying to fix the problem, I made a function called 

char[] arguments(...), which takes a set of arguments and returns them as a
char[], and passed this into my log function like

log.info(arguments("my cool ", 7, " args"))


it works within the file that holds main(), but in other files it causes a
segmentation fault. 
Jul 18 2004
prev sibling parent clayasaurus <clayasaurus_member pathlink.com> writes:
heres some simple example code that illustrates the problem.

i use the compile line 'dmd main.d argufile.d'

//////////// main.d //////////////////////////////////////////
import argufile;

int main(char [][] args)
{
char[] message = arguments("bob is ", 7, " years old");

writefln(message); // it works here

argufile.useargs(); // will crash here

return 0;  
}

// argufile.d //////////////////////////////////////////////////

import std.stdio;
import std.format;
import std.utf;

dchar[] formatstring(TypeInfo[] arguments, void *argptr) 
{
dchar[] message = null; 

void putc(dchar c)
{
message ~= c; 
}

std.format.doFormat(&putc, arguments, argptr);

return message; 
}

char[] arguments(...) // turns a bunch of arguments into a formatted char[]
string
{
return toUTF8(formatstring(_arguments, _argptr));
}

void useargs()
{
// crashes on this line
char[] crashage = arguments("why is 8 scared of 7? because", 7,8,9); 

writefln(crashage);
}
Jul 18 2004