Page 1 of 1

ReadLump data is read twice when lumps accumulate

PostPosted: Sat Dec 01, 2018 8:47 am
by Nash
Code: Select allExpand view

    void ReadTestLump
(void)
    {
        
testData.Clear();

        
int lump = -1;
        while (-
!= (lump Wads.FindLump('TESTLUMP'lump 1)))
        {
            
String data Wads.ReadLump(lump);

            
// split lines
            
Array<Stringlines;
            
data.Split(lines"\n"TOK_KEEPEMPTY);

            
// strip comments
            
for (int i 0lines.Size(); i++)
            {
                if (
lines[i].IndexOf("//") == 0)
                {
                    continue;
                }
                else
                {
                    
testData.Push(lines[i]);
                }
            }
        }

        
//Console.Printf("size: %d", testData.Size());
        
for (int i 0testData.Size(); i++)
        {
            
// delete that weird character that gets added at the end
            
testData[i].Truncate(testData[i].Length() - 1);

            if (
testData[i])
            {
                
Console.Printf("%s\n"testData[i]);
            }
        }
    }
 


Load ReadLump.pk3 and ReadLump Mod.pk3, in that order. If a second TestLump.txt is added into your load order, the data contents from the first lump be listed twice. Why does this happen?

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Sat Dec 01, 2018 10:40 am
by phantombeta
Somewhat user error, actually. Caused by an insane, non-sensical, ill-advised, terrible decision in the ZScript compiler.
Function-local variables are never initialized at all. The VM's registers are, but that only happens once, so any variables defined after anything that isn't a variable definition will contain garbage data. And this extends to dynamic arrays.

TL;DR User error caused by a terrible design decision in the ZScript compiler. Always clear your dynamic arrays.

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Sat Dec 01, 2018 1:48 pm
by Graf Zahl
This here is actually a real bug. Arrays get initialized at function init, but obviously require a Clear when being declared within a loop.

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Sat Dec 01, 2018 3:35 pm
by Nash
Should this thread be moved to Bugs, then?

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Sat Dec 01, 2018 4:23 pm
by Graf Zahl
Sure. But you can also fix it on your side by clearing the array right after the declaration.

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Mon Dec 03, 2018 1:30 pm
by Ozymandias81
Could be this issue related to this one? Since I load BoA as resource folder from GZDBuilder under GZDoom, there are gzdoom related pk3s loading before BoA...

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Mon Dec 03, 2018 1:38 pm
by Graf Zahl
Are you using ZScript arrays?

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Mon Dec 03, 2018 1:42 pm
by Ozymandias81
I am not the one who is coding with zscript since I am not familiar with it, but yes we are using it

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Mon Dec 03, 2018 1:49 pm
by Graf Zahl
Then check if you define an array inside a for or while loop. That is the only condition which can trigger this.