1

This question already has an answer here:

I want add and store more than 16 variables value in in my private blockchain, I am unable to define the variable in Struct {}, I got Error

"InternalCompilerError: Stack too deep, try removing local variables".

Please tell any one how to store it, Also please see my code below.

pragma solidity ^0.4.0;

contract People {
    Person[] public people;
    struct Person {

        bytes32 referral_type;
        bytes32 student_name;
        bytes32 grade;
        bytes32 iep_status;
        bytes32 staff_name;
        bytes32 reff_date;
        bytes32 reff_time;
        bytes32 location;
        bytes32 problem_behavier;
        bytes32 perceived_motivation;
        bytes32 others_involved ;
        bytes32 action_token;
        bytes32 notes;
        uint lastID;

        bytes32 notes1;
        bytes32 notes2;
        bytes32 notes3;
        bytes32 notes4;

   }

    function addPerson(bytes32 _referral_type,bytes32 _student_name,bytes32 _grade,bytes32 _iep_status,bytes32 _staff_name,bytes32 _reff_date,bytes32 _reff_time,bytes32 _location,bytes32 _problem_behavier,bytes32 _perceived_motivation,bytes32 _others_involved,bytes32 _action_token,bytes32 _notes,uint _lastID) public returns (bool success) {

      Person memory newPerson;
      newPerson.referral_type = _referral_type;
      newPerson.student_name = _student_name;
      newPerson.grade = _grade;
      newPerson.iep_status = _iep_status;
      newPerson.staff_name = _staff_name;
      newPerson.reff_date = _reff_date;
      newPerson.reff_time = _reff_time;
      newPerson.location = _location;
      newPerson.problem_behavier = _problem_behavier;
      newPerson.perceived_motivation = _perceived_motivation;
      newPerson.others_involved = _others_involved;
      newPerson.action_token = _action_token;
      newPerson.notes = _notes;
      newPerson.lastID = _lastID;

      people.push(newPerson);
      return true;
    }

    function getPeoples() public view returns (bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[])
    {
        uint length = people.length;

        bytes32[] memory referral_types = new bytes32[](length);
        bytes32[] memory student_names  = new bytes32[](length);
        bytes32[] memory grades         = new bytes32[](length);
        bytes32[] memory iep_statuss    = new bytes32[](length);
        bytes32[] memory staff_names    = new bytes32[](length);
        bytes32[] memory reff_dates     = new bytes32[](length);
        bytes32[] memory reff_times     = new bytes32[](length);

        for(uint i=0;i<people.length;i++)
        {
            referral_types[i] = people[i].referral_type;
            student_names[i]  = people[i].student_name;
            grades[i]         = people[i].grade;
            iep_statuss[i]    = people[i].iep_status;
            staff_names[i]    = people[i].staff_name;
            reff_dates[i]     = people[i].reff_date;
            reff_times[i]     = people[i].reff_time;
        }
        return (referral_types,student_names,grades,iep_statuss,staff_names,reff_dates,reff_times);
    }
   }

marked as duplicate by Ismael, Achala Dissanayake, Raghav Sood, Henk, flygoing Aug 6 '18 at 19:28

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

  • Stack size is capped at 16 , simple as that. Each variable/parameter/return arg takes up 1 stack item, strings take up two iirc. – Nico Vergauwen Jul 25 '18 at 8:17
  • Can you explain in detail – Sam Jul 25 '18 at 8:47
  • @Richard, I am new in Solidity so can you please give me a simple example for duplicating, its will more useful for me – Sam Jul 25 '18 at 9:40
1

as @Nico stated in his comment it's about stack limitation (EVM can only reach a specific depth into the stack to read arguments).

Per design in the EVM you can access only last 16 slots(16 fixed lenght type and 8 strings) from the top (stack not capped to 16).therefore having more arguments than that limit will cause a problem. By this limitation you can deal only with around 16 local variables (including parameters and return parameters).

Not the answer you're looking for? Browse other questions tagged or ask your own question.