Ich habe einen solchen Vertrag erstellt und möchte Daten unter der jeweiligen ID im Array speichern und diese Daten abrufen, indem ich diese ID eingebe, wie wir:
ID: 73, Antwort: Ihr Name
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;
contract MyContract {
struct Student {
string Answers;
}
mapping(uint256 => Student) public students;
Student[] public student;
function getStudentMarks(uint256 _id) public view returns (string memory Answers,
address sender )
{
Student storage s = students[_id];
return ( s.Answers, msg.sender);
}
function addMarks(uint256 Id, string memory Ans) public {
Student = students[Id];
Student.Answers = Ans;
student.push(Id) -1;
}
}
aber ich bekomme diese Fehler:
und wie kann ich diese Funktionen von Reactjs aus aufrufen, kann mir jemand helfen, damit es funktioniert, und ich verwende Truffle, Ganache und React Js, aber diese Fehler stammen von Remix IDE, weil ich versuche, es zuerst und dann mit Remix zum Laufen zu bringen zu meinem lokalen Projekt wechseln. Danke
In der Funktion:
function addMarks(uint256 Id, string memory Ans) public {
Student = students[Id];
Student.Answers = Ans;
student.push(Id) -1;
}
Sie erstellen eine Variable Student
und weisen ihr einen Wert vom Typ zu Student
. Dies ist nicht möglich und Solidität wird verwechselt. Die Variable kann nicht den gleichen Namen wie ein Typ haben, also ändern Sie diesen Variablennamen in student
. Es wäre auch eine gute Praxis, Answers
in Ihrer Student
Struktur auch Kleinbuchstaben zu schreiben.
Auch deine Zeile student.push(Id) - 1;
macht nicht viel Sinn. array.push()
gibt eine neue Länge des Arrays zurück und Sie subtrahieren 1 davon, speichern das aber nie in einer Variablen, sodass Sie diese Subtraktion sicher löschen können.
Bearbeiten: Auch wenn ich mir Ihren Code genauer ansehe, würde ich ihn wie folgt umschreiben, da eine Zuordnung und ein Array in Ihrem Fall nicht erforderlich sind
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;
contract MyContract {
struct Student {
string answers;
}
mapping(uint256 => Student) public students;
function getStudentMarks(uint256 _id) public view returns (string memory Answers,
address sender )
{
return ( students[_id].answers, msg.sender);
}
function addMarks(uint256 _id, string memory _ans) public {
Student memory student = students[_id];
student.answers = _ans;
students[_id] = student;
}
}
Edit2: Um eine Liste von Schülernoten abzufragen, könnten Sie Folgendes tun:
function getStudentsMarks(uint256[] memory _ids) public view returns (string[] memory answers, address _sender) {
string[] memory answers = new string[](_ids.length);
for (uint256 i; i < _ids.length; i++) {
answers[i] = students[i].answers;
}
return (answers, msg.sender);
}
Bearbeiten 4: Dies ist wahrscheinlich etwas, das Sie benötigen, um es etwas komplexer zu machen, um die Möglichkeit zu behalten, vorhandene Benutzer zu bearbeiten und die von Ihnen benötigte ID zuzuweisen.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Students {
struct Student {
string answers;
}
mapping(uint256 => Student) public students;
mapping(uint256 => uint256) public mappingIdToStudentId;
uint256 public numberOfStudents;
function getStudentMarks(uint256 _id) public view returns (string memory Answers,
address sender )
{
return ( students[_id].answers, msg.sender);
}
function getStudentsMarks() public view returns (uint256[] memory ids, string[] memory answers, address _sender) {
uint256[] memory ids = new uint256[](numberOfStudents);
string[] memory answers = new string[](numberOfStudents);
for (uint256 i; i < numberOfStudents; i++) {
ids[i] = mappingIdToStudentId[i];
answers[i] = students[mappingIdToStudentId[i]].answers;
}
return (ids, answers, msg.sender);
}
function addMarks(uint256 _id, string memory _ans) public {
require(bytes(_ans).length > 0, "Cannot save empty answer");
Student memory student = students[_id];
if(bytes(student.answers).length == 0) {
mappingIdToStudentId[numberOfStudents] = _id;
numberOfStudents = numberOfStudents + 1;
}
student.answers = _ans;
students[_id] = student;
}
}
Manpreet Singh Bhullar
Manpreet Singh Bhullar
Stanislav Svědiroh
Manpreet Singh Bhullar
Manpreet Singh Bhullar