Premiär! Fyndchans i SweClockers Månadens Drop

C: Hur ska jag kunna deklarera denna variabel?

Permalänk

C: Hur ska jag kunna deklarera denna variabel?

Hej!

Jag har en lång kod här. Efter själva koden har kört klart så ska den hoppa till loop() men innan just loop() så ska den ta med sig några värden också. Jag försöker då deklarera variabler. Jag tänker göra om t.ex "34" till 34 som ni ser. Men jag får det inte att fungera. Vart ska jag deklarera variablerna?

Kod:

#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! /* Some questions to declare method, temperature and time */ int first = first_question(); // the first question int second = second_question(first); // the second question // Start up the library sensors.begin(); delay(5000); //important on linux as serial port can lock up otherwise } void printTemperaturesToSerial() { // 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"); // Read each of our sensors and print the value for(int i=0; i < 2; i++) // two sensors { Serial.print("Temperature for Device "); Serial.print( i ); Serial.print(" is: "); // Why "byIndex"? You can have more than one IC on the same bus. // 0 refers to the first IC on the wire Serial.println( sensors.getTempCByIndex(i) ); } Serial.println(); } 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); if (time1 == 100) { display.clearDisplay(); display.print("*****BACK*****"); display.println("You press B"); display.println("Retruning..."); display.display(); delay(2000); second_question(first); // jump back to the begining if press letter B as back. } sum_time1[i] = time1; delay(50); 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); second_question(first); // 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); second_question(first); // 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); second_question(first); // 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); } 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); if (time1 == 100) { display.clearDisplay(); display.print("*****BACK*****"); display.println("You press B"); display.println("Retruning..."); display.display(); delay(2000); second_question(first); // jump back to the begining if press letter B as back. } sum_time1[i] = time1; delay(50); 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); second_question(first); // 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); } // Jump to loop() with values of dv1 and dv0. // Tunr string to int. int dv0_time = int(String(sum_time1[0])+= String(sum_time1[1])); // Här har jag problem!! #####<<<<---- int dv1_time = int(String(sum_time2[0])+= String(sum_time2[1])); int dv0_temp = int(String(sum_temp1[0])+= String(sum_temp1[1])); int dv1_temp = int(String(sum_temp2[0])+= String(sum_temp2[1])); } void loop() // The loop { printTemperaturesToSerial(); delay(1000); //wait 1 sec }

Citat:

Regulator_kod.ino: In function ‘int second_question(int)’:
Regulator_kod:869: error: ‘sum_time1’ was not declared in this scope
Regulator_kod:870: error: ‘sum_time2’ was not declared in this scope
Regulator_kod:871: error: ‘sum_temp1’ was not declared in this scope
Regulator_kod:872: error: ‘sum_temp2’ was not declared in this scope

Absolut längst ned.
Jag har ju redan deklarerat om ni söker på sun_temp1 osv.

Tar jag bort koden.

int dv0_time = int(String(sum_time1[0])+= String(sum_time1[1])); // Här har jag problem!! #####<<<<---- int dv1_time = int(String(sum_time2[0])+= String(sum_time2[1])); int dv0_temp = int(String(sum_temp1[0])+= String(sum_temp1[1])); int dv1_temp = int(String(sum_temp2[0])+= String(sum_temp2[1]));

Så fungerar det OK!

Om jag skriver om koden längst ned till.

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); String dv0_time_s = String(sum_time1[0])+= String(sum_time1[1]); int dv0_time_int = int(dv0_time_s); } // Jump to loop() with values of dv1 and dv0. // Tunr string to int. /*int dv0_time = int(String(sum_time1[0])+= String(sum_time1[1])); // Här har jag problem!! #####<<<<---- int dv1_time = int(String(sum_time2[0])+= String(sum_time2[1])); int dv0_temp = int(String(sum_temp1[0])+= String(sum_temp1[1])); int dv1_temp = int(String(sum_temp2[0])+= String(sum_temp2[1]));*/ } void loop() // The loop { printTemperaturesToSerial(); delay(1000); //wait 1 sec }

Så fungerar det. Men dock inte när jag ska göra om String till int.

Permalänk
Medlem

När en slut-klammer nås så dödas alla variabler deklarerade mellan den och motsvarande öppnings-klammer. Tex:

{
int a = 0;
} <- a dör

int a;
{
a = 0;
} <- a dör inte för den var deklarerad utanför klammrarna.

Om du vill komma åt variabler överallt ifrån (inom samma fil) så kan du deklarera dom utanför klamrar helt och hållet, likt

// Deceleration for LED
const int led_green = 10;
const int led_red = 9;

i din kod. Då kommer dessa variabler vara tillgängliga för samtliga funktioner. Detta för att där inte finns någon slut-klammer som dödar dom. Detta kallas globala variabler och är lite bad-practice att göra, men i ditt fall kan det vara okej tycker jag.

Visa signatur

Intel i7-7700k @ 4.9Ghz - Noctua NH-U12P SE2 - MSI GTX 1070 Armor OC - AsRock Z270 Extreme4 - G.Skill Ripjaws V DDR4 3200MHz CL16 2x8GB - Corsair RM750x 750W - Samsung 970 EVO 500GB - Acer Predator X34 - Silverstone RV02-E - Asus Xonar Essence STX II 7.1 - Mionix Naos 8200 - Corsair Gaming MM400 - Das Keyboard 4 Ultimate MX Brown - Beyerdynamic DT990 Pro 250 Ohm - Antlion ModMic 4.0 Unidirectional

Permalänk
Medlem

Nu har jag inte försökt skriva någon c-kod sen nittiotalet och visste inte vad jag pysslade med då.
Men som felmeddelandet säger så är dom variablarna inte deklaraerade i samma scope. Alltså du skapar dom i if/else satserna, så dom lever bara där, sen försöker du komma åt dom utanför det scopet (direkt i "second_question").
Så testa att deklarera dom direkt under second_question istället för inne i if/elsarna

edit: eller ja som MaloW sa, gör dom globala bara

Permalänk
Medlem
Skrivet av flexm:

Nu har jag inte försökt skriva någon c-kod sen nittiotalet och visste inte vad jag pysslade med då.
Men som felmeddelandet säger så är dom variablarna inte deklaraerade i samma scope. Alltså du skapar dom i if/else satserna, så dom lever bara där, sen försöker du komma åt dom utanför det scopet (direkt i "second_question").
Så testa att deklarera dom direkt under second_question istället för inne i if/elsarna

edit: eller ja som MaloW sa, gör dom globala bara

Jaha, dom låg i if-else satser, då är det bättre som du säger att lägga dom utanför if/elsen bara.
Det var för mycket kod för mig för att se vilket scope dom låg inom haha

Visa signatur

Intel i7-7700k @ 4.9Ghz - Noctua NH-U12P SE2 - MSI GTX 1070 Armor OC - AsRock Z270 Extreme4 - G.Skill Ripjaws V DDR4 3200MHz CL16 2x8GB - Corsair RM750x 750W - Samsung 970 EVO 500GB - Acer Predator X34 - Silverstone RV02-E - Asus Xonar Essence STX II 7.1 - Mionix Naos 8200 - Corsair Gaming MM400 - Das Keyboard 4 Ultimate MX Brown - Beyerdynamic DT990 Pro 250 Ohm - Antlion ModMic 4.0 Unidirectional