Problem understanding arrays using an Arduino Uno to make a four button lock

So i downloaded this code from a how-to website. It works perfectly with my Arduino uno and two buttons. I press the buttons in the correct order and the light turns green. My next goal is to make the code programmable by manual input. I want to have a fifth button that would put the lock into programming mode. The user would put in a preferred four button combination and that would become the new code. The trouble came with trying to make this happen. I completely understand this code except for one part. I do not understand how the checkEntered function works, or really what it is at all. I tried simply constructing a new array called newCode[4] and using the same basic model but when i try to use checkNewCode1(1), it gives me an error work_lock:58: error: 'checkNewCode1' was not declared in this scope. The code was too long to paste so the link attached is my new code, and the hyperlink is the basic non-programmable one. If you can explain this to me or help me figure out ANY way to make this happen it would be so much help. Thank you for your time.

Errors when my new code ran:
work_lock.ino: In function 'void loop()':
work_lock:58: error: 'checkNewCode1' was not declared in this scope
work_lock:167: error: a function-definition is not allowed here before '{' token
work_lock:386: error: expected `}' at end of input

http://www.instructables.com/files/orig/FJH/5J36/GPBD3L1V/FJH5J36GPBD3L1V.tmp

working_lock.ino (6.66 KB)

I copied the code you attached to the IDE. I get a different error message then you do:

Binary sketch size: 4,020 bytes (of a 30,720 byte maximum)

If you aren't going to post the code that causes the error, we can't help you.

First section
(had to split it up due to length)

/* a simple passcode lock for Arduino, using 4 buttons,
 * created by Sam White, known as s-j-whitey on Instructables and
 * samwhiteUK just about everywhere else!!
 * I hope soon to be samwhiteUK on Instructables as well, so if 
 * you can't find me under the name s-j-whitey then you know 
 * where I'll be!!
 *
 * 
 * All serial commands in this sketch are for debugging only, do not
 * feel like the Arduino must be connected to the PC, i.e. power 
 * could be drawn from a wall outlet or batteries.
 * 
 *
 * The system can be reset after a correct attempt by a push of the 
 * reset button on the Arduino board itself
 */
const int resetButton = 12; //reset button on pin 12
const int button1 = 8; //first button is on pin 8
const int button2 = 9; //second is on pin 9
const int button3 = 10; //third is pin 10
const int button4 = 11; //fourth is pin 11
const int redLed = 4; //red LED is on pin 4
const int greenLed = 2; //green LED is pin 12

int code[] = {1,2,3,4}; //the desired code is entered in this array,
                        //separated by commas

int entered[4]; //create a new empty array for the code entered by
                //the user (has 4 elements)

int newCode[4];



void setup(){ //run once at sketch startup
  Serial.begin(9600); //begin Serial
  pinMode(resetButton, INPUT);
  pinMode(button1, INPUT); //button 1 is an input
  pinMode(button3, INPUT); //button 2 is an input
  pinMode(button4, INPUT); //button 3 is an input
  pinMode(button2, INPUT); //button 4 is an input
  pinMode(redLed, OUTPUT); //the red LED is an output
  pinMode(greenLed, OUTPUT); // the green LED is an output
 
  digitalWrite(redLed, HIGH); //turn the red LED on
  for (int i = 0; i < 4;i++){ //work through numbers 0-3
    Serial.println(code[i]); //print each digit of the code
    Serial.println(entered[i]); //print each element of the entered[]
                                //array (this was for me to check that it 
                                //started at 0
  }
}

void loop(){ //run repeatedly
  if (digitalRead(resetButton) == HIGH){
    
  if (digitalRead(button1) == HIGH){ //if button1 is pressed
    checkNewCode1(1); //call checkEntered and pass it a 1
    delay(250);//wait, needed for correct functioning, otherwise
               //buttons are deemed to be pressed more than once
  }
  else if (digitalRead(button2) == HIGH){ //if button2 is pressed
     checkNewCode1(2); //call checkEntered1 and pass it a 2
    delay(250); //wait
  }
  else if (digitalRead(button3) == HIGH){ //if button3 is pressed
     checkNewCode1(3); //call checkEntered1 and pass it a 3
    delay(250); //wait
  }
  else if (digitalRead(button4) == HIGH){ //if button4 is pressed
     checkNewCode1(4); //call checkEntered1 and pass it a 4
    delay(250); //wait
  }
 
 
 void checkNewCode1(int button /* define the 1,2,3 or 4 as an integer called button */){ //check the first element of the entered[] array
  if (newCode[0] != 0){ //if it is not a zero, i.e. it has already been inputted
    checkNewCode2(button); //move on to checkEntered2, passing it "button"
  }
  
  else if(entered[0] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    newCode[0] = button; //set the first element as the button that has been pressed
    Serial.print("1: ");Serial.println(newCode[0]); //for debugging
  }
  
}

void checkNewCode2(int button){ //check the second element of the entered[] array
  if (newCode[1] != 0){ //if it is not a zero, i.e. it has already been inputted
    checkNewCode3(button); //move on to checkEntered3, passing it "button"
  }
  
  else if(entered[1] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    newCode[1] = button; //set the second element as the button that has been pressed
    Serial.print("2: ");Serial.println(newCode[1]); //for debugging
  }
  
}

void checkNewCode3(int button){  //check the third element of the entered[] array
  if (newCode[2] != 0){ //if it is not a zero, i.e. it has already been inputted
    checkNewCode4(button); //move on to checkEntered4, passing it "button"
  }
  
  else if (entered[2] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    newCode[2] = button; //set the third element as the button that has been pressed
    Serial.print("3: ");Serial.println(newCode[2]); //for debugging
  }
  
}

void checkNewCode4(int button){ //check the fourth element of the entered[] array
  if (newCode[3] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    newCode[3] = button; //set the final element as the button that has been pressed
    Serial.print("4: ");Serial.println(newCode[3]); //for debugging
    delay(100); //allow time for processing
    
  }

  } 
 
 
 
 
 
 
  
  }

second section

if ((newCode[0] = 0) && (newCode[1] = 0)){
  if (digitalRead(button1) == HIGH){ //if button1 is pressed
    checkEntered1(1); //call checkEntered and pass it a 1
    delay(250);//wait, needed for correct functioning, otherwise
               //buttons are deemed to be pressed more than once
  }
  else if (digitalRead(button2) == HIGH){ //if button2 is pressed
    checkEntered1(2); //call checkEntered1 and pass it a 2
    delay(250); //wait
  }
  else if (digitalRead(button3) == HIGH){ //if button3 is pressed
    checkEntered1(3); //call checkEntered1 and pass it a 3
    delay(250); //wait
  }
  else if (digitalRead(button4) == HIGH){ //if button4 is pressed
    checkEntered1(4); //call checkEntered1 and pass it a 4
    delay(250); //wait
  }

}

void checkEntered1(int button /* define the 1,2,3 or 4 as an integer called button */){ //check the first element of the entered[] array
  if (entered[0] != 0){ //if it is not a zero, i.e. it has already been inputted
    checkEntered2(button); //move on to checkEntered2, passing it "button"
  }
  
  else if(entered[0] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[0] = button; //set the first element as the button that has been pressed
    Serial.print("1: ");Serial.println(entered[0]); //for debugging
  }
  
}

void checkEntered2(int button){ //check the second element of the entered[] array
  if (entered[1] != 0){ //if it is not a zero, i.e. it has already been inputted
    checkEntered3(button); //move on to checkEntered3, passing it "button"
  }
  
  else if(entered[1] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[1] = button; //set the second element as the button that has been pressed
    Serial.print("2: ");Serial.println(entered[1]); //for debugging
  }
  
}

void checkEntered3(int button){  //check the third element of the entered[] array
  if (entered[2] != 0){ //if it is not a zero, i.e. it has already been inputted
    checkEntered4(button); //move on to checkEntered4, passing it "button"
  }
  
  else if (entered[2] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[2] = button; //set the third element as the button that has been pressed
    Serial.print("3: ");Serial.println(entered[2]); //for debugging
  }
  
}

void checkEntered4(int button){ //check the fourth element of the entered[] array
  if (entered[3] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[3] = button; //set the final element as the button that has been pressed
    Serial.print("4: ");Serial.println(entered[3]); //for debugging
    delay(100); //allow time for processing
    compareCode(); //call the compareCode function
  }
}

void compareCode(){ //checks if the code entered is correct by comparing the code[] array with the entered[] array
  for (int i = 0; i<4;i++){ //these three lines are for debugging
    Serial.println(entered[i]);
  }
  if ((entered[0]==code[0]) && (entered[1]==code[1]) && (entered[2]==code[2]) && (entered[3]==code[3])){ //if all the elements of each array are equal
 digitalWrite(redLed, LOW); // turn the red LED off
   
    digitalWrite(greenLed, HIGH); //turn the green LED on
    delay(2000);
    digitalWrite(greenLed, LOW);
    
     memset(entered, 0, 7);

   //return to loop() (not really necessary)
  }
  
  else { //if you (or the intruder) get the code wrong
    flash(); //call the flash function
    for (int i = 0; i < 4; i++){ //this next loop is for debugging
      entered[i] = 0;
      Serial.println(entered[i]);
    }
  } 
}

void flash(){ // this is basically the blink example, look at that for an explantion of this, I wont insult your intelligence... oh wait, I already did that earlier when explaining the green LED flashing... sorry 'bout that
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
}
}
else if(newCode[0] != 0) {
  
  if (digitalRead(button1) == HIGH){ //if button1 is pressed
    checkEntered1(1); //call checkEntered and pass it a 1
    delay(250);//wait, needed for correct functioning, otherwise
               //buttons are deemed to be pressed more than once
  }
  else if (digitalRead(button2) == HIGH){ //if button2 is pressed
    checkEntered1(2); //call checkEntered1 and pass it a 2
    delay(250); //wait
  }
  else if (digitalRead(button3) == HIGH){ //if button3 is pressed
    checkEntered1(3); //call checkEntered1 and pass it a 3
    delay(250); //wait
  }
  else if (digitalRead(button4) == HIGH){ //if button4 is pressed
    checkEntered1(4); //call checkEntered1 and pass it a 4
    delay(250); //wait
  }

}

void checkEntered1(int button /* define the 1,2,3 or 4 as an integer called button */){ //check the first element of the entered[] array
  if (entered[0] != 0){ //if it is not a zero, i.e. it has already been inputted
    checkEntered2(button); //move on to checkEntered2, passing it "button"
  }
  
  else if(entered[0] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[0] = button; //set the first element as the button that has been pressed
    Serial.print("1: ");Serial.println(entered[0]); //for debugging
  }
  
}

void checkEntered2(int button){ //check the second element of the entered[] array
  if (entered[1] != 0){ //if it is not a zero, i.e. it has already been inputted
    checkEntered3(button); //move on to checkEntered3, passing it "button"
  }
  
  else if(entered[1] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[1] = button; //set the second element as the button that has been pressed
    Serial.print("2: ");Serial.println(entered[1]); //for debugging
  }
  
}

void checkEntered3(int button){  //check the third element of the entered[] array
  if (entered[2] != 0){ //if it is not a zero, i.e. it has already been inputted
    checkEntered4(button); //move on to checkEntered4, passing it "button"
  }
  
  else if (entered[2] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[2] = button; //set the third element as the button that has been pressed
    Serial.print("3: ");Serial.println(entered[2]); //for debugging
  }
  
}

void checkEntered4(int button){ //check the fourth element of the entered[] array
  if (entered[3] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[3] = button; //set the final element as the button that has been pressed
    Serial.print("4: ");Serial.println(entered[3]); //for debugging
    delay(100); //allow time for processing
    compareCode(); //call the compareCode function
  }
}

void compareCode(){ //checks if the code entered is correct by comparing the code[] array with the entered[] array
  for (int i = 0; i<4;i++){ //these three lines are for debugging
    Serial.println(entered[i]);
  }
  if ((entered[0]==newCode[0]) && (entered[1]==newCode[1]) && (entered[2]==newCode[2]) && (entered[3]==newCode[3])){ //if all the elements of each array are equal
 digitalWrite(redLed, LOW); // turn the red LED off
   
    digitalWrite(greenLed, HIGH); //turn the green LED on
    delay(2000);
    digitalWrite(greenLed, LOW);
    
     memset(entered, 0, 7);

   //return to loop() (not really necessary)
  }
  
  else { //if you (or the intruder) get the code wrong
    flash(); //call the flash function
    for (int i = 0; i < 4; i++){ //this next loop is for debugging
      entered[i] = 0;
      Serial.println(entered[i]);
    }
  } 
}

void flash(){ // this is basically the blink example, look at that for an explantion of this, I wont insult your intelligence... oh wait, I already did that earlier when explaining the green LED flashing... sorry 'bout that
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
}
  
  
  
  
}


void setupLights(){ // a funky display run at reset
  digitalWrite(redLed, HIGH); //turn both
  digitalWrite(greenLed, HIGH); //LEDs on
  delay(75); //wait
  digitalWrite(redLed, LOW); //turn them
  digitalWrite(greenLed, LOW); //off again
  delay(75); //wait
}


void software_Reset() // Restarts program from beginning but does not reset the peripherals and registers
{
asm volatile ("  jmp 0");  
}

You have defined the checkNewCode1() function inside another function. That has the same effect as not defining it at all.

Put every { on a new line. Use Tools + Auto Format CONSISTENTLY. That makes it easier to see that you are defining a function inside a function. Your poor indenting makes it hard to see that.

So, do I just need to fix my formatting or is the problem with the function itself? Also, do you think this method will work for what i am trying to accomplish, a manually programmable combo?

So, do I just need to fix my formatting or is the problem with the function itself?

This is not an either/or question. You need to fix your formatting so that you can see that the function is defined inside another function. The problem with the function itself is that it is defined inside another function, which is not allowed.

Because I fixed the formatting and was able to get it uploaded ( Thank you so much by the way I will focus more on indenting) without any errors(I also had to rename some functions as they were declared twice), but now my default code won't even work. I will post the second half of the code where i changed some function names. Tell me if you need any more information. It would be so great if you could help me, thank you, but if not I understand. I am way out of my league here (I am very new to Arduino) and I'm probably annoying you with my ignorance.

void combo(){
  if ((newCode[0] = 0) && (newCode[1] = 0)){
    if (digitalRead(button1) == HIGH){ //if button1 is pressed
      checkEntered1(1); //call checkEntered and pass it a 1
      delay(250);//wait, needed for correct functioning, otherwise
      //buttons are deemed to be pressed more than once
    }
    else if (digitalRead(button2) == HIGH){ //if button2 is pressed
      checkEntered1(2); //call checkEntered1 and pass it a 2
      delay(250); //wait
    }
    else if (digitalRead(button3) == HIGH){ //if button3 is pressed
      checkEntered1(3); //call checkEntered1 and pass it a 3
      delay(250); //wait
    }
    else if (digitalRead(button4) == HIGH){ //if button4 is pressed
      checkEntered1(4); //call checkEntered1 and pass it a 4
      delay(250); //wait
    }
  }
}

void checkEntered1(int button /* define the 1,2,3 or 4 as an integer called button */){ //check the first element of the entered[] array
  if (entered[0] != 0){ //if it is not a zero, i.e. it has already been inputted
    checkEntered2(button); //move on to checkEntered2, passing it "button"
  }

  else if(entered[0] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[0] = button; //set the first element as the button that has been pressed
    Serial.print("1: ");
    Serial.println(entered[0]); //for debugging
  }

}

void checkEntered2(int button){ //check the second element of the entered[] array
  if (entered[1] != 0){ //if it is not a zero, i.e. it has already been inputted
    checkEntered3(button); //move on to checkEntered3, passing it "button"
  }

  else if(entered[1] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[1] = button; //set the second element as the button that has been pressed
    Serial.print("2: ");
    Serial.println(entered[1]); //for debugging
  }

}

void checkEntered3(int button){  //check the third element of the entered[] array
  if (entered[2] != 0){ //if it is not a zero, i.e. it has already been inputted
    checkEntered4(button); //move on to checkEntered4, passing it "button"
  }

  else if (entered[2] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[2] = button; //set the third element as the button that has been pressed
    Serial.print("3: ");
    Serial.println(entered[2]); //for debugging
  }

}

void checkEntered4(int button){ //check the fourth element of the entered[] array
  if (entered[3] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[3] = button; //set the final element as the button that has been pressed
    Serial.print("4: ");
    Serial.println(entered[3]); //for debugging
    delay(100); //allow time for processing
    compareCode(); //call the compareCode function
  }
}

void compareCode(){ //checks if the code entered is correct by comparing the code[] array with the entered[] array
  for (int i = 0; i<4;i++){ //these three lines are for debugging
    Serial.println(entered[i]);
  }
  if ((entered[0]==code[0]) && (entered[1]==code[1]) && (entered[2]==code[2]) && (entered[3]==code[3])){ //if all the elements of each array are equal
    digitalWrite(redLed, LOW); // turn the red LED off

    digitalWrite(greenLed, HIGH); //turn the green LED on
    delay(2000);
    digitalWrite(greenLed, LOW);

    memset(entered, 0, 7);
  }

  else { //if you (or the intruder) get the code wrong
    flash(); //call the flash function
    for (int i = 0; i < 4; i++){ //this next loop is for debugging
      entered[i] = 0;
      Serial.println(entered[i]);
    }
  } 
}

void flash(){ // this is basically the blink example, look at that for an explantion of this, I wont insult your intelligence... oh wait, I already did that earlier when explaining the green LED flashing... sorry 'bout that
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
}

void newcode()
{
  if(newCode[0] != 0) {

    if (digitalRead(button1) == HIGH){ //if button1 is pressed
      checkEntered1(1); //call checkEntered and pass it a 1
      delay(250);//wait, needed for correct functioning, otherwise
      //buttons are deemed to be pressed more than once
    }
    else if (digitalRead(button2) == HIGH){ //if button2 is pressed
      checkEntered1(2); //call checkEntered1 and pass it a 2
      delay(250); //wait
    }
    else if (digitalRead(button3) == HIGH){ //if button3 is pressed
      checkEntered1(3); //call checkEntered1 and pass it a 3
      delay(250); //wait
    }
    else if (digitalRead(button4) == HIGH){ //if button4 is pressed
      checkEntered1(4); //call checkEntered1 and pass it a 4
      delay(250); //wait
    }
  }
}

void checkentered1(int button /* define the 1,2,3 or 4 as an integer called button */){ //check the first element of the entered[] array
  if (entered[0] != 0){ //if it is not a zero, i.e. it has already been inputted
    checkEntered2(button); //move on to checkEntered2, passing it "button"
  }

  else if(entered[0] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[0] = button; //set the first element as the button that has been pressed
    Serial.print("1: ");
    Serial.println(entered[0]); //for debugging
  }

}

void checkentered2(int button){ //check the second element of the entered[] array
  if (entered[1] != 0){ //if it is not a zero, i.e. it has already been inputted
    checkEntered3(button); //move on to checkEntered3, passing it "button"
  }

  else if(entered[1] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[1] = button; //set the second element as the button that has been pressed
    Serial.print("2: ");
    Serial.println(entered[1]); //for debugging
  }

}

void checkentered3(int button){  //check the third element of the entered[] array
  if (entered[2] != 0){ //if it is not a zero, i.e. it has already been inputted
    checkEntered4(button); //move on to checkEntered4, passing it "button"
  }

  else if (entered[2] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[2] = button; //set the third element as the button that has been pressed
    Serial.print("3: ");
    Serial.println(entered[2]); //for debugging
  }

}

void checkentered4(int button){ //check the fourth element of the entered[] array
  if (entered[3] == 0){ //if it is zero, i.e. if it hasn't been defined with a button yet
    entered[3] = button; //set the final element as the button that has been pressed
    Serial.print("4: ");
    Serial.println(entered[3]); //for debugging
    delay(100); //allow time for processing
    compareCode(); //call the compareCode function
  }
}

void comparecode(){ //checks if the code entered is correct by comparing the code[] array with the entered[] array
  for (int i = 0; i<4;i++){ //these three lines are for debugging
    Serial.println(entered[i]);
  }
  if ((entered[0]==newCode[0]) && (entered[1]==newCode[1]) && (entered[2]==newCode[2]) && (entered[3]==newCode[3])){ //if all the elements of each array are equal
    digitalWrite(redLed, LOW); // turn the red LED off

    digitalWrite(greenLed, HIGH); //turn the green LED on
    delay(2000);
    digitalWrite(greenLed, LOW);

    memset(entered, 0, 7);

    //return to loop() (not really necessary)
  }

  else { //if you (or the intruder) get the code wrong
    flash(); //call the flash function
    for (int i = 0; i < 4; i++){ //this next loop is for debugging
      entered[i] = 0;
      Serial.println(entered[i]);
    }
  } 
}

void flsh(){ // this is basically the blink example, look at that for an explantion of this, I wont insult your intelligence... oh wait, I already did that earlier when explaining the green LED flashing... sorry 'bout that
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
  digitalWrite(redLed, LOW);
  delay(250);
  digitalWrite(redLed, HIGH);
  delay(250);
}







void setupLights(){ // a funky display run at reset
  digitalWrite(redLed, HIGH); //turn both
  digitalWrite(greenLed, HIGH); //LEDs on
  delay(75); //wait
  digitalWrite(redLed, LOW); //turn them
  digitalWrite(greenLed, LOW); //off again
  delay(75); //wait
}


void software_Reset() // Restarts program from beginning but does not reset the peripherals and registers
{
  asm volatile ("  jmp 0");  
}
  if ((newCode[0] = 0) && (newCode[1] = 0)){

The rest of your if statements correctly use == for comparison. Why don't these?

My mistake. I fixed those. Still not working though unfortunately.

Do you think the general idea fro this code is feasible though? Like if all the errors are fixed, will it get the job done?