¿Ejemplos de limitaciones de funciones?

Codifiqué diferentes funciones y no encontré un estándar que defina claramente cuántas variables puede usar (¿campos, locales o como parámetros de modificadores dentro de esta función?

¿Conoces una hoja de trucos con estas limitaciones?

¡Gracias!

Respuestas (1)

No conozco ninguna hoja de trucos y el problema es que Solidity verifica el tamaño de la pila local en varios lugares diferentes durante una llamada de función, pero emite el mismo mensaje de error, por lo que, dependiendo de cómo combine los argumentos de la función, las variables declaradas dentro del bloque de funciones. y valores devueltos, el mensaje de error "Apilar demasiado, intente eliminar las variables locales" a veces aparece y otras veces no. p.ej:

      f (uint a, uint b, uint c, uint d, string e, string f, string g, string h) 
returns (uint, uint, uint, uint, string, string, string, string) { 

        return (a,b,c,d,e,f,g,h);
        }

funciona, pero:

      f (uint a, uint b, uint c, uint d, string e, string f, string g) 
returns (uint, uint, uint, uint, string, string, string, string, string) { 

        return (a,b,c,d,e,f,g,g,g);
    }

produce: "CompilerError: pila demasiado profunda, intente eliminar las variables locales".

(En el segundo, eliminé un argumento de función de tipo cadena y lo agregué a los valores de retorno).

Incluso si (por alguna razón) asume que un valor de retorno del tipo 'memoria de cadena' ocupa dos ranuras de almacenamiento, el primer ejemplo tampoco debería haber funcionado (8 parámetros de entrada + 4 valores de retorno de una sola ranura + 4 valores de retorno de doble ranura valores = 20 ranuras de pila). Entonces, creo que hay algo de trabajo por hacer en Solidity, ¿quizás?

Pero en general, por lo que he leído:

  • Todos los argumentos de función toman una ranura
  • Cualquier otra variable declarada dentro de la función o devuelta por la función ocupa un espacio si está en la memoria y dos espacios si es una referencia de almacenamiento.

Juntos, no pueden tener más de 16.

Como mencioné antes, parece haber casos extremos como el anterior, pero esto generalmente funciona. Sé que esto no responde claramente a su pregunta, ¡pero espero que alguien más pueda aclarar más!

EDITAR: suponiendo que esté hablando de variables locales aquí, las variables en el almacenamiento no tienen estas limitaciones, ya que el motivo de un máximo de 16 variables locales es un tamaño máximo de pila de 1024 ranuras, nada que ver con las variables de estado.