Lua: funzioni con input una variabile di tipo struttura

  • Creatore
    Topic
  • #59630
    Up
    0
    Down
    ::


    Ciao,
    ho una domanda che riguarda Lua.

    Sto scrivendo una funzione alla quale vorrei assegnare come variabile di entrata una struttura, chiamiamola STRUTT, la quale sono sicuro che avrà una tabella di vome VERTEX, cioé ad esempio:

    `CICCIA = {VERTEX = {{ 1, 2, 3},
    { 4, 5, 6},
    { 7, 8, 9},
    {10,11,12}}}`

    e vorrei che la funzione sia del tipo:

    ` function FUNZIONE(STRUTT)

    m = table.getn(STRUTT.VERTEX)
    n = table.getn(STRUTT.VERTEX[1])

    for i=1,m do
    for j=1,n do
    STRUTT.VERTEX[j] = 2*STRUTT.VERTEX[j]+1 — Esempio di elaborazione della tabella
    end
    end

    return STRUTT
    end`

    Soltanto che quando faccio

    ` \directlua{
    cubo = FUNZIONE(cubo)
    }`

    mi dà il seguente errore:

    `! LuaTeX error <\directlua >:1: attempt to index local 'STRUTT' (a nil value)
    stack traceback:
    <\directlua >:1: in function 'FUNZIONE'
    <\directlua >:1: in main chunk.`

    Qualcuno sa dirmi come passare ad una funzione Lua una variabile struttura?

    Grazie

    Michele

