Page 1 of 1

ReadLump data is read twice when lumps accumulate

Posted: Sat Dec 01, 2018 7:47 am
by Nash

Code: Select all

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

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

            // split lines
            Array<String> lines;
            data.Split(lines, "\n", TOK_KEEPEMPTY);

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

        //Console.Printf("size: %d", testData.Size());
        for (int i = 0; i < testData.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

Posted: Sat Dec 01, 2018 9: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

Posted: Sat Dec 01, 2018 12: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

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

Re: ReadLump data is read twice when lumps accumulate

Posted: Sat Dec 01, 2018 3: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

Posted: Mon Dec 03, 2018 12: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

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

Re: ReadLump data is read twice when lumps accumulate

Posted: Mon Dec 03, 2018 12: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

Posted: Mon Dec 03, 2018 12: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.

Re: ReadLump data is read twice when lumps accumulate

Posted: Sun Sep 01, 2019 10:56 am
by Gustavo6046
Sorry for the bump, but I was wondering, doesn't declaring an array in a loop and clearing it delete "garbage data", that could actually happen to be useful memory elsewhere, and potentially cause side effects somewhere else in the game?

I mean, for there to be garbage data, the data must exist. I don't know if it's malloc-ing data that has been freed prior to allocating it again from ZScript.

Re: ReadLump data is read twice when lumps accumulate

Posted: Sun Oct 20, 2019 4:02 am
by _mental_
I propose to fix it like this.

Re: ReadLump data is read twice when lumps accumulate

Posted: Sun Oct 20, 2019 4:04 am
by Nash
Heh, I have gotten into the habit of immediately Clear()'ing locally-declared dynamic arrays that I forgot I made this report. :lol: Still, a proper fix would be welcome, of course.

Re: ReadLump data is read twice when lumps accumulate

Posted: Tue Oct 22, 2019 12:37 am
by Matt
Gustavo6046 wrote:Sorry for the bump, but I was wondering, doesn't declaring an array in a loop and clearing it delete "garbage data", that could actually happen to be useful memory elsewhere, and potentially cause side effects somewhere else in the game?

I mean, for there to be garbage data, the data must exist. I don't know if it's malloc-ing data that has been freed prior to allocating it again from ZScript.
This could be what's been causing a lot of crashes for me lately...