我正在写一个合同来存储数组中的学生数据。因为我们不能在一个数组中存储不同的数据类型,所以我使用了struct数组。我写了一个setter函数来将数据存储在数组中。但是当我调用这个setter函数时,出现了一个错误。我认为这是因为我试图存储大数据,而它超出了某些限制(可能是)。所以请帮我删除这个错误或建议一个替代方案。
这是setter函数的输入:
"Husnain","Islamabad","0307-6557305",434,"27-10-1997",8,3,"UET"
谢谢
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract studentRecord
{
address owner;
constructor()
{
owner = msg.sender;
}
struct student
{
string Name;
string Address;
string Phone_Num;
uint16 Roll_Num;
string DOB;
uint8 Sem;
uint8 CGPA;
string Uni_Name;
}
student[] public StudentRecord;
function setStudentRecords(string calldata _name, string calldata _address, string calldata _phoneNumber, uint16 _rollNumber,
string calldata _DOB, uint8 _sem, uint8 _CGPA, string calldata _UniName) public
{
uint len = StudentRecord.length;
StudentRecord[len].Name = _name;
StudentRecord[len].Address = _address;
StudentRecord[len].Phone_Num = _phoneNumber;
StudentRecord[len].Roll_Num = _rollNumber;
StudentRecord[len].DOB = _DOB;
StudentRecord[len].Sem = _sem;
StudentRecord[len].CGPA = _CGPA;
StudentRecord[len].Uni_Name = _UniName;
}
function GetStudentRecord(uint index) public view returns(student memory)
{
return StudentRecord[index];
}
function studentCount() public view returns(uint)
{
return StudentRecord.length;
}
}
错误图像显示在这里
您正在尝试分配给超出边界的StudentRecord
的索引。
示例:数组为空,因此StudentRecord.length
为0。但是索引0还不存在,所以不能写入。
解决方案:使用.push()
成员来调整数组的大小并存储新项。
function setStudentRecords(string calldata _name, string calldata _address, string calldata _phoneNumber, uint16 _rollNumber,
string calldata _DOB, uint8 _sem, uint8 _CGPA, string calldata _UniName) public
{
StudentRecord.push( // resize the array and store new item
student( // of type `student`
_name,
_address,
_phoneNumber,
_rollNumber,
_DOB,
_sem,
_CGPA,
_UniName
)
);
}
文档:https://docs.soliditylang.org/en/v0.8.13/types.html数组成员