ReadLump data is read twice when lumps accumulate

Forum rules
Please don't bump threads here if you have a problem - it will often be forgotten about if you do. Instead, make a new thread here.

Post a reply

Smilies
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :geek: :ugeek: :!: :?: :idea: :arrow: :| :mrgreen: :3: :wub: >:( :blergh:
View more smilies

BBCode is OFF
Smilies are ON

Topic review
   

Expand view Topic review: ReadLump data is read twice when lumps accumulate

Re: ReadLump data is read twice when lumps accumulate

by Matt » Tue Oct 22, 2019 12:37 am

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...

Re: ReadLump data is read twice when lumps accumulate

by Nash » Sun Oct 20, 2019 4:04 am

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

by _mental_ » Sun Oct 20, 2019 4:02 am

I propose to fix it like this.

Re: ReadLump data is read twice when lumps accumulate

by Gustavo6046 » Sun Sep 01, 2019 10:56 am

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

by Graf Zahl » Mon Dec 03, 2018 12:49 pm

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

by Ozymandias81 » Mon Dec 03, 2018 12:42 pm

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

by Graf Zahl » Mon Dec 03, 2018 12:38 pm

Are you using ZScript arrays?

Re: ReadLump data is read twice when lumps accumulate

by Ozymandias81 » Mon Dec 03, 2018 12:30 pm

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

by Graf Zahl » Sat Dec 01, 2018 3:23 pm

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

by Nash » Sat Dec 01, 2018 2:35 pm

Should this thread be moved to Bugs, then?

Re: ReadLump data is read twice when lumps accumulate

by Graf Zahl » Sat Dec 01, 2018 12:48 pm

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

by phantombeta » Sat Dec 01, 2018 9:40 am

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.

ReadLump data is read twice when lumps accumulate

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

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?
Attachments
ReadLump Mod.pk3
(221 Bytes) Downloaded 135 times
ReadLump.pk3
(1.13 KiB) Downloaded 107 times

Top