Tengo un contrato que está haciendo un cálculo bastante complejo con algunos cálculos intermedios, y me encuentro con el problema de "pila demasiado profunda".
Intenté usar una matriz de memoria dentro de la función para guardar "variables locales" temporales en lugar de crear nuevas variables locales.
Por ejemplo, en lugar de:
function usingLocalVars() {
// Get 3 uint values from a getter function call from another contract
// and save as local variables uint a, uint b, uint c:
var(a, b, c) = otherContract.getter(param);
// Perform some computation an a, b, and c and save as another variable d
uint d = someOperation(a, b, c);
/** other code with a return **/
}
Reescrito usando matriz de memoria:
function usingMemoryArray() {
// Get 3 uint values from a getter function call from another contract
// and store into memory array temp:
// create memory array
uint[4] memory temp;
// save values into memory array
(temp[0], temp[1], temp[2]) = otherContract.getter(param);
// Perform some computation an a, b, and c and save into temp[3]
temp[3] = someOperation(temp[0], temp[1], temp[2]);
/** other code with a return **/
}
Entonces, lo que he intentado hacer:
returns (uint x, uint y, uint z)
=>returns (uint, uint, uint)
Resumen de la función actual:
int
variable localsomeOperation()
) arriba. ¿Sería esto potencialmente otra causa de este problema? ¿ Necesita limitar el var local utilizado en otras llamadas a métodos (por ejemplo, someOperation()
)?¿El uso de una matriz de memoria como mencioné anteriormente realmente ayuda con este problema (la pila es demasiado profunda)?
Entonces mis asignaciones de variables temporales estaban causando el problema. Funciona si se limita a 8 asignaciones a la vez:
Esto falla (9 asignaciones de variables):
(temp[0], temp[1], temp[2], temp[3], temp[4], temp[5], temp[6], temp[7], temp[8]) = (1, 2, 3, 4, 5, 6, 7, 8, 9);
Pero esto funciona (8 asignaciones a la vez ):
(temp[0], temp[1], temp[2], temp[3], temp[4], temp[5], temp[6], temp[7]) = (1, 2, 3, 4, 5, 6, 7, 8);
(temp[8], temp[9], temp[10], temp[11], temp[12], temp[13], temp[14], temp[15]) = (9, 10, 11, 12, 13, 14, 15, 16);
Y también, el uso de la matriz de memoria evita el problema de la pila demasiado profunda de las variables locales .
Tal vez haya intentado esto, pero algunas depuraciones en Remix con funciones vacías getter()
y someOperation()
que solo devuelven valores muestran que la profundidad máxima de la pila alcanza los 12 elementos cuando uso el primer método, pero solo 9 para el segundo. Todavía tengo que entender completamente las diferencias, pero considere usar remix y verificar la pantalla de depuración para ayudar si aún no lo ha hecho.
usuario19510
carlom
usuario19510
usuario19510
carlom