Impossible de pousser la structure qui contient un tableau de structures vers un tableau

Cornwell

Impossible de pousser la structure qui contient un tableau de structures vers un tableau


Je suis conscient qu’il existe certaines limitations à l’initialisation des tableaux vides, mais je ne trouve pas de solution à ce problème que je rencontre.

Je veux pousser une structure vers un tableau. Mais puisque cette structure elle-même contient un tableau d’autres structures, je ne peux pas le faire.

Voici mon code:

 pragma solidity ^ 0.4 . 23 ; pragma experimental ABIEncoderV2 ; contract simpleBet { 

     struct   Bettor   { address wallet ; 
         uint  betAmount ; 
         uint  outcome ; 
         uint  bettingTime ; 
     } 

     struct  bettingEvent { 
         string  name ; 
         string  uid ; 
         uint  startTime ; 
         uint  endTime ; 
         Bettor []  bettors ; 
     } bettingEvent []   public  bettingEvents ; 

     constructor ()   public   { 
     } 


     function  createBettingEvent ( string  _name ,   string  _uid ,   uint  _startTime ,   uint  _endTime )   public   { bettingEvent memory _bettingEvent ; _bettingEvent . name =  _name ; _bettingEvent . uid =  _uid ; _bettingEvent . startTime =  _startTime ; _bettingEvent . endTime =  _endTime ; _bettingEvent . bettors . push ( Bettor ( 0 , 0 , 0 , 0 )); bettingEvents . push ( _bettingEvent ); 
     } 

 } 

TypeError: Le membre « push » n’est pas disponible dans la mémoire de la structure simpleBet.Bettor [] en dehors du stockage.

Réponses


 smarx

Le problème est que vous ne pouvez pas push vers des tableaux situés en mémoire. (Ces tableaux ne sont pas redimensionnables.)

Une solution possible consiste à simplement effectuer les modifications dans le stockage:

 function  createBettingEvent ( string  _name ,   string  _uid ,   uint  _startTime ,   uint  _endTime )   public   { bettingEvents . length +=   1 ; bettingEvent storage _bettingEvent =  bettingEvents [ bettingEvents . length -   1 ]; _bettingEvent . name =  _name ; _bettingEvent . uid =  _uid ; _bettingEvent . startTime =  _startTime ; _bettingEvent . endTime =  _endTime ; _bettingEvent . bettors . push ( Bettor ( 0 ,   0 ,   0 ,   0 )); 
 } 

Cornwell

Merci. J’ai essayé cela, mais j’obtiens toujours l’erreur: UnimplementedFeatureError: Copying of type struct simpleBet.Bettor memory[] memory to storage not yet supported.

smarx

Je ne reçois pas cette erreur sur Remix. Pouvez-vous mettre à jour la question avec le dernier code source complet afin que je puisse essayer de reproduire l’erreur?

smarx

Oh, désolé, je vois cette erreur dans la sortie du compilateur; Remix n’a tout simplement pas fait surface dans l’interface utilisateur de l’éditeur pour une raison quelconque. Jeter un oeil.

smarx

Modifié avec du code de travail. Il y a sûrement une façon plus propre de le faire, mais cela fonctionne.

smarx

Heureux que vous appréciez Capture l’éther. 🙂 Ouais, je me demande si une mapping pourrait être meilleure. Les mappages et les tableaux sont remarquablement similaires. Voir la section « File d’attente » de programtheblockchain.com/posts/2018/03/23/… pour un endroit où j’ai utilisé un mapping au lieu d’un tableau.

 

#de, #la, contient, impossible, pousser, qui, structure, structures, Tableau, un, vers

 

yahoo

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *