Hur radera alla variabler på en linje?

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:

Hur radera alla variabler på en linje?

Inlägg av Al_Bundy »

Jag har ett litet problem med min arduino. När jag trycker på Back-knappen så hoppar jag tillbaka på ruta ett i mitt program. Så ska det vara. Men på något konstigt sätt så ligger information lagrade kvar i variablerna som jag åter igenom kommer stöta på.

Jag har byggt en back-funktion som ska kasta en tillbaka i programmet på ruta ett.

Finns det något sätt att göra så att alla variabler och arrays raderas och innehåller inte ens 0:or, bara plats för nytt minne?
Zkronk
Inlägg: 1439
Blev medlem: 23 augusti 2005, 16:44:36
Ort: Uppsala

Re: Hur radera alla variabler på en linje?

Inlägg av Zkronk »

Alla minnesadresser måste väl innehålla någon data?
Så sätter du inte variablerna till t.ex. 0 så kan de minnesplatserna innehålla vilken skräp-data som helst..
Det är så jag har förstått det när jag läst om microcontroller's och minnen.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur radera alla variabler på en linje?

Inlägg av sodjan »

> så att alla variabler och arrays raderas och innehåller inte ens 0:or,

Vad ska det innehålla då?
Och vad spelar det för roll?
Om det spelar roll så är din kod felaktig.

> Alla minnesadresser måste väl innehålla någon data?

Självklart är det så...
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Hur radera alla variabler på en linje?

Inlägg av Al_Bundy »

Det kanske är bug i mitt program?

Så här ser programmet ut:

När jag går vid denna kodväg:

Kod: Markera allt

if (temp1 == 100)
      {
        display.clearDisplay();
        display.print("*****BACK*****");
        display.println("You press B");
        display.println("Retruning...");
        display.display();
        delay(2000);
        first_question(); // jump back to the begining if press letter B as back.
      }
Så kommer jag återkomma tillbaka med förhoppningar att sum_temp och sum_time är tomma. De innehåller varken nollor. Bara uttrymme. Samt att i ska vara = 0...men nej. Det blir inte så. Variabeln i nollas inte.

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
const int led_green = 10;
const int led_red = 9;

 
void setup()
{
  // Sett green and red LED output
  pinMode(led_green, OUTPUT);
  pinMode(led_red, OUTPUT);
  
  // Sett a tone at start
  tone(5, 400, 400);
  
  // Flash with LED at start
  digitalWrite(led_green, HIGH);
  digitalWrite(led_red, HIGH);
  delay(400);
  digitalWrite(led_green, LOW);
  digitalWrite(led_red, LOW);
  
  
  display.begin(); // Begin to use the display
  display.setContrast(50); // set contrast
  display.clearDisplay();  // Remove the adafruit logo and clear!
  
  // Start up the library
  sensors.begin();
  delay(5000);  //important on linux as serial port can lock up otherwise
  
  /* Some questions to declare method, temperature and time */

  int first = first_question(); // the first question
  int second = second_question(first); // the second question
  

  
  
 
  delay(5000);  //important on linux as serial port can lock up otherwise
}
 

 
void printTemperaturesToSerial(int choose) {
  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  //Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  //Serial.println("DONE");
  
  if (choose == 300) // 300 is the alternative 1. Check dv0 and dv1 temp
  {
    display.clearDisplay();
    display.println("Temp dv0 is");
    display.println(sensors.getTempCByIndex(0));
       
    display.println("Temp dv1 is");
    display.print(sensors.getTempCByIndex(1));
    display.display();
    
    
  }
  else // 400 is the alternative 2. Only check dv0 temp
  {
    display.clearDisplay();
    display.println("Temp dv0 is");
    display.println(sensors.getTempCByIndex(1));
    display.display();
  }
  
 
  // Read each of our sensors and print the value
  
}

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

