You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传递vector指针并循环修改值时遇赋值错误求助

问题分析与解决方案

核心错误点

  1. const修饰导致无法修改vector内容
    原函数changeResourceValue的参数是const vector<asset>* resources,const修饰意味着指向的vector是只读的,循环中auto &resource实际是const asset&,无法执行resource = resource + value的赋值操作,这就是报错的直接原因。

  2. EOSIO表数据修改逻辑错误
    直接修改itr->resources是无效的,EOSIO的表迭代器itr指向的是数据的只读副本,必须通过player.modify的lambda表达式来修改表内数据,否则修改不会持久化,还可能引发未定义行为。

  3. 参数类型不匹配与冗余指针
    调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:31:05