Page 1 of 1

[LUA] string.format arguments

Posted: 08 Aug 2017, 06:20
by Gazprom
Hello everyone,
I'm having an hard time parsing a string through string.format.
my string is like:
str = ' "text1","text2","1","2","3" ' (it's a table.concat() result)
and for assigning it to their keys:
local string1, string2, string3, string4, string5 = string.format ( "%s, %s, %c, %c, %c", str)
but it keeps reporting me:
bad argument #3 to 'format' (no value)

Do I have to pass them as %q instead? I have no clues about unfortunately.

Re: [LUA] string.format arguments

Posted: 08 Aug 2017, 10:48
by AxelDominatoR
If I remember correctly string.format is used to put multiple separate variables into a single string. You are trying to do the opposite (split a string into multiple variables) so something like string.match may be more appropriate.
Here's an example you can adapt: ... -variables

Re: [LUA] string.format arguments

Posted: 08 Aug 2017, 23:28
by Alundaio
string.format only returns the formated string you give it as param 1.

printf( string.format ( "%s, %s, %d, %d, %d", str) )

%c is for char byte. You want to continue to use %s if it's just "1" or %d if it's a number 1.

Code: Select all

string.format(s, e1, e2, ...)

s:format(e1, e2, ...)

Create a formatted string from the format and arguments provided. This is similar to the printf("format",...) function in C. An additional option %q puts quotes around a string argument's value.

c, d, E, e, f, g, G, i, o, u, X, and x all expect a number as argument.
q and s expect a string.
> = string.format("%s %q", "Hello", "Lua user!")   -- string and quoted string
Hello "Lua user!"
> = string.format("%c%c%c", 76,117,97)             -- char
> = string.format("%e, %E", math.pi,math.pi)       -- exponent
3.141593e+000, 3.141593E+000
> = string.format("%f, %g", math.pi,math.pi)       -- float and compact float
3.141593, 3.14159
> = string.format("%d, %i, %u", -100,-100,-100)    -- signed, signed, unsigned integer
-100, -100, 4294967196
> = string.format("%o, %x, %X", -100,-100,-100)    -- octal, hex, hex
37777777634, ffffff9c, FFFFFF9C

Re: [LUA] string.format arguments

Posted: 09 Aug 2017, 03:59
by Gazprom
Thanks everyone. In the end I ended up trying every method I could (while reading the Lua manual chapter for some tips :P ), and I found the one suggested by Axel to be working:

local mytext, num = string.gsub(table.concat(mytable), '"', '') --I prepared the string for the parsing
local param1, param2, param3, param4, param5= mymessage:match("([^,]+),([^,]+),([^,]+),([^,]+),(.+)") --used string.match method

@Alundaio: I kept on trying that, but I think that in the end it was my string to be faulty, that's because I passed it on a gsub before splitting it.

As a total beginner it was a pain writing down the regular expression part, so if everyone needs it here it is.

Many thanks to everyone again!

Re: [LUA] string.format arguments

Posted: 09 Aug 2017, 17:51
by Alundaio
If it's in a table and you are concating it to a string, then why are you splitting it back into parts again? If you only want each part, you already have them. Just access each one with mytable[1], mytable[2], mytable[3], etc.

Re: [LUA] OT

Posted: 10 Aug 2017, 03:01
by Gazprom
The table was the one filled by ltn12.sink.table(), and I arranged the response text to be equal as a table indexed content, i.e. "post1","post2","post3" for that exact reason, but retrieving the values through the indexes made the game crash. My bet was that even if written like a table content was still conceived as one single string, and as such only one index.

Big OT: I'm trying to make a loop with delay function, I took inspiration from here:
but nothing seems to work. I've even written a wait function taking inspiration form here:

Code: Select all

function wait(n)
local wait_time = time_global() + (n*1000) --n was in seconds
local tg = time_global()
while tg < wait time do

and made the interior of the function look like:

Code: Select all

function test()
if and level.present() then
while condition == "true" do

But the game won't even load, it stucks itself to the loading screen but without the "map" loading screenshot, and interesting fact, it doesn't crash, it's just stuck there.
Readapting your loop from the GSC site seems not to affect the game at all unfortunately, is there any other way I can do that?

Also, how does the leaderboard system work? I've noticed that there's a engine binded function in one of the PDA scripts, but still haven't figured out how does it works.
SOrry for the really, really big OT :oops:

Re: [LUA] string.format arguments

Posted: 10 Aug 2017, 20:39
by sLoPpYdOtBiGhOlE
For a time delayed function call, maybe try the CreateTimeEvent() function found in _g.script

Works a treat for calling functions on a timed delay and has a very short learning curve to use and is pretty flexible.
(Well I'm a below novice lua scripter and it took a whole of a couple of minutes to get a grasp of how to use it)

Re: [LUA] string.format arguments

Posted: 12 Aug 2017, 16:01
by Gazprom
Thanks, will do!
One thing, it says that for a continuous loop the function must return false. It means the function where CreateTimeEvent is invoked, right?

Re: [LUA] string.format arguments

Posted: 12 Aug 2017, 21:56
by sLoPpYdOtBiGhOlE
Not the function that invokes CreateTimeEvent, but the function that CreateTimeEvent calls.

CreateTimeEvent calls your function repeatedly while it returns false.
Your function stays in the CreateTimeEvent queue until your called function returns true.

Keep in mind that CreateTimeEvent queued events are not saved to file on game save or quit.
So you need to re add your events when your game loads or where ever your event needs to be implemented.