Visualizzazione 5 filoni di risposte
  • Autore
    Risposte
    • #59631
      robitex
      Amministratore del forum
        Up
        0
        Down
        ::

        Ciao,
        ho una domanda che riguarda Lua.

        Sto scrivendo una funzione alla quale vorrei assegnare come variabile di entrata una struttura, chiamiamola STRUTT, la quale sono sicuro che avrà una tabella di vome VERTEX, cioé ad esempio:

        `CICCIA = {VERTEX = {{ 1, 2, 3},
        { 4, 5, 6},
        { 7, 8, 9},
        {10,11,12}}}`

        e vorrei che la funzione sia del tipo:

        ` function FUNZIONE(STRUTT)

        m = table.getn(STRUTT.VERTEX)
        n = table.getn(STRUTT.VERTEX[1])

        for i=1,m do
        for j=1,n do
        STRUTT.VERTEX[j] = 2*STRUTT.VERTEX[j]+1 — Esempio di elaborazione della tabella
        end
        end

        return STRUTT
        end`

        Soltanto che quando faccio

        ` \directlua{
        cubo = FUNZIONE(cubo)
        }`

        mi dà il seguente errore:

        `! LuaTeX error <\directlua >:1: attempt to index local 'STRUTT' (a nil value)
        stack traceback:
        <\directlua >:1: in function 'FUNZIONE'
        <\directlua >:1: in main chunk.`

        Qualcuno sa dirmi come passare ad una funzione Lua una variabile struttura?

        Grazie

        Michele

        Se chiami funzione(cubo) quando cubo non è ancora definito passi ad essa un valore nil…

        Non confondere il nome del parametro nella definizione della funzione con le variabili che usi per rappresentarne il valore di ritorno.

        Ti faccio notare che getn() è un metodo deprecato. Per trovare la lunghezza della tabella usa l’operatore # .

        Inoltre la (unica) struttura dati tabella, in Lua è molto potente e flessibile ma cerca di tenere il loro uso il più semplice possibile.
        R.

      • #59632
        Up
        0
        Down
        ::


        Grazie Robitex, era un errore cretino che non mi sono accorto di fare……

        Ti faccio notare che getn() è un metodo deprecato. Per trovare la lunghezza della tabella usa l’operatore # .

        Per quanto rigurda getn(), lo uso perché se uso # mi trovo con questo errore:
        `! LuaTeX error <\directlua >:1: attempt to get length of a number value
        stack traceback:
        <\directlua >:1: in function 'ProjectionOfPointOnObserverSystem'
        <\directlua >:1: in main chunk.`

        Saluti

        Michele

      • #59633
        robitex
        Amministratore del forum
          Up
          0
          Down
          ::

          Grazie Robitex, era un errore cretino che non mi sono accorto di fare……

          Ti faccio notare che getn() è un metodo deprecato. Per trovare la lunghezza della tabella usa l’operatore # .

          Per quanto rigurda getn(), lo uso perché se uso # mi trovo con questo errore:
          `! LuaTeX error <\directlua >:1: attempt to get length of a number value
          stack traceback:
          <\directlua >:1: in function 'ProjectionOfPointOnObserverSystem'
          <\directlua >:1: in main chunk.`

          Saluti

          Michele

          Evidentemente chiami # su una variabile di tipo numerico e non su una tabella.
          La tabella “ciccia” contiene un solo elemento ma con chiave non di numero intero.
          Quell’elemento è una tabella (usata come dizionario chiave – valore) che contiene quattro elementi, ciascuno dei quali è una tabella (usata come array) che contiene tre numeri.

          Quindi:
          `print(#CICCIA) 0
          print(#CICCIA.VERTEX) 4
          print(#CICCIA.VERTEX[1]) 3`

          Bye

        • #59634
          Up
          0
          Down
          ::


          Probabilmente mi perdo qualcosa….

          Se compilo questo esempio minimo:
          `
          % !TEX program = LuaLaTeX
          \documentclass{report}
          \begin{document}
          \directlua{
          A = {vertex = {{1,2,3},
          {1,2,3},
          {1,2,3},
          {1,2,3},
          {1,2,3}}}

          tex.print(#A)
          tex.print(#A.vertex)
          tex.print(#A.vertex[1])
          }
          \end{document}`

          ottengo il seguente errore:
          `! LuaTeX error <\directlua >:1: attempt to get length of a number value
          stack traceback:
          <\directlua >:1: in main chunk.`

          Scrivo qualcosa di sbagliato?

        • #59635
          robitex
          Amministratore del forum
            Up
            0
            Down
            ::

            Probabilmente mi perdo qualcosa….

            Se compilo questo esempio minimo:
            `
            % !TEX program = LuaLaTeX
            \documentclass{report}
            \begin{document}
            \directlua{
            A = {vertex = {{1,2,3},
            {1,2,3},
            {1,2,3},
            {1,2,3},
            {1,2,3}}}

            tex.print(#A)
            tex.print(#A.vertex)
            tex.print(#A.vertex[1])
            }
            \end{document}`

            ottengo il seguente errore:
            `! LuaTeX error <\directlua >:1: attempt to get length of a number value
            stack traceback:
            <\directlua >:1: in main chunk.`

            Scrivo qualcosa di sbagliato?

            Niente di grave, è solo che in LuaTeX il codice viene prima “visto” da TeX ed i simboli # in TeX sono riservati per definire gli argomenti. Una semplice soluzione è quella di premettere il comando \string per evitare che TeX lo veda come carattere particolare:
            `
            % !TEX program = LuaLaTeX
            \documentclass{report}
            \begin{document}
            \directlua{
            A = {vertex = {{1,2,3},
            {1,2,3},
            {1,2,3},
            {1,2,3},
            {1,2,3}}}

            tex.print(\string#A)
            tex.print(\string#A.vertex)
            tex.print(\string#A.vertex[1])
            }
            \end{document}`

            Nel pacchetto luacode sono indicate le varie modalità per gestire i caratteri speciali dei due linguaggi (per esempio il simbolo di % che in Lua serve per costruire stringhe di formato).
            Scusami, non mi ero accorto che compilavi con LuaLaTeX.

            Alla prossima.
            Ciao

          • #59636
            Up
            0
            Down
            ::

            Scusami, non mi ero accorto che compilavi con LuaLaTeX.

            Ma figurati!!!

            Grazie a te per le risposte!!!

            Michele

        Visualizzazione 5 filoni di risposte
        • Devi essere connesso per rispondere a questo topic.

        Go to top