传递vector指针并循环修改值时遇赋值错误求助
问题分析与解决方案
核心错误点
const修饰导致无法修改vector内容
原函数changeResourceValue的参数是const vector<asset>* resources,const修饰意味着指向的vector是只读的,循环中auto &resource实际是const asset&,无法执行resource = resource + value的赋值操作,这就是报错的直接原因。EOSIO表数据修改逻辑错误
直接修改itr->resources是无效的,EOSIO的表迭代器itr指向的是数据的只读副本,必须通过player.modify的lambda表达式来修改表内数据,否则修改不会持久化,还可能引发未定义行为。参数类型不匹配与冗余指针
调用changeResourceValue时传递的是vector对象,但函数期望指针,虽然可以通过取地址&itr->resources适配,但使用引用比指针更安全简洁,避免指针操作的潜在问题。
修正后的代码
ACTION test::addto(name player){ auto itr = player.require_find(wallet.value, USER_NOT_FOUND(wallet)); asset value1 = asset(100, ACTION_SYMBOL); asset value2 = asset(100, FOOD_SYMBOL); // 在modify lambda中安全修改表数据 player.modify(itr, _self, [&](auto& p) { changeResourceValue(p.resources, value1); changeResourceValue(p.resources, value2); }); } // 使用非const引用直接操作原vector void changeResourceValue(vector<asset>& resources, asset value){ for (auto &resource : resources){ if(resource.symbol == value.symbol){ resource = resource + value; } } }
关键说明
- 去掉
const修饰并改用引用参数,让函数可以直接修改传入的vector内容。 - 将修改逻辑移至
player.modify的lambda中,符合EOSIO的表数据更新规范,确保修改能正确持久化到链上。 - for循环中的
auto &resource是普通引用,允许对vector内的元素进行赋值操作,解决了原有的赋值报错问题。
内容的提问来源于stack exchange,提问作者Icaro
相关产品推荐
相关产品推荐

