[lua] Tabellen uit lua naar array in C

Pagina: 1
Acties:

  • Blaurens
  • Registratie: Mei 2002
  • Laatst online: 29-04 01:15
Ik doe verwoedde pogingen om een array/table uit een luascript in C te krijgen. Mijn C-testcode ziet er zo uit:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
#include "lua.h"

lua_State *L;

int main(int argc, char *argv[])
{
  L = lua_open();
  lua_dofile(L,"test.lua");
  lua_getglobal(L,"mytable");
  if (!lua_istable(L,1)) printf("No Table.\n");
  else 
      {
      lua_rawgeti(L,1,2);
      if (lua_isnumber(L,-1))
              {
              printf("Found a number: ");
              printf("%i\n",lua_tonumber(L,-1));
              }
      else
              {
              printf("Found a %s\n",lua_typename(L,lua_type(L,-1)));
              }
      }
  lua_close(L);
  system("pause");
  return 0;
}


test.lua ziet er zo uit:

Lua:
1
2
mytable={1,2,3}
mycooltable = {{1,2,3},{4,5,6},{7,8,9}}


mycooltable is voor later zorg, allereerst probeer ik mytable uit te lezen. Persoonlijk verwachtte ik na het runnen van het c-file dat er "Found a number: 2" op mijn scherm zou verschijnen, maar helaas, er verschijnt "Found a number: 0".

Helaas is google in deze mijn vriend niet: ik heb geen werkende oplossing kunnen vinden, en ook in het lua-mailinglistarchief kon ik niets bruikbaars vinden. De meeste resultaten gaan over oude lua-versies, of stippen mijn probleem niet aan.

Wie helpt?

  • 0528973
  • Registratie: Juni 2003
  • Laatst online: 15-05-2013
Ik ken lua niet, maar ik denk dat dit gebeurt:
je C-programmatje leest de tabel in, en gebruikt het eerste getal in de tabel van jou. En dan print jij ipv het getal de index van het eerste getal in de tabel?

Pascal


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 27-05 23:27

Creepy

Tactical Espionage Splatterer

Waarom niet een GetTable gebruiken als je de table hebt gevonden, zodat de entry's van de table op de stack worden gezet?

Hmm.. het is alweer even geleden dat ik echt flink met LUA aan het stoeien geweest ben, maar ik ben al bezig geweest om tables heen en weer te gooien tussen Lua en C. Als je ff geduld hebt, dan geef ik vanavond een nog wat zinnerige reply ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Blaurens
  • Registratie: Mei 2002
  • Laatst online: 29-04 01:15
Creepy schreef op 07 januari 2004 @ 11:28:
Waarom niet een GetTable gebruiken als je de table hebt gevonden, zodat de entry's van de table op de stack worden gezet?
Geprobeert met het volgende:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
#include "lua.h"

lua_State *L;

int main(int argc, char *argv[])
{
  L = lua_open();
  lua_dofile(L,"test.lua");
  lua_getglobal(L,"mytable");
  if (!lua_istable(L,1)) printf("No Table.\n");
  else 
      {
      lua_gettable(L,1);
      if (lua_isnumber(L,-1))
              {
              printf("Found a number: ");
              printf("%i\n",lua_tonumber(L,-1));
              }
      else
              {
              printf("Found a %s\n",lua_typename(L,lua_type(L,-1)));
              }
      }
  lua_close(L);
  system("pause");
  return 0;
}


maar dat geeft "Found a nil", dus da's ook niet helemaal wat ik wil.
Hmm.. het is alweer even geleden dat ik echt flink met LUA aan het stoeien geweest ben, maar ik ben al bezig geweest om tables heen en weer te gooien tussen Lua en C. Als je ff geduld hebt, dan geef ik vanavond een nog wat zinnerige reply ;)
Ik wacht vol spanning af...

En 0528973, bij mijn weten is dat niet wat er gebeurd.

  • Blaurens
  • Registratie: Mei 2002
  • Laatst online: 29-04 01:15
ARG, probleem gevonden.

C:
19
              printf("%i\n",lua_tonumber(L,-1));


uit de eerste C voorbeeld, moest zijn

C:
19
              printf("%i\n",(int)lua_tonumber(L,-1));


Bestaan dus meerdere varianten van lua_tonumber(), en zonder specificatie krijg je dus 0 terug, maar met (int) gaat het prima naar int :)

Maar, ik ben nogsteeds erg benieuwd naar de effientste manier om eea naar C te krijgen, dus hoop dat Creepy toch nog even wil kijken :)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 27-05 23:27

Creepy

Tactical Espionage Splatterer

Blaurens schreef op 07 januari 2004 @ 14:29:
Bestaan dus meerdere varianten van lua_tonumber(), en zonder specificatie krijg je dus 0 terug, maar met (int) gaat het prima naar int :)

Maar, ik ben nogsteeds erg benieuwd naar de effientste manier om eea naar C te krijgen, dus hoop dat Creepy toch nog even wil kijken :)
Gisteren ben ik niet meer thuis geweest dus heb ff m'n lua code niet bij de hand gehad. Je bent in elk geval van je rawget af, die je in dit soort gevallen niet nodig hebt. Lua_tonumber geeft standaard altijd een double terug. (Lua_number is default een float). Dit moet je dus inderdaad terugcasten naar een int.

[ Voor 5% gewijzigd door Creepy op 08-01-2004 08:42 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Blaurens
  • Registratie: Mei 2002
  • Laatst online: 29-04 01:15
Creepy schreef op 08 januari 2004 @ 08:41:
[...]

Gisteren ben ik niet meer thuis geweest dus heb ff m'n lua code niet bij de hand gehad. Je bent in elk geval van je rawget af, die je in dit soort gevallen niet nodig hebt.
Eh, neehoor, heb het eerste voorbeeld aangepast, niet het tweede. Zal ik morgen nog even doen, maar werkt nu prima met multi-dimensinale array met getraw. Wat zou daar het nadeel van zijn?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 27-05 23:27

Creepy

Tactical Espionage Splatterer

Zolang je niet bezig gaat met meta tables en meta methods helemaal niks :)

In lua kan je een meta table aanmaken. Met deze meta table kan je specifieren wat er onder speciale condities moet gebeuren als je één van de entry's in een normale table op een bepaalde manier benaderd. Hiermee kan je bijv. echte OO en Operator Overloading simuleren. Als je op een normale manier de table benadert wordt hiermee netjes rekening gehouden. Op het moment dat je rawget e.d. gaat gebruiken dan wordt er geen rekening gehouden met de meta table.

Standaard regel: zolang je geen meta tables e.d. gebruikt heb je geen rawget e.d. nodig.

Zie ook de officiele reference manual: http://www.lua.org/manual/5.0/

[ Voor 12% gewijzigd door Creepy op 09-01-2004 12:23 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1