一、原因:
stack 保存很小的局部变量,免费使用,但有数量限制(16个变量),包含参数和返回值(including parameters and return parameters)
https://blog.csdn.net/HiBlock/article/details/82763399
二、解决方法: 1. 减少输入参数: a. 以数组的方式传入
原来是
// 设置用户信息
function set_user_info(string user_address, string name, string age) public returns(int) {
TableFactory tf = TableFactory(0x1001);
Table table = tf.openTable("user");
Entry entry = table.newEntry();
entry.set("user_address", user_address);
entry.set("name", name);
entry.set("age", age);
int count = table.insert(name, entry);
}
可修改为
// 设置用户信息
// user_info是一个数组,如["xxxxx", "张三", "20"]
function set_user_info(string[] user_info) public returns(int) {
TableFactory tf = TableFactory(0x1001);
Table table = tf.openTable("user");
Entry entry = table.newEntry();
entry.set("user_address", user_info[0]);
entry.set("name", user_info[1]);
entry.set("age", user_info[2]);
int count = table.insert(user_info[0], entry);
}
这种方法比较适合传入一组数据
b. 可拆成两个小函数// 设置用户信息-姓名
function set_user_info_name(string user_address, string name) public returns(int) {
TableFactory tf = TableFactory(0x1001);
Table table = tf.openTable("user");
Entry entry = table.newEntry();
entry.set("user_address", user_address);
entry.set("name", name);
int count = table.insert(user_address, entry);
return count;
}
// 设置用户信息-年龄
function set_user_info_age(string user_address, string age) public returns(int) {
TableFactory tf = TableFactory(0x1001);
Table table = tf.openTable("user");
Entry entry = table.newEntry();
entry.set("age", age);
Condition condition = table.newCondition();
condition.EQ("user_address", user_address);
int count = table.update(user_address, entry, condition);
return count;
}
这种方法比较适合传入多组数据
2. 减少返回参数: a. 以数组的形式返回
原来
// 得到用户信息
function get_user_info(string user_address) public returns(string name, string age) {
// xxxx
return (name, age);
}
可改为
// 得到用户信息
function get_user_info(string user_address) public returns(string[] user_info) {
// xxxx
user_info['name'] = '张三';
user_info['age'] = 20;
return user_info;
}
3. 将参数拼接成字符串