int tangent_key2(int first) // press any key to choose time
{
  int tangent = 1023; 
  
  while(tangent >= 1015)
  {
    tangent = analogRead(A5);
  }
  
  if (tangent > 585 && tangent < 595) // number 1
  {
    tone(5, 400, 400);
    return 1;
    
  }
  else if (tangent > 50 && tangent < 60) // number 2
  {
    tone(5, 400, 400);
    return 2;
    
  }
  else if (tangent > 370 && tangent < 390) // number 3
  {
    tone(5, 400, 400);
    return 3;
    
  }
  else if (tangent > 999 && tangent < 1004) // number 4
  {
    tone(5, 400, 400);
    return 4;
    
  }
  else if (tangent > 35 && tangent < 47) // number 5
  {
    tone(5, 400, 400);
    return 5;
    
  }
  else if (tangent > 10 && tangent < 19) // number 6
  {
    tone(5, 400, 400);
    return 6;
    
  }
  else if (tangent > 800 && tangent < 815) // number 7
  {
    tone(5, 400, 400);
    return 7;
    
  }
  else if (tangent > 4 && tangent < 10) // number 8
  {
    tone(5, 400, 400);
    return 8;
    
  }
  else if (tangent > 170 && tangent < 185) // number 9
  {
    tone(5, 400, 400);
    return 9;
    
  }
  else if (tangent >= 0 && tangent < 1) // number 0
  {
    tone(5, 400, 400);
    return 0;
    
  }
  else if (tangent > 855 && tangent < 875) // number 100 or B for back
  {
    tone(5, 400, 400);
    display.clearDisplay();
    return 100;
    
  }
  else if (tangent > 1006 && tangent < 1012) // number 200 or E for enter
  {
    tone(5, 400, 400);
    display.clearDisplay();
    return 200;
    
  }
  
  else
  {
    display.clearDisplay();
    display.println("****ERROR****");
    display.println("Try again");
    display.display();
    delay(2000);
    second_question(first);
  }
  
  
}


int first_question() // the first question
{
  
  display.clearDisplay();
  display.println("*****MENU*****");
  display.print("Press 1 or 2:");
  display.display();
  if (tangent_key() == 1)
  {
    display.clearDisplay();
    display.print("You press: 1");
    display.display();
    delay(2000);
    return 300;
  }
  else if (tangent_key() == 2)
  {
    display.clearDisplay();
    display.print("You press: 2");
    display.display();
    delay(2000);
    return 400;
  }
  else
  {
    
    display.clearDisplay();
    display.println("Invalid number");
    display.print("Try again");
    display.display();
    delay(2000);
    tone(5, 400, 400);
    display.clearDisplay();
    first_question();
  }
}

