Puis-je créer dynamiquement des structures de stockage?

Téléportation de chèvre

Puis-je créer dynamiquement des structures de stockage?


Je veux une fonction qui crée un document dans mon contrat. J’ai supprimé tout ce qui n’était pas nécessaire. Va comme ça:

 contract MyContract { mapping ( uint   =>  document )  documents ; 

   struct  document { address author ; bytes32 hashedContent ; 
   } 

   function  addDocument ( bytes32 docHash )   public { document newDoc =  document ( msg . sender , docHash );   //* 
       [...] 
   } 
 } 

Les documents sont des structures, et je veux les créer à partir d’une fonction, puis ajouter définitivement le à un mappage. J’ai une erreur sur la ligne //* disant:

MyContract.document memory is not implicitly convertible to expected type struct MyContract.document storage pointer. document newDoc = document (docHash,msg.sender); ^---------------------------------------------^

(de Remix) La partie gauche est le stockage mais je pense que la partie gauche est la mémoire.

Est-il possible de faire ce que j’essaie de faire?

  • Si oui, qu’est-ce que j’ai fait de mal?
  • Sinon, connaissez-vous une solution? (Quelqu’un a suggéré que je fasse un contrat distinct pour chaque document, mais cela compliquerait BEAUCOUP tout compte tenu du reste de mon contrat et, de préférence, je recherche une solution dans un seul contrat .

Réponses


 voler

Vous pouvez simplement faire ceci:

 documents [ whateverInt ]   =  document ( msg . sender , docHash ); 

Si vous devez absolument déclarer le document avant de le définir, vous devez le faire:

 document memory newDoc =  document ( msg . sender , docHash ); documents [ whateverInt ]   =   ( doc ); 

Sinon, newDoc sera par défaut un pointeur de stockage, mais le document(msg.sender,docHash) sera une valeur et non un pointeur.

Téléportation de chèvre

Pousser une structure de mémoire dans un mappage de stockage la convertit en stockage?

voler

Dans un sens. Plus précisément, le document (msg.sender, docHash) n’est pas traité comme un pointeur de mémoire ou un pointeur de stockage, c’est une valeur. Si vous affectez la valeur à un pointeur de mémoire, cela fonctionne correctement, mais si vous l’affectez à un pointeur de stockage, cela écrasera dangereusement quelque chose.

Téléportation de chèvre

Cela me donne l’erreur suivante: TypeError: Member "push" not found or not visible after argument-dependent lookup in mapping(uint256 => address)

voler

Oops! Voir mon montage. J’ai répondu comme si vous poussiez vers un tableau, sans utiliser de mappage.

 

#de, créer, des, dynamiquement, Puis-je, stockage, structures

 

yahoo

Laisser un commentaire

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