Normalt att det blir bugg om man anropar funktion i funktion

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

Ja. Det är bara för pedagogiskt syfte att skriva i är lika med i då om....

Men nu har jag stött på ytterligare ett problem.

Jag har ca tre stycken while loops som är i varandra t.ex

Kod: Markera allt

while(1)
{
  while(1)
  {
     while(1)
  }
}
Och då blir det helt enkelt en random bugg någon annan stans. Är det så att en while loop ska helst avslutas innan man börjar på en ny?

Min bugg är att den tappar ett värde som ska skrivas ut på skärmen. Istället för "Keep value: 44?" Så blir det "Keep value: ?"
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av sodjan »

Hur avbryter du den innersta (och mellersta) loopen?
Har du några "break;" där någonstans? Annars så kommer
du att "fastna" innerst och aldrig komma ut igen...

Kod: Markera allt

while(1)
{
  while(1)
  {
     while(1)
     {
     ...
     ...
     break;
     }
  ...
  ...
  break;
  }
}
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

Inte ett enda break! :D
Men däremot har jag ett argument som gör while loopen falsk så den inte körs.

Men kanske ska köra med break;
robbie
Inlägg: 38
Blev medlem: 27 oktober 2011, 20:14:20

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av robbie »

Nu ser jag inte riktigt varför man skulle vilja ha 3 st while(1)-loopar nästlade. Men det går att ha flera nästlade om man håller reda på vad som ska räknas så att man inte fastnar i någon lopp. Tex.

Kod: Markera allt


while(i<2047)
{
    i+=1;
    //etc
    while (j<1023)
      {
       j+=1;
       //etc
      }
}
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

Loopen är även inom en funktion.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

robbie skrev:Nu ser jag inte riktigt varför man skulle vilja ha 3 st while(1)-loopar nästlade. Men det går att ha flera nästlade om man håller reda på vad som ska räknas så att man inte fastnar i någon lopp. Tex.

Kod: Markera allt


while(i<2047)
{
    i+=1;
    //etc
    while (j<1023)
      {
       j+=1;
       //etc
      }
}
Det är snarare så här jag har skrivit:

Kod: Markera allt

while(1)
{
  if(i = 0)
  {
    while(1)
  }
  else
  {
     while(1)
  }
}
robbie
Inlägg: 38
Blev medlem: 27 oktober 2011, 20:14:20

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av robbie »

Jag blev inte klokare av ditt exempel. Om i=0 startas en evighetsloop, annars startas samma evighetsloop, som dessutom redan är startad innan if-satsen.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

Detta var ett typ exempel bara.
robbie
Inlägg: 38
Blev medlem: 27 oktober 2011, 20:14:20

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av robbie »

Ok, finns inte så mycket att säga.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

Hittade felet nu!

Om jag anropade displayen och bad den skriva ut något så blev det fel annanstans.

Så lösningen var att ta bort denna rad

Kod: Markera allt

display.print("***FINISH***);
Har aldrig gillat Nokia 5110 displayen.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av sodjan »

> Detta var ett typ exempel bara.

Vad är det som är "bara" ???
Varför posta exempel kod om den inte är rellevant för frågan?
Vad är det du egentligen frågar om?

> Hittade felet nu!

Jaha, men det där har ju inte ett smack med det som du frågade om.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

Du borde bli svenskalärare.

Det var ett BARA typexempel på hur jag hade lagt while loops som, med if-satser.

Jag hittade felet och det var att jag hade ropat upp display.print() tydligen för många gånger. Lite konstigt att detta ska vara begränsat. :shock:
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46974
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av TomasL »

Al, du borde lära dig hur man postar här i forumet.
Har du frågor om kodning, och om du vill ha hjälp med detta, så postar du den kod du har skrivit, inte en massa annat orelevant svammel.
"typexempel" är i dessa lägen fullständigt ointressanta.

Och nej, det finns inga begränsningar hur många gånger du anropar en funktion, så länge de inte är rekursiva, så kan du anropa en och samma funktion ett oändligt antal gånger.

Uppenbarligen ligger dit eventuella fel någon annanstans.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

Förr sa ni "Jag förstår inte så mycket av den kod du skrev". Så då postade jag ett typexempel, men inte ens det räckte.

Men okej! Här kommer den!

Kod: Markera allt


#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 12

// pin 7 - Serial clock out (SCLK)
// pin 8 - Serial data out (DIN)
// pin 13 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 2 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 8, 13, 4, 2);

// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
 
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// Deceleration for LED, relays, speaker
const int pin_led_green = 10; // green
const int pin_led_red = 9;  // red
const int pin_relay1 = 11; // relay 1
const int pin_relay2 = 6; // relay 2
const int pin_tone = 5; // Speaker

int first; // first value at question
int second; // second value at question 
int minvalue; // min value is the minimun range e.g 30 or 50.


String labels[5][5] = { {"*****TIME*****", "Dv0 time:", "Range 30-99:", String(first), String(second) },
                        {"*****TEMP*****", "Dv0 temp:", "Range 50-99:", String(first), String(second) },
                        {"*****TIME*****", "Dv1 time:", "Range 30-99:", String(first), String(second) },
                        {"*****TEMP*****", "Dv1 temp:", "Range 50-99:", String(first), String(second) },
                        {"***END TEMP***", "End temp:", "Range 50-99:", String(first), String(second) }};




void setup()
{
  // Sett green and red LED output
  pinMode(pin_led_green, OUTPUT);
  pinMode(pin_led_red, OUTPUT);
  pinMode(pin_relay1, OUTPUT);
  pinMode(pin_relay2, OUTPUT);
  digitalWrite(pin_relay1, HIGH);
  digitalWrite(pin_relay2, HIGH);
  
  // Sett a tone at start
  tone(pin_tone, 400, 400);
  
  // Flash with LED at start
  digitalWrite(pin_led_green, HIGH);
  digitalWrite(pin_led_red, HIGH);
  delay(400);
  digitalWrite(pin_led_green, LOW);
  digitalWrite(pin_led_red, LOW);

  display.begin(); // Begin to use the display
  display.setContrast(50); // set contrast
  display.clearDisplay();  // Remove the adafruit logo and clear!
  
  sensors.begin();  // Start up the temperature library
}

void loop()
{
  int choose = start();
  const int maxi = choose;
  int i = 0;
  int BrewList[choose];
  while (i < maxi)
  { 
    BrewList[i] = brewFunc(i);
    // 100 = back
    // 200 = Accept
    // 300 = ask the same question again
    if (BrewList[i] == 100 ) // Just back one question. i cannot be negative number. 
    {
      if (i == 0)
      {
        i = i;
      }
      else // back but ask the question again. 
      {
        i = i - 1;
      }
    }
    else if (BrewList[i] == 300) // ask the same question again. 
    {
      i = i;
    }
    else //  Just keep forward and ask a new question 
    {
      i = i + 1;
    }
  }
  // now for the real temperature loop
  display.clearDisplay();  
  for (i = 0; i < maxi; i++)
  {
    // Display the values
    display.print(labels[i][1]);
    display.println(BrewList[i]);
    display.display();
  }
  display.print("Keep valueB/E?");
  display.display();
  while (choose != 70) // 70 is just random number 
  {
    choose = tangent_key();
    delay(500);
    if (choose == 200) // 200 is E for accept/exicute 
    {  
      the_loop(BrewList, maxi);
      while(1) // THE END!
      {
        tone(pin_tone, 600, 400);
        delay(1000);
      }
    }
    else if (choose == 100) // 100 is B for back.
    {
      display.clearDisplay();
      display.print("Back to menu");
      display.display();
      delay(2000);
      choose = 70;
    }
    else
    {
      display.clearDisplay();
      display.println("Invalid value");
      display.print("Enter B or E");
      display.display();
    }
  }
  // end of loop. Let's begin whith a new menu!   
} 



int start()
{
  display.clearDisplay();
  display.println("*****MENU*****");
  display.print("Press 1 or 2:");
  display.display();
  int temponaryKey = 1023;
  
  while(temponaryKey != 1 || 2)
  {
    temponaryKey = tangent_key();
    delay(500);
    if (temponaryKey == 1)
    {
      display.clearDisplay();
      display.print("You press: 1");
      display.display();
      delay(2000);
      return 5;
    }
    else if (temponaryKey == 2)
    {
      display.clearDisplay();
      display.print("You press: 2");
      display.display();
      delay(2000);
      return 2;
    }
    else
    {
      display.clearDisplay();
      display.println("Invalid number");
      display.print("Try again");
      display.display();
      delay(2000);
      tone(pin_tone, 800, 400);
      display.clearDisplay();
    }
  }
}


int tangent_key() // press any key to choose metod
{
  int tangent = 1023; 
  
  while(tangent == 1023)
  {
    // This is a voltage devider
    while(tangent >= 1015)
    {
      tangent = analogRead(A5); // Analog pin 5
    }
    if (tangent > 585 && tangent < 595) // number 1
    {
      tone(pin_tone, 400, 400);
      return 1;
    }
    else if (tangent > 50 && tangent < 60) // number 2
    {
      tone(pin_tone, 400, 400);
      return 2;
    }
    else if (tangent > 370 && tangent < 390) // number 3
    {
      tone(pin_tone, 400, 400);
      return 3;
    }
    else if (tangent > 999 && tangent < 1004) // number 4
    {
      tone(pin_tone, 400, 400);
      return 4;
    }
    else if (tangent > 35 && tangent < 47) // number 5
    {
      tone(pin_tone, 400, 400);
      return 5;
    }
    else if (tangent > 10 && tangent < 19) // number 6
    {
      tone(pin_tone, 400, 400);
      return 6;
    }
    else if (tangent > 800 && tangent < 815) // number 7
    {
      tone(pin_tone, 400, 400);
      return 7;
    }
    else if (tangent > 4 && tangent < 10) // number 8
    {
      tone(pin_tone, 400, 400);
      return 8;
    }
    else if (tangent > 170 && tangent < 185) // number 9
    {
      tone(pin_tone, 400, 400);
      return 9;
    }
    else if (tangent >= 0 && tangent < 1) // number 0
    {
      tone(pin_tone, 400, 400);
      return 0;
    }
    else if (tangent > 855 && tangent < 875) // number 100 or B for back
    {
      tone(pin_tone, 400, 400);
      display.clearDisplay();
      return 100;
    }
    else if (tangent > 1006 && tangent < 1012) // number 200 or E for enter
    {
      tone(pin_tone, 400, 400);
      display.clearDisplay();
      return 200;
    }
    else
    {
      display.clearDisplay();
      display.println("****ERROR****");
      display.println("Try again");
      display.print("Enter number");
      display.display();
      delay(3000);
      tangent = 1023; // reset tangent to value 1023 and star over again
    }
  }
}

int brewFunc(int i)
{ 
  // Display Menu, regulator and range
  display.clearDisplay();
  display.print(labels[i][0]);  // Menu
  display.println(labels[i][1]); // Device 
  display.println(labels[i][2]); // Range
  display.display();
  
  // Add first number
  first = tangent_key();
  delay(1000); // just to slow down
  if (first == 100) // if press button B as furst number. Button B is value 100.
  {
    display.clearDisplay();
    display.print("*****BACK*****");
    display.print("Going back....");
    display.display();
    delay(1000);
    return 100; // Just step back one question
  }
  else if (first == 200) // if press button E as furst number. Button E is value 200.
  {
    display.clearDisplay();
    display.print("*****ERROR!***");
    display.print("Not now!");
    display.print("Returning.....");
    display.display();
    delay(1000);
    return 300; // Just ask the same question again. 
  }
  else
  {
    display.clearDisplay();
    display.print(labels[i][0]);  // Menu
    display.println(labels[i][1]); // Device 
    display.println(labels[i][2]); // Range
    display.print(first); // display the first value
    display.display();
  }
  
  // Add second number
  second = tangent_key();
  delay(1000); // just to slow down
  if (second == 100) // if press button B as furst number. Button B is value 100.
  {
    display.clearDisplay();
    display.print("*****BACK*****");
    display.print("Going back....");
    display.display();
    delay(1000);
    return 100; // Just step back one question
  }
  else if (second == 200) // if press button E as second number. Button E is value 200.
  {
    while (second == 200)
    {
      display.clearDisplay();
      display.print("*****ERROR!***");
      display.print("Not E now!");
      display.print("Enter number");
      display.display();
      delay(1000);
      
      // Add a new second number
      second = tangent_key();
      delay(1000); // just to slow down
      if (second == 100)
      {
        display.clearDisplay();
        display.print("*****BACK*****");
        display.print("Going back....");
        display.display();
        delay(1000);
        return 100; // Just step back one question
      }
      else
      {
        // Nothing
      }
    }
    // End of while-loop
    display.clearDisplay();
    display.print(labels[i][0]);  // Menu
    display.println(labels[i][1]); // Device 
    display.println(labels[i][2]); // Range
    display.print(first); // display the first value
    display.print(second); // display the second value
    display.display();
    delay(1000);
    
    display.clearDisplay();
    display.print("Keep value:");
    display.print(String(String(first) += String(second) += "?")); // display first_second value.
    display.display();
    int Kepp_value = tangent_key();
    delay(1000);
    
    if (Kepp_value == 100) // Back = NO - Just go back to the same question again
    {
      display.clearDisplay();
      display.print("*****BACK*****");
      display.print("Going back....");
      display.display();
      delay(1000);
      return 100; // 100 = Just step back one question 
    }
    else if(Kepp_value == 200) // E = YES - Keep value
    {
      if (i == 0 || i == 2)
      {
        minvalue = 30; // min time value. Max temp and time is allways 99.
      }
      else
      {
        minvalue = 50; // min temp value. Max temp and time is allways 99.
      }
      if ((String(String(first) += String(second))).toInt() >= minvalue && (String(String(first) += String(second))).toInt() <= 99)
      {
        display.clearDisplay();
        display.print("*****DONE*****");
        display.print("Done....");
        display.print(String(String(first) += String(second)));
        display.display();
        delay(1000);
        return (String(String(first) += String(second))).toInt(); // Return the first_second value
      }
      else
      {
        display.clearDisplay();
        display.print("*****BACK*****");
        display.print("Not in range.");
        display.print("Going back....");
        display.display();
        delay(1000);
        return 300; // 300 is back only to the same question again.
      }
    }
  }
  else
  {
    display.clearDisplay();
    display.print(labels[i][0]);  // Menu
    display.println(labels[i][1]); // Device 
    display.println(labels[i][2]); // Range
    display.print(first); // display the first value
    display.print(second); // display the second value
    display.display();
    delay(1000);
    
    display.clearDisplay();
    display.print("Keep value:");
    display.print(String(String(first) += String(second) += "?")); // display first_second value.
    display.display();
    int Kepp_value = tangent_key();
    delay(1000);
    
    if (Kepp_value == 100) // Back = NO - Just go back to the same question again
    {
      display.clearDisplay();
      display.print("*****BACK*****");
      display.print("Going back....");
      display.display();
      delay(1000);
      return 300; // 300 is back only to the same question again.
      // Just return. 
    }
    else if(Kepp_value == 200) // E = YES - Keep value
    {
      if (i == 0 || i == 2)
      {
        minvalue = 1;
      }
      else
      {
        minvalue = 1;
      }
      if ((String(String(first) += String(second))).toInt() >= minvalue && (String(String(first) += String(second))).toInt() <= 99)
      {
        display.clearDisplay();
        display.print("*****DONE*****");
        display.print("Done....");
        display.print(String(String(first) += String(second)));
        display.display();
        delay(1000);
        return (String(String(first) += String(second))).toInt(); // Return the first_second value
      }
      else
      {
        display.clearDisplay();
        display.print("*****BACK*****");
        display.println("Not in range.");
        display.print("Going back....");
        display.display();
        delay(1000);
        return 300; // 300 is back only to the same question again.
      }
    }
  }  
}


void the_loop(int BrewList[], int way)
{
  // way can be 2 or 5. 2 is halfbrew and 5 is full brew.
  // BrewList[] contains values from the questions.
  digitalWrite(pin_led_red, HIGH); // start red led.
  
  if (way == 5)
  {
    int i = 0;
    int time = 0;
    while(1)
    {
      sensors.requestTemperatures(); // request sensors temperature
      
      // time clock
      if (i == 60)
      {
        time++;
        i = 0;
      }
      else
      {
        i++; 
      }
      
      display.display();  
      display.clearDisplay();
      
      display.print("Temp dv0:");
      display.print(sensors.getTempCByIndex(0));
       
      display.print("Temp dv1:"); 
      display.print(sensors.getTempCByIndex(1));
      
      display.print("End temp:");
      display.println(BrewList[4]);
      
      display.print("Time dv0:");
      if (BrewList[0] - time <= 0) // brewlist[0] is time limit for Dv0 time
      {
        if (BrewList[0] - time == -1) // End time!
        {
          digitalWrite(pin_relay2, HIGH); // Turn OFF the relay 2 for dv0. 
          while(1) // BrewList[4] is the integear end temp value. 
          {
            sensors.requestTemperatures(); // request sensors temperature
            if(sensors.getTempCByIndex(0) >= BrewList[4])
            {
              display.clearDisplay();
              display.display();
              break;
            }
            else
            {
              display.clearDisplay();
              display.print("***END TEMP***");
              display.print("Temp dv0:");
              display.print(sensors.getTempCByIndex(0));
              display.print("End temp:");
              display.print(BrewList[4]);
              digitalWrite(pin_relay1, LOW); // Turn ON relay for dv0. 
              display.display();
            }  
          }
          break; // end loop.
        }
        else
        {
          display.println("0");
        }
      }
      else
      {
        display.println(BrewList[0] - time);
      }
      
      display.print("Time dv1:");
      if (BrewList[2] >= time) // brewlist[2] is time limit for Dv1 time
      {
        display.println(-BrewList[2] + time); // show before_start_time who is minus.
      }
      else if (BrewList[2] < time)
      {
        display.println(BrewList[0] - time); // count down to end time. 
      }
      else
      {
        display.println("0");
      }
      
      // dv0 is first tank
      if (sensors.getTempCByIndex(0) < BrewList[1]) // if sensor dv0 lower that choosen value ->
      {
        digitalWrite(pin_relay1, LOW); // Turn ON
      }
      else
      {
        digitalWrite(pin_relay1, HIGH); // Turn OFF
      }
    
      // dv1 is second tank.
      if (time > BrewList[2])
      {
        if (sensors.getTempCByIndex(1) < BrewList[3]) // if sensor dv1 lower that choosen value ->
        {
          digitalWrite(pin_relay2, LOW); // Turn ON
        }
        else
        {
          digitalWrite(pin_relay2, HIGH); // Turn OFF
        }
      }
      else
      {
        // Nothing
      }
      //delay(1000);
    }
    digitalWrite(pin_relay1, HIGH); // Turn OFF relay for dv0. 
    digitalWrite(pin_led_red, LOW); // Turn OFF the red led.
    digitalWrite(pin_led_green, HIGH); // Turn ON the green led.
  }
  else
  {
    // HÄR SKA ANDRA DELEN AV KODEN KOMMA.
  }
}
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

Det är denna kodrad som ej skriver ut riktigt

Kod: Markera allt

display.print(String(String(first) += String(second) += "?")); // display first_second value.
Exempel:

Detta blir
Keep value: 45?
till detta
Keep value: ?
Om jag skriver en till extra till.
display.print();
Skriv svar