int second_question(int first)
{
  /* if first == 300 it means that you gonna 
     run with device 0 and device 1 */
     
  /* if first == 400 it means that you only 
     gonna run device 0 */
     
  if (first == 300)  // Sett time for device 0. 
  {
    int i = 0;
    int time1 = 0;
    int sum_time1[2];
    
    display.clearDisplay();
    display.print("*****TIME*****");
    display.println("Dv0 time::");
    display.println("Range 50-80:");
    display.display();
    
    while (i >= 0 && time1 != 200) // 200 is for Enter - continue
    {
     
      time1 = tangent_key2(first);
      delay(50);
      sum_time1[i] = time1;
      delay(50);
      
      if (time1 == 100)
      {
        display.clearDisplay();
        display.print("*****BACK*****");
        display.println("You press B");
        display.println("Retruning...");
        display.display();
        delay(2000);
        first_question(); // jump back to the begining if press letter B as back.
      }
      else
      {
        // Nothing! Just pass!
      }
      
      
      if (i == 0)
      {
        display.clearDisplay();
        display.print("*****TIME*****");
        display.println("Dv0 time:");
        display.println("Range 50-80:");
        display.println(String(sum_time1[i]));
        display.display();
        delay(500);
        i = i + 1;
      }
      else if (i == 1)
      {
        display.clearDisplay();
        display.print("*****TIME*****");
        display.println("Dv0 time:");
        display.println("Range 50-80:");
        display.println(String(sum_time1[i-1])+= String(sum_time1[i]));
        display.println("Press E now.");
        display.display();
        delay(500);
        i = i + 1;
      }
      else if (i == 2)
      {
        if (time1 == 200)
        {
          display.clearDisplay();
          display.print("Done");
          display.display();
          delay(2000);
        }
        else
        {
          display.clearDisplay();
          display.print("*****TIME*****");
          display.print("No more!");
          display.print("Press E now");
          display.display();
          delay(2000);
          i = i + 1;
        }
      }
      delay(500);
      
    }
    
    /* We have now enter Time 1. Let's move next to time 2 on device 1 */
    
    display.clearDisplay();
    display.print("Done...");
    display.println(String(sum_time1[0])+= String(sum_time1[1]));
    display.display();
    delay(2000);
    
    i = 0;
    int time2 = 0; // new declaration of a new time. Time 2
    int sum_time2[2];
    
    display.clearDisplay();
    display.print("*****TIME*****");
    display.println("Dv1 time:"); // enter time 2
    display.println("Range 50-80:");
    display.display();
    
    while (i >= 0 && time2 != 200) // 200 is for Enter - continue
    {
      
      time2 = tangent_key2(first);
      if (time2 == 100)
      {
        display.clearDisplay();
        display.print("*****BACK*****");
        display.println("You press B");
        display.println("Retruning...");
        display.display();
        delay(2000);
        first_question(); // jump back to the begining if press letter B as back.
      }
      delay(50);
      sum_time2[i] = time2;
      delay(50);
      
      if (i == 0)
      {
        display.clearDisplay();
        display.print("*****TIME*****");
        display.println("Dv1 time:");
        display.println("Range 50-80:");
        display.println(String(sum_time2[i]));
        display.display();
        delay(500);
        i = i + 1;
      }
      else if (i == 1)
      {
        display.clearDisplay();
        display.print("*****TIME*****");
        display.println("Dv1 time:");
        display.println("Range 50-80:");
        display.println(String(sum_time2[i-1])+= String(sum_time2[i]));
        display.println("Press E now.");
        display.display();
        delay(500);
        i = i + 1;
      }
      else if (i == 2)
      {
        if (time2 == 200)
        {
          display.clearDisplay();
          display.print("Done");
          display.display();
          delay(2000);
        }
        else
        {
          display.clearDisplay();
          display.print("*****TIME*****");
          display.print("No more!");
          display.print("Press E now");
          display.display();
          delay(2000);
          i = i + 1;
        }
      }
      delay(500);
      
    }
    
    /* We have now enter Time 2. Let's move next to temp 1 on device 0 */
    
    display.clearDisplay();
    display.print("Done...");
    display.println(String(sum_time2[0])+= String(sum_time2[1]));
    display.display();
    delay(2000);
    
    i = 0;
    int temp1 = 0; // new declaration of a new temp. Temp1 1

    int sum_temp1[2];
    display.clearDisplay();
    display.print("*****TEMP*****");
    display.println("Dv0 temp:"); // enter temp 1
    display.println("Range 50-80:");
    display.display();
    
    while (i >= 0 && temp1 != 200) // 200 is for Enter - continue
    {
      
      temp1 = tangent_key2(first);
      if (temp1 == 100)
      {
        display.clearDisplay();
        display.print("*****BACK*****");
        display.println("You press B");
        display.println("Retruning...");
        display.display();
        delay(2000);
        first_question(); // jump back to the begining if press letter B as back.
      }
      delay(50);
      sum_temp1[i] = temp1;
      delay(50);
      
      if (i == 0)
      {
        display.clearDisplay();
        display.print("*****TEMP*****");
        display.println("Dv0 temp:");
        display.println("Range 50-80:");
        display.println(String(sum_temp1[i]));
        display.display();
        delay(500);
        i = i + 1;
      }
      else if (i == 1)
      {
        display.clearDisplay();
        display.print("*****TEMP*****");
        display.println("Dv0 temp:");
        display.println("Range 50-80:");
        display.println(String(sum_temp1[i-1])+= String(sum_temp1[i]));
        display.println("Press E now.");
        display.display();
        delay(500);
        i = i + 1;
      }
      else if (i >= 2)
      {
        if (temp1 == 200)
        {
          display.clearDisplay();
          display.print("Done");
          display.display();
          delay(2000);
        }
        else
        {
          display.clearDisplay();
          display.print("*****TEMP*****");
          display.print("No more!");
          display.print("Press E now");
          display.display();
          delay(2000);
          i = i + 1;
        }
      }
      delay(500);
      
    }
    
    /* We have now enter Temp 1. Let's move next to temp 2 on device 1 */
    
    display.clearDisplay();
    display.print("Done...");
    display.println(String(sum_temp1[0])+= String(sum_temp1[1]));
    display.display();
    delay(2000);
    
    i = 0;
    int temp2 = 0; // new declaration of a new temp. Temp1 2

    int sum_temp2[2];
    display.clearDisplay();
    display.print("*****TEMP*****");
    display.println("Dv1 temp:"); // enter temp 2
    display.println("Range 50-80:");
    display.display();
    
    while (i >= 0 && temp2 != 200) // 200 is for Enter - continue
    {
      
      temp2 = tangent_key2(first);
      if (temp2 == 100)
      {
        display.clearDisplay();
        display.print("*****BACK*****");
        display.println("You press B");
        display.println("Retruning...");
        display.display();
        delay(2000);
        first_question(); // jump back to the begining if press letter B as back.
      }
      delay(50);
      sum_temp2[i] = temp2;
      delay(50);
      
      if (i == 0)
      {
        display.clearDisplay();
        display.print("*****TEMP*****");
        display.println("Dv1 temp:");
        display.println("Range 50-80:");
        display.println(String(sum_temp2[i]));
        display.display();
        delay(500);
        i = i + 1;
      }
      else if (i == 1)
      {
        display.clearDisplay();
        display.print("*****TEMP*****");
        display.println("Dv1 temp:");
        display.println("Range 50-80:");
        display.println(String(sum_temp2[i-1])+= String(sum_temp2[i]));
        display.println("Press E now.");
        display.display();
        delay(500);
        i = i + 1;
      }
      else if (i >= 2)
      {
        if (temp2 == 200)
        {
          display.clearDisplay();
          display.print("Done");
          display.display();
          delay(2000);
        }
        else
        {
          display.clearDisplay();
          display.print("*****TEMP*****");
          display.print("No more!");
          display.print("Press E now");
          display.display();
          delay(2000);
          i = i + 1;
        }
      }
      delay(500);
      
    }
    display.clearDisplay();
    display.print("Done...");
    display.println(String(sum_temp2[0])+= String(sum_temp2[1]));
    display.display();
    delay(2000);
    display.clearDisplay();
    delay(10);
    display.print("****VALUES****");
    delay(20);
    display.print(String(sum_time1[0])+= String(sum_time1[1]));
    delay(20);
    display.println(" Time dv0");
    delay(20);
    display.print(String(sum_time2[0])+= String(sum_time2[1]));
    delay(20);
    display.println(" Time dv1");
    delay(20);
    display.print(String(sum_temp1[0])+= String(sum_temp1[1]));
    delay(20);
    display.println(" Temp dv0");
    delay(20);
    display.print(String(sum_temp2[0])+= String(sum_temp2[1]));
    delay(20);
    display.println(" Temp dv1");
    delay(20);
    display.print("Starting...");
    delay(20);
    display.display();
    delay(2000);
    
    // declare values
    int dv0_time = (String(sum_time1[0])+= String(sum_time1[1])).toInt();
    int dv1_time = (String(sum_time2[0])+= String(sum_time2[1])).toInt();
    int dv0_temp = (String(sum_temp1[0])+= String(sum_temp1[1])).toInt();
    int dv1_temp = (String(sum_temp2[0])+= String(sum_temp2[1])).toInt();
    
    // Set time
    int time_end = 0;
    
    // runt own loop instend of loop()
    while (time_end <= dv0_time*60 )
    {
      printTemperaturesToSerial(300);
      delay(1000); //wait 1 sec
      time_end = time_end + 1;
    }
    
  }
  
  else
  {
    int i = 0;
    int time1 = 0;
    int sum_time1[2]; 
    
    display.clearDisplay();
    display.print("*****TIME*****");
    display.println("Dv0 time::");
    display.println("Range 50-80:");
    display.display();
    
    while (i >= 0 && time1 != 200) // 200 is for Enter - continue
    {
      
      time1 = tangent_key2(first);
      delay(50);
      sum_time1[i] = time1;
 
      if (time1 == 100)
      {
        display.clearDisplay();
        display.print("*****BACK*****");
        display.println("You press B");
        display.println("Retruning...");
        display.display();
        delay(2000);
        first_question(); // jump back to the begining if press letter B as back.
      }
      else
      {
        // Nothing! Just pass!
      }
     
      if (i == 0)
      {
        display.clearDisplay();
        display.print("*****TIME*****");
        display.println("Dv0 time:");
        display.println("Range 50-80:");
        display.println(String(sum_time1[i]));
        display.display();
        delay(500);
        i = i + 1;
      }
      else if (i == 1)
      {
        display.clearDisplay();
        display.print("*****TIME*****");
        display.println("Dv0 time:");
        display.println("Range 50-80:");
        display.println(String(sum_time1[i-1])+= String(sum_time1[i]));
        display.println("Press E now.");
        display.display();
        delay(500);
        i = i + 1;
      }
      else if (i >= 2)
      {
        if (time1 == 200)
        {
          display.clearDisplay();
          display.print("Done");
          display.display();
          delay(2000);
        }
        else
        {
          display.clearDisplay();
          display.print("*****TIME*****");
          display.print("No more!");
          display.print("Press E now");
          display.display();
          delay(2000);
          i = i + 1;
        }
      }
      delay(500);
      
    }
    
    /* We have not enter Time 1. Let's move next to temp 1 on device 0 */
    
    display.clearDisplay();
    display.print("Done...");
    display.println(String(sum_time1[0])+= String(sum_time1[1]));
    display.display();
    delay(2000);
    
    i = 0;
    int temp1 = 0; // new declaration of a new temp. Temp1 1
    int sum_temp1[2]; // new declaration of a new temp. Temp1 1
    
    display.clearDisplay();
    display.print("*****TEMP*****");
    display.println("Dv0 temp:"); // ente temp 1
    display.println("Range 50-80:");
    display.display();
    
    while (i >= 0 && temp1 != 200) // 200 is for Enter - continue
    {
      
      temp1 = tangent_key2(first);
      if (temp1 == 100)
      {
        display.clearDisplay();
        display.print("*****BACK*****");
        display.println("You press B");
        display.println("Retruning...");
        display.display();
        delay(2000);
        first_question(); // jump back to the begining if press letter B as back.
      }
      delay(50);
      sum_temp1[i] = temp1;
      delay(50);
      
      if (i == 0)
      {
        display.clearDisplay();
        display.print("*****TEMP*****");
        display.println("Dv0 temp:");
        display.println("Range 50-80:");
        display.println(String(sum_temp1[i]));
        display.display();
        delay(500);
        i = i + 1;
      }
      else if (i == 1)
      {
        display.clearDisplay();
        display.print("*****TEMP*****");
        display.println("Dv0 temp:");
        display.println("Range 50-80:");
        display.println(String(sum_temp1[i-1])+= String(sum_temp1[i]));
        display.println("Press E now.");
        display.display();
        delay(500);
        i = i + 1;
      }
      else if (i >= 2)
      {
        if (temp1 == 200)
        {
          display.clearDisplay();
          display.print("Done");
          display.display();
          delay(2000);
        }
        else
        {
          display.clearDisplay();
          display.print("*****TEMP*****");
          display.print("No more!");
          display.print("Press E now");
          display.display();
          delay(2000);
          i = i + 1;
        }
      }
      delay(500);
      
    }
    
    display.clearDisplay();
    display.print("Done...");
    display.println(String(sum_temp1[0])+= String(sum_temp1[1]));
    display.display();
    delay(2000);
    display.clearDisplay();
    delay(10);
    display.print("****VALUES****");
    delay(10);
    display.print(String(sum_time1[0])+= String(sum_time1[1]));
    delay(10);
    display.println(" Time dv0");
    delay(10);
    display.print(String(sum_temp1[0])+= String(sum_temp1[1]));
    delay(10);
    display.println(" Temp dv0");
    delay(30);
    display.print("Startning...");
    delay(30);
    display.display();
    delay(2000);
    
    // Declare values
    int dv0_time = (String(sum_time1[0])+= String(sum_time1[1])).toInt();
    int dv0_temp = (String(sum_temp1[0])+= String(sum_temp1[1])).toInt();
    int dv1_time = 0; // just declare a value just to fill the function's input full. 
    int dv1_temp = 0; // same as here
   
    // Set time
    int time_end = 0;
    
    // runt own loop instend of loop()
    while (time_end <= dv0_time*60 )
    {
      printTemperaturesToSerial(400);
      delay(1000); //wait 1 sec
      time_end = time_end + 1;
    }
    
   
    
  }
 
  
  
  
}

