Typfehlerspeicher wird nicht in Strukturspeicher umgewandelt

pragma solidity ^0.4.17;


contract hoteltranscation  {

  struct hotel{
    string HotelName;
    uint256 BookingNumber;
  }

   function HotelBooking(string _HotelName,uint256 _BookingNumber ) public   {
     hotel storage addtrascation =  hotel (_HotelName,_BookingNumber);
   }
}

Ich habe eine Struktur als öffentliche Variable deklariert und möchte sie als Speichervariable in einer Funktion verwenden

2) Ich erhalte die folgende Fehlermeldung

':12:6: TypeError: Type struct hoteltranscation.hotel memory is not implicitly convertible to expected type struct hoteltranscation.hotel storage pointer.\n     hotel storage addtrascation =  hotel (_HotelName,_BookingNumber);\

3) Ich möchte die Zustandsvariablen als Speichervariablen machen und einige Daten speichern

. Ich habe die Frage aktualisiert, ich möchte eine Variablenreferenz erstellen, um die Variable innerhalb der Funktion anzugeben, um den Gasverbrauch zu reduzieren

Antworten (1)

Wenn Sie im Dunkeln tappen, was Sie hier zu tun versuchen, können Sie Ihre Frage gerne aktualisieren, und ich kann meine Antwort entweder entfernen oder aktualisieren.

Es sieht so aus, als ob Sie die Werte einer Struktur eingeben hotelund diese dann irgendwo dauerhaft speichern möchten, möglicherweise in einer Reihe von Hotelbuchungen.

Das kannst du so machen:

pragma solidity ^0.4.17;

contract hoteltranscation  {

    struct hotel{
        string HotelName;
        uint256 BookingNumber;
    }

    hotel[] HotelBookings;

    function HotelBooking(string _HotelName, uint256 _BookingNumber) public   {
        HotelBookings.push(hotel (_HotelName, _BookingNumber));
    }

    function GetHotelBooking(uint _num) public view returns(string, uint256) {
        return (HotelBookings[_num].HotelName, HotelBookings[_num].BookingNumber);
    }
}

Hier muss man nicht zu schick werden. Wenn Sie aus irgendeinem Grund eine temporäre Variable verwenden müssen, bevor Sie in das globale Array pushen, wäre dies eine perfekte Verwendung einer Speichervariablen:

pragma solidity ^0.4.17;

contract hoteltranscation  {

    struct hotel{
        string HotelName;
        uint256 BookingNumber;
    }

    hotel[] HotelBookings;

    function HotelBooking(string _HotelName, uint256 _BookingNumber) public   {

        hotel memory tempHotel = hotel (_HotelName, _BookingNumber);
        // Do some logic
        HotelBookings.push(tempHotel);
    }

    function GetHotelBooking(uint _num) public view returns(string, uint256) {
        return (HotelBookings[_num].HotelName, HotelBookings[_num].BookingNumber);
    }
}

Hilft das?

Danke bedeutet, dass wir beim Speichern mit Daten von struct Array oder Mapping verwenden, ist es richtig
Das müssen Sie nicht. Sie können auch nur einen einzelnen Wert ( hotel SingleHotelBooking;) speichern, aber es ist wahrscheinlich sinnvoll, ihn in den "Vertragskontext" zu stellen, damit er im Vertrag gespeichert und von anderen Funktionen aus zugänglich ist. Vielleicht lesen Sie dies für weitere Details zum Schlüsselwort memoryand storage.
Hier ist ein relevantes Zitat aus dem Artikel:storage cannot be newly created in a function. Any storage referenced variable in a function always refers a piece of data pre-allocated on the contract storage (state variable). Any mutation persists after function call.
Tut mir leid, dass ich Sie störe. Aber sollten wir das Namens-Array und die Struktur mit demselben Namen verpflichten, hat es einen Link?
Entschuldigung, ich habe Ihre Frage nicht ganz verstanden, aber die Benennung von Variablen, Strukturen und Arrays sind alle unabhängig voneinander. Sie müssen nur konsistent sein.
Danke, ich habe es bekommen hotel [] HotelBookings anstelle des Variablentyps neben dem Array, das Sie den Namen der Struktur genannt haben, damit der Typ struct ist, oder?