Память ошибки типа не преобразуется в хранилище структур

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);
   }
}

Я объявил структуру общедоступной переменной и хочу использовать ее как переменную хранения внутри функции.

2) Я получаю следующую ошибку

':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) Я хочу сделать переменные состояния переменными хранения и хранить некоторые данные

. я обновил вопрос, я хочу создать ссылку на переменную, чтобы указать переменную внутри функции, чтобы уменьшить потребление газа

Ответы (1)

Пытаясь разобраться в том, что вы пытаетесь здесь сделать, не стесняйтесь обновлять свой вопрос, и я могу либо удалить свой ответ, либо обновить его.

Похоже, вы хотите ввести значения структуры hotel, а затем сохранить их где-нибудь на постоянной основе, например, в массиве бронирований отелей.

Вы можете сделать это следующим образом:

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);
    }
}

Здесь не нужно слишком заморачиваться. Если по какой-то причине вам нужно использовать временную переменную перед отправкой в ​​глобальный массив, это было бы идеальным использованием переменной памяти:

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);
    }
}

Это помогает?

Спасибо. Значит, при хранении с данными структуры мы используем массив или сопоставление, правильно ли это
Вам не нужно. Вы также можете сохранить только одно значение ( hotel SingleHotelBooking;), но, вероятно, имеет смысл поместить его в «контекст контракта», чтобы оно сохранялось в контракте и было доступно из других функций. Возможно, прочитайте это для получения более подробной информации о ключевом слове memoryand storage.
Вот соответствующая цитата из статьи: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.
Извините, что беспокою вас. Но должны ли мы использовать массив имен и структуру с одинаковым именем, есть ли у него какая-либо ссылка
Извините, я не совсем понял ваш вопрос, но имена переменных, структур и массивов не зависят друг от друга. Они просто должны быть последовательными.
Спасибо, я получил это hotel[] HotelBookings вместо типа переменной рядом с массивом, вы упомянули имя структуры, поэтому тип будет структурой, верно?