referansla nasıl geçebilirim?

Oct 04 2020

Birkaç sorum var.

İlk:

Yani, bir fonksiyonda bellek dizisi oluşturdum. Bu hafızayı başka bir fonksiyona referansla geçirmek istiyorum

function test2() public returns(uint  a) {
        uint[2] memory gio;
        gio[0] = 100;
        gio[1] = 200;
        test3(gio);
        return gio[0];
    }
    
    
    function test3(uint[2] storage arr) private returns (uint) {
        arr[0] = 35;
    }

Bu işe yaramıyor ve diyor ki:

İşlev çağrısındaki bağımsız değişken için geçersiz tür. Uint256 [2] belleğinden uint256 [2] depolama işaretçisine geçersiz örtük dönüştürme istendi. test3 (gio); ^ - ^

Mümkün değil mi?

İkinci

dahili ve özel işlevler, parametreleri referans türleri olarak alabilen tek işlev türüdür, değil mi? çağrılan genel ve harici işlevler başka bir uygulamaya bağımlı olabileceğinden, başka bir uygulama parametreleri referans olarak geçiremez. Kabul ?

Üçüncü .

string test;
   
    function test2() public returns(uint  a) {
        test = " awesome ";
        test3(test);
        return 10;
    }
    
    
    function test3(string storage str) private  {
        str = " changed ";
    }

Arama test2neden sonuçlanır:

TypeError: literal_string türü "değiştirildi", dolaylı olarak beklenen tür dizesi depolama işaretçisine dönüştürülemez. str = "değiştirildi"; ^ --------- ^

Yanıtlar

1 Ismael Oct 04 2020 at 06:43

Bir parametreyi depolama olarak bildirdiğinizde, işlevi yalnızca bu niteleyiciye sahip parametreleri kabul edecek şekilde sınırlamış olursunuz.

Eleme storage, memoryve calldataveri bulunduğu yeri belirtin. Sen örtülü dönüştürebilirsiniz storageiçin memoryve calldatahiç memoryama tersi mümkün değildir.

string public stor = "banana";

function test(string calldata calld) external view {
    string memory memo = "pizza";

    foo(memo, stor);
    foo(calld, stor);  // Creates a copy of calld in memory and passes as parameter
    foo(stor, stor);   // Creates a copy of stor in memory and passes as parameter
    
    foo(memo, stor);
    // foo(memo, memo); // Cannot convert from memory to storage
    // foo(memo, calld); // Cannot convert from calldata to storage
}

function foo(string memory, string storage) internal view {
    
}

/* This fails because you can only use calldata on external functions
function bar(string calldata) internal view {
    
} */

Bool, uintXXX, bytesYY, adres vb. Gibi değer türleri değere göre aktarılır. Yapılar, diziler, dizeler gibi değer olmayan türler başvuruya göre aktarılır.

  • Referansla iletilen türleri kullanan ve kullanabilen public, ancak yalnızca aynı sözleşmeden çağrıldıkları takdirde işlevler .internalprivate

  • Başka bir sözleşmeden düzenli bir kullanıcı tarafından çağrıldığında işlev görür publicve externalbir kopyasını alır.

Neden bilmiyorum ama en azından solc 0.3'ten beri buna izin verilmedi.