À quoi sert la variable «maxlength» dans cette fonction?

CrééAMadman

À quoi sert la variable «maxlength» dans cette fonction?


J’essaie de comprendre la fonction « appendUintToString » de Solidity concaténer uint dans une chaîne? La fonction est recréée ci-dessous. Pour l’instant, j’essaie de comprendre ce que fait l’entier « maxlength ».

  function appendUintToString(string inStr, uint v) constant returns (string str) { uint maxlength = 100; bytes memory reversed = new bytes(maxlength); uint i = 0; while (v != 0) { uint remainder = v % 10; v = v / 10; reversed[i++] = byte(48 + remainder); } bytes memory inStrb = bytes(inStr); bytes memory s = new bytes(inStrb.length + i); uint j; for (j = 0; j < inStrb.length; j++) { s[j] = inStrb[j]; } for (j = 0; j < i; j++) { s[j + inStrb.length] = reversed[i - 1 - j]; } str = string(s); } 

Lorsque je l’isole dans Remix avec le code suivant, le getter pour « reverse » renvoie un slot 0 vide, mais les nombres dans le slot correspondent à l’entier maxlength. Ainsi, lorsque maxlength = 20, returnBytes renvoie 0x0000000000000000000000000000000000000000, et si maxlength = 2, il renvoie 0x0000, etc.

Cela suggère que l’entier maxlength fournit une limite pour le nombre d’octets pouvant être représentés par « inversé ». Pourtant, lorsque je mets « inversé » avec la fonction changeBytes, il ne semble pas y avoir de limite. Si maxlength = 2, par exemple, cela me permettra d’en saisir trois ou plus dans cette fonction et la fonction getter en retournera alors trois ou plus (cela ne coupe pas le surplus). Alors, quel est le point de maxvalue?

 uint public maxlength = 20; bytes reversed = new bytes(maxlength); function changeBytes(bytes _bytes) public { reversed = _bytes; } function returnBytes() public view returns(bytes) { return reversed; } 

Réponses


 smarx

Dans votre version du code, vous maxlength simplement reversed , donc tout maxlength fait maxlength est de définir la durée de l’ reversed avant d’appeler changeBytes .

Dans la fonction que vous référencez, la valeur reversed correspond à la maxlength octets et n’est jamais remplacée. (Des octets individuels sont définis, mais le tableau est celui défini en haut.)

CrééAMadman

Je suis encore un peu flou. Si « inversé » n’est pas écrasé dans la fonction, ne serait-ce pas simplement une valeur vide? Et s’il peut être écrasé avec un nombre arbitraire d’octets, il ne force aucune limite? Que fait réellement la ligne « nouveaux octets (longueur maximale) » pour « inversée »?

smarx

Comme je l’ai dit, des octets individuels sont définis. bytes memory reversed = new bytes(100) crée un tableau d’octets de 100 éléments. Ensuite, vous pouvez faire des choses comme reversed[0] = 1 pour stocker un 1 dans le premier octet, etc.

CrééAMadman

Ah ok. Je savais que « octets » était un tableau, mais je n’avais pas encore réalisé que vous pouvez faire appel à des octets individuels avec des numéros d’index comme vous le pouvez dans d’autres tableaux – au lieu de simplement réécrire le tout à la fois.


 AnAllergyToAnalogy

C’est le nombre maximum de chiffres qu’il attend de l’entier. Étant donné que vous devez initialiser le tableau d’octets avec la longueur, vous devez le spécifier à l’avance.

Mais en réalité, la valeur maximale d’un uint est de 115792089237316195423570985008687907853269984665640564039457584007913129639935, qui ne comporte que 78 chiffres. Vous devriez donc probablement régler maxLength à 78 et vous économiser du gaz.

CrééAMadman

Ah oui, j’ai voté pour le commentaire sur le post original parce que j’étais aussi curieux à ce sujet. Merçi pour la confirmation.

CrééAMadman

En fait, je suis un peu flou à ce sujet. Il s’agit du plus grand entier de 256 bits ou 32 octets. La longueur maximale ne doit-elle pas être 32 car elle se rapporte aux octets?

AnAllergyToAnalogy

Non, parce que nous ne parlons pas d’octets ou de bits (c’est-à-dire de la façon dont ils sont stockés), nous parlons du nombre de chiffres réels qu’il contient lorsqu’il est représenté sous la forme d’un nombre en base 10 (c’est ainsi que les gens lisent généralement les nombres).

 

«maxlength», #à, #la, cette, dans, fonction, quoi, sert?, variable

 

yahoo

Laisser un commentaire

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