Wie erstelle ich einen Vertrag, der die Zeichenfolge für die jeweilige ID speichert und Details aus dem Array für die jeweilige ID von React Js erhält?

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:

Geben Sie hier die Bildbeschreibung ein

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

Antworten (1)

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 Studentund 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, Answersin Ihrer StudentStruktur 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;
    }     
}
Svediroh Danke, es hat funktioniert, aber ich brauche noch eine Funktion, um alle Einträge auf einmal zu bekommen, wie Id = 73 und answers = "you name"; Id = 74 und Antworten = "mein Name"...., wie kann ich das erreichen.
Wenn ich diese Methode verwende, bekomme ich nichts zurück, was soll ich für "_ids" eingeben, um alle Schülernoten zu bekommen
Oh, du brauchst ALLE. Die Funktion, die ich ausgeführt habe, bestand darin, nur eine ausgewählte Liste von IDs zu erhalten
Ich möchte alle Schülernoten, und wenn ich ein Array wie dieses [71,72] übergebe, um den Wert dieser IDs zu erhalten, gibt es keinen Wert zurück, nur diesen: [![Bildbeschreibung hier eingeben][1]][1] [1 ]: i.stack.imgur.com/Xl2JP.png
Tut mir leid, Sie zu stören ... aber mit diesem Code bekomme ich überhaupt keine Antworten. Unten ist der Bildlink von dem, was ich bekomme: i.stack.imgur.com/fQ5F6.png