void loop()  // The loop
{
  // nothing here
}
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur radera alla variabler på en linje?

Inlägg av sodjan »

> med förhoppningar att sum_temp och sum_time är tomma.

Det *kan* de inte vara. Men sa vi inte det? Läste du inte förra inlägget?
Det finns inget begrepp som "tom" för variabler, de har *alltid* ett värde.

> Det kanske är bug i mitt program?

Ja, om det är skrivet av någon som tror att en variabel
kan vara "tom", så kan det ju även ha buggar. :-) En variabel
har alltid ett värde, det kan vara okänt eller "odefinierat", men
ett värde har de alltid.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Hur radera alla variabler på en linje?

Inlägg av Al_Bundy »

Jag läste det ni skrev. Men jag tror detta är mer en hårdvarubugg.

Om vi tar detta exempel.

Om jag har en array som heter min_lista[2]; och sen skriver jag värden till dessa element där inne. Det är alltså 3 platser i min_lista[2]. Sen hoppar jag tillbaka från början. Då vill jag att min_lista[2] ska vara tom. De ska inte innehålla några nollor eller tal eller gud vad som helst. Nej! Tom ska den vara. Precis som den vore nydeklarerad :)

Det samma gäller variabeln i. Den blir inte heller återställd till 0 trots att programmet läser int i = 0;
TobiasEinarsson
Inlägg: 58
Blev medlem: 6 september 2012, 11:15:33
Ort: Göteborg

Re: Hur radera alla variabler på en linje?

Inlägg av TobiasEinarsson »

Det räcker inte med att läsa, du måste också ta in och förstå det som skrivs. Sodjan förklarar ju för dig att en variabel aldrig kan vara tom.
Ditt program är rörigt skrivet så det är ganska svårt att ge feedback på det, men att anropa en funktion som du gör är inte samma sak som att "hoppa" till ett annat ställe.
Det samma gäller variabeln i. Den blir inte heller återställd till 0 trots att programmet läser int i = 0;
Blir inte variabeln satt till 0 på de raderna där du sätter den till 0? Jag förstår inte vad du menar här faktiskt.
Nerre
Inlägg: 27229
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Hur radera alla variabler på en linje?

Inlägg av Nerre »

Al_Bundy skrev:Nej! Tom ska den vara. Precis som den vore nydeklarerad :)
Även en nydeklarerad variabel har ett värde. Har man inte definierat värdet så är det odefinierat, det blir det värde som råkar finnas på den adress i RAM där variabeln placeras.
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: Hur radera alla variabler på en linje?

Inlägg av arvidb »

När du skriver

Kod: Markera allt

	int sum_time1[2];
så reserverar du en plats i minnet som är lagom stor för det antal integers du har angett. Dessa minnesplatser kommer alltid att innehålla data oavsett om du har initierat dem eller inte. Däremot är det en bugg att använda sig av datat utan att ha skrivit något först, eftersom datat kommer att vara slumpmässigt. (Nej, detta är ingen hårdvarubugg, tro mig...)

Eftersom du har deklarerat variabeln i en funktion så kommer dessa variabler att ligga i stacken, och plats för dem kommer att allokeras varje gång funktionen anropas.

Jag tror inte att anropet till funktioner gör var du tror att de gör: du tror att ett funktionsanrop helt enkelt är ett "hopp" till ett visst kodstycke, eller hur? Så enkelt är det inte. Varje gång du anropar en funktion så görs som sagt en ny allokering av alla lokala variabler (variabler som är dekrarerade inne i den funktionen). Dessa avallokeras inte förrän funktionen "tar slut" (antingen att du kör igenom den till sista kodraden eller att du returnerar från den med return. Så om man gör som du gör, nämligen anropar funktionen igen innan funktionen har returnerat, så kommer man till slut att äta upp allt minne. (Detta kallas rekursion och kan vara ett kraftfullt verktyg ibland, men bara om man verkligen vet vad man gör.)

En annan sak: deklarationen ovan skapar TVÅ integers, inte tre. Att referera sum_time1[2] är en bugg.
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: Hur radera alla variabler på en linje?

Inlägg av arvidb »

Vidare: när first_question() returnerar så kommer koden att fortsätta att exekvera precis efter stället där first_question() anropades.

Ta t.ex. anropet på rad 369 (i funktionen second_question()). Efter att användaren har valt knapp 1 eller knapp 2 så kommer koden att fortsätta exekvera raden efter ("if (i == 0)"). Vilken knapp som användaren tryckte på kommer inte att sparas/användas någonstans, eftersom du inte använder returvärdet från first_question() här.

Du borde istället använda dig av loop()-funktionen, så att varje anrop till loop() gör att du får först fråga 1 och sedan fråga 2. Om användaren trycker fel så ska bara resten av loop()-funktionen hoppas över (d.v.s. loop() ska returnera). När sedan loop() anropas igen automatiskt så kommer det hela att börja om.

Dessutom ska du alltid returnera ett värde från en funktion som inte är void. Du bör alltså inte anropa first_question() igen inifrån first_question(), utan istället returnera t.ex. -1 som en felkod, och kolla i funktionen som anropade first_question() om du fick ett vettigt värde - och om inte, anropa first_question() igen.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Hur radera alla variabler på en linje?

Inlägg av Al_Bundy »

Aj aj aj!

Nu förstår jag vad jag har gjort!

När jag ångrar mig och vill backa ett steg. Då hoppar jag in på en ny funktion, men det jag inte tänkte på är att efter jag har kört denna funktion så kommer jag fortsätta som vanligt på den gamla funktionen.

Exempel:

Här börjar jag. Jag inleder igenom att gå in på funktion funk1()
"Nu är jag tillbaka här igen".
funk1(här är jag nu.)


funk2(...och helt plötsligt här jag här. Mitt mål är att komma till funk3()...men det blev fel så jag hoppar upp till funk1())
"Och nu är jag senare här".
funk3()
Lite rörigt! Jag vet. Jag hade hoppas på att programmet skulle glömma sin dåtida väg. Men det gjorde den inte.
Ni vet inte hur man kan göra så programmet glömmer sin dåtida väg?

...goto? :twisted:
Helt ärligt tycker jag att goto är ganska OK funktion ändå. Har hört att den är hatad, men så länge man använder den rätt så är väll det lugnt?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur radera alla variabler på en linje?

Inlägg av sodjan »

Förstår inte hur du menar. Vad är det du vill göra med funktionerna?
Hur ska de anropa varandra?

> funk2(...och helt plötsligt här jag här.

Varför? Var anropar du funk2() ??

> Ni vet inte hur man kan göra så programmet glömmer sin dåtida väg?

Det går i princip inte. Det kallas "call stack", alltså hela vägen tillbaka.
Den kan man normalt (och ska normalt) inte röra. Om du tror att du
har behov av det, så är din logik i programmet galen.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Hur radera alla variabler på en linje?

Inlägg av Al_Bundy »

arvidb skrev:Vidare: när first_question() returnerar så kommer koden att fortsätta att exekvera precis efter stället där first_question() anropades.
Ta t.ex. anropet på rad 369 (i funktionen second_question()). Efter att användaren har valt knapp 1 eller knapp 2 så kommer koden att fortsätta exekvera raden efter ("if (i == 0)"). Vilken knapp som användaren tryckte på kommer inte att sparas/användas någonstans, eftersom du inte använder returvärdet från first_question() här
.

Jag såg det till slut :)
Du borde istället använda dig av loop()-funktionen, så att varje anrop till loop() gör att du får först fråga 1 och sedan fråga 2. Om användaren trycker fel så ska bara resten av loop()-funktionen hoppas över (d.v.s. loop() ska returnera). När sedan loop() anropas igen automatiskt så kommer det hela att börja om.
Jag vill inte använda mig av loop funktionen. Den är icke passande i mitt program enligt mig.
Dessutom ska du alltid returnera ett värde från en funktion som inte är void. Du bör alltså inte anropa first_question() igen inifrån first_question(), utan istället returnera t.ex. -1 som en felkod, och kolla i funktionen som anropade first_question() om du fick ett vettigt värde - och om inte, anropa first_question() igen.
Hur menar du? Varför ska jag alltid returnera ett värde om jag inte behöver det?
arvidb skrev:När du skriver

Kod: Markera allt

	int sum_time1[2];
så reserverar du en plats i minnet som är lagom stor för det antal integers du har angett. Dessa minnesplatser kommer alltid att innehålla data oavsett om du har initierat dem eller inte. Däremot är det en bugg att använda sig av datat utan att ha skrivit något först, eftersom datat kommer att vara slumpmässigt. (Nej, detta är ingen hårdvarubugg, tro mig...)

Eftersom du har deklarerat variabeln i en funktion så kommer dessa variabler att ligga i stacken, och plats för dem kommer att allokeras varje gång funktionen anropas.

Jag tror inte att anropet till funktioner gör var du tror att de gör: du tror att ett funktionsanrop helt enkelt är ett "hopp" till ett visst kodstycke, eller hur? Så enkelt är det inte. Varje gång du anropar en funktion så görs som sagt en ny allokering av alla lokala variabler (variabler som är dekrarerade inne i den funktionen). Dessa avallokeras inte förrän funktionen "tar slut" (antingen att du kör igenom den till sista kodraden eller att du returnerar från den med return. Så om man gör som du gör, nämligen anropar funktionen igen innan funktionen har returnerat, så kommer man till slut att äta upp allt minne. (Detta kallas rekursion och kan vara ett kraftfullt verktyg ibland, men bara om man verkligen vet vad man gör.)

En annan sak: deklarationen ovan skapar TVÅ integers, inte tre. Att referera sum_time1[2] är en bugg.
Jag märkte att det är inte fel på min array. Den fungerar helt perfekt! Men tackar ändå för svaret :)
Jag får läsa mig mer in på hur man raderar element och ersätter. Jag är annars ganska van med python och det ska nog inte vara så stor skillnad att append:a till arrays med C.
Nerre skrev:
Al_Bundy skrev:Nej! Tom ska den vara. Precis som den vore nydeklarerad :)
Även en nydeklarerad variabel har ett värde. Har man inte definierat värdet så är det odefinierat, det blir det värde som råkar finnas på den adress i RAM där variabeln placeras.
Så array[2]; innehåller vilka element då? {0,0,0}?
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Hur radera alla variabler på en linje?

Inlägg av Al_Bundy »

sodjan skrev:Förstår inte hur du menar. Vad är det du vill göra med funktionerna?
Hur ska de anropa varandra?

> funk2(...och helt plötsligt här jag här.

Varför? Var anropar du funk2() ??

> Ni vet inte hur man kan göra så programmet glömmer sin dåtida väg?

Det går i princip inte. Det kallas "call stack", alltså hela vägen tillbaka.
Den kan man normalt (och ska normalt) inte röra. Om du tror att du
har behov av det, så är din logik i programmet galen.
Jag vill backa i programmet. Då anropade jag en funktion, men jag trodde att jag gick en annan väg. Efter jag hade anropat denna funktion så fortsatte jag som vanligt. Jag vill inte fortsätta som vanligt, utan välja en ny väg.
Blir det inte krasch om man har en funktion som anropar en funktion och den i sin tur anropar föregående funktion?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur radera alla variabler på en linje?

Inlägg av sodjan »

> en funktion som anropar en funktion och den i sin tur anropar föregående funktion?

Kallas "rekursivt anrop". Helt OK, om man vet vad man gör.

> Jag vill backa i programmet.

Du måste från början planera för denna "back" funktion.
Det är inget som du kan göra om det inte finns med i koden.

Det fortfarande lite oklart vad du menar med att "backa". Du kan så
klart inte få kod som redan är körd "okörd" så att säga.

Om du först anropar funk1 som sedan anropar funk2 som i sin tur anropar funk1 igen,
så är andra anropet av funk1 någonting annat än första anropet av funk1. Det är t.ex
normalt inte samma varabler, även om de så klart heter samma så är det separat lagring
med två olika exemplar i minnet.
Skriv svar