digitalmars.D.learn - Access Violation: Maybe it's my fault?
- Federico"lox" Lucignano (222/222) Apr 16 2005 Hi guys,
- Manfred Nowak (7/9) Apr 16 2005 [...]
- Andrew Fedoniouk (46/55) Apr 17 2005 I am getting constantly after exit:
- Federico "lox" Lucignano (7/15) Apr 17 2005 Ok, maybe it's linker's fault :-P Let's say I don't like OPTLINK inabili...
Hi guys,
I was doing some experiments in D and while experimenting a wrote down this
little xml generator, but when i launch the resulting executable it gives
"Error: Access Violation" at the end of execution (it seems just after return 0
in main() function).
Still I don't know the language very well so I don't know if I'm doing something
wrong, can someone help me?
Thnx in advance.
/*
small XML test (compile with the -debug compiler option)
Author: Federico "Lox" Lucignano (federico alchimiedigitali.net)
Homepage:
Started: Sat, 16 April 2005 12.37.45 GMT
Last Update: Sat, 16 April 2005 12.50.45 GMT
*/
debug import std.stdio;
debug import std.string;
debug import std.process;
debug import std.perf;
debug import std.file;
extern (C)
{
struct Attribute
{
char[] name;
char[] value;
Node* owner;
char[] toString()
{
return name ~ "=\"" ~ value ~ "\"";
}
void dispose()
{
owner = null;
delete name;
name = null;
delete value;
value = null;
return;
}
}
struct Node
{
Attribute*[] attributes;
Node*[] childNodes;
Node* parent;
char[] name;
char[] value;
uint depth()
{
Node* current = parent;
uint result = 0;
while(!(current is null))
{
result++;
current = current.parent;
}
return result;
}
bit appendAttribute(Attribute* a)
{
try
{
a.owner = this;
attributes.length = attributes.length + 1;
attributes[length - 1] = a;
}
catch(Error e)
{
return false;
}
return true;
}
bit appendChild(Node* n)
{
try
{
n.parent = this;
childNodes.length = childNodes.length + 1;
childNodes[length - 1] = n;
}
catch(Error e)
{
return false;
}
return true;
}
char[] print()
{
char[] indentation;
char[] result;
for(uint x = 0; x < depth; x++)
{
indentation ~= "\t";
}
result ~= indentation;
result ~= "<" ~ name;
foreach(Attribute* a; attributes)
{
result ~= " ";
result ~= a.toString();
}
result ~= ">\n";
foreach(Node* n; childNodes)
{
result ~= n.print();
result ~= "\n";
}
if(value.length > 0)
result ~= indentation ~ "\t" ~ value ~ "\n";
result ~= indentation;
result ~= "</" ~ name ~ ">";
return result;
}
void dispose()
{
foreach(Attribute* a; attributes)
{
a.dispose();
delete a;
}
attributes.length = 0;
attributes = null;
foreach(Node* n; childNodes)
{
n.dispose();
delete n;
}
childNodes.length = 0;
childNodes = null;
parent = null;
delete name;
name = null;
delete value;
value = null;
return;
}
}
}
debug
{
int main(char[][] args)
{
uint nodeCount = 0;
uint attCount = 0;
writefln("Generating tree");
PerformanceCounter chrono = new PerformanceCounter();
chrono.start();
Node* n = new Node;
nodeCount++;
n.name = "root";
for(uint x = 0; x < 4; x++)
{
Attribute* a = new Attribute;
a.name = "att" ~ toString(x);
a.value = "val";
n.appendAttribute(a);
a = null;
attCount++;
}
for(uint x = 0; x < 100; x++)
{
Node* nn = new Node;
nn.name = "cNode";
nn.value = "nodeValue";
for(uint y = 0; y < 4; y++)
{
Attribute* a = new Attribute;
a.name = "att" ~ toString(y);
a.value = "val";
nn.appendAttribute(a);
a = null;
attCount++;
}
for(uint y = 0; y < 100; y++)
{
Node* nnn = new Node;
nnn.name = "ccNode";
nnn.value = "Prova prova prova prova prova prova prova prova prova prova prova
prova prova prova";
for(uint z = 0; z < 4; z++)
{
Attribute* a = new Attribute;
a.name = "att" ~ toString(z);
a.value = "val";
nnn.appendAttribute(a);
a = null;
attCount++;
}
nn.appendChild(nnn);
nnn = null;
nodeCount++;
}
n.appendChild(nn);
nn = null;
nodeCount++;
}
chrono.stop();
float nodesPerSec = (cast(float)nodeCount / chrono.microseconds) * 1000000.00;
float attsPerSec = (cast(float)attCount / chrono.microseconds) * 1000000.00;
float entitiesPerSec = (cast(float)nodeCount / chrono.microseconds) *
1000000.00;
float millisecs = cast(float)chrono.microseconds / 1000.00;
float kb = cast(float)n.print().length / 1024.00;
float kbs = (kb / chrono.microseconds) * 1000000.00;
writefln("\nGenerated:");
writefln("\n\t- %d nodes in %f milliseconds (%f nodes/s)", nodeCount, millisecs,
nodesPerSec);
writefln("\n\t- %d attributes in %f milliseconds (%f attributes/s)", attCount,
millisecs, attsPerSec);
writefln("\n\t- %d total entities in %f milliseconds (%f entities/s)", nodeCount
+ attCount, millisecs, nodesPerSec + attsPerSec);
writefln("\n\t- %f Kbytes in %f milliseconds (%f Kb/s)", kb, millisecs, kbs);
writefln("\nWriting result on disk.");
std.file.write("C:\\result.xml", n.print());
n.dispose();
delete n;
delete chrono;
system("PAUSE");
return 0;
}
}
Apr 16 2005
Federico"lox" Lucignano <Federico"lox"_member pathlink.com> wrote: [...]it gives "Error: Access Violation" at the end of execution (it seems just after return 0 in main() function).[...] Not confirmed. Runs fine on Win32-dmd 0.121. -manfred
Apr 16 2005
I am getting constantly after exit: Unhandled exception in xxx.exe(NTDLL.DLL): 0xC0000008: Invalid Handle. while debugging in VS any D app with GUI. Even in standard HelloWorld from D distribution. Exception happens after return from WinMain: 7C90EB38 nop 7C90EB39 nop 7C90EB3A nop 7C90EB3B nop 7C90EB3C nop 7C90EB3D push ebp 7C90EB3E mov ebp,esp 7C90EB40 sub esp,50h 7C90EB43 mov dword ptr [esp+0Ch],eax 7C90EB47 mov eax,fs:[00000018] 7C90EB4D mov eax,dword ptr [eax+1A4h] 7C90EB53 mov dword ptr [esp],eax 7C90EB56 mov dword ptr [esp+4],0 7C90EB5E mov dword ptr [esp+8],0 7C90EB66 mov dword ptr [esp+10h],0 7C90EB6E push esp 7C90EB6F call 7C90EBAC 7C90EB74 mov eax,dword ptr [esp] <<<<<<<<<< exception is here <<<<<<<<<<<<< 7C90EB77 mov esp,ebp 7C90EB79 pop ebp 7C90EB7A ret 7C90EB7B nop ---------- this function is involved too ------------ 7C90EB7C lea esp,[esp] 7C90EB83 lea ecx,[ecx] 7C90EB86 nop 7C90EB87 nop 7C90EB88 nop 7C90EB89 nop 7C90EB8A nop 7C90EB8B mov edx,esp 7C90EB8D sysenter 7C90EB8F nop 7C90EB90 nop 7C90EB91 nop 7C90EB92 nop 7C90EB93 nop 7C90EB94 ret Andrew. "Manfred Nowak" <svv1999 hotmail.com> wrote in message news:d3rt62$adn$1 digitaldaemon.com...Federico"lox" Lucignano <Federico"lox"_member pathlink.com> wrote: [...]it gives "Error: Access Violation" at the end of execution (it seems just after return 0 in main() function).[...] Not confirmed. Runs fine on Win32-dmd 0.121. -manfred
Apr 17 2005
In article <d3rt62$adn$1 digitaldaemon.com>, Manfred Nowak says...Federico"lox" Lucignano <Federico"lox"_member pathlink.com> wrote: [...]Ok, maybe it's linker's fault :-P Let's say I don't like OPTLINK inability to link against Platform SDK .libs, so I've found a Watcom Linker modified version for DMD that works great with any type of .libs, maybe the error is a consequence of this? "When Rome will Fall Then the World"it gives "Error: Access Violation" at the end of execution (it seems just after return 0 in main() function).[...] Not confirmed. Runs fine on Win32-dmd 0.121. -manfred
Apr 17 2005









"Andrew Fedoniouk" <news terrainformatica.com> 