一、原因:

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. 将参数拼接成字符串