루프 밖으로 점프하는 방법? 아래 프로그램에서 goto 또는 기타 점프 관련 프로그램 사용 방법

const int analogPin1 = A1; const int analogPin2 = A2; const int analogPin3 = A3; const int ledPin = 13; const int ledPin2 = 7; const int thresold = 400; unsigned int x1, x2, x3, fault = 0; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); } void Config() { delay(1000); Serial.print("ATE0r"); Response(); Serial.print("ATr"); Response(); Serial.print("AT+CMGF=1r"); Response(); Serial.print("AT+CNMI=1,2,0,0,0r"); Response(); } void Response() { int count = 0; Serial.println(); while (1) { if (Serial.available()) { char data = Serial.read(); if (data == "K") { Serial.println("OK"); break; } if (data == "R") { Serial.println("GSM Not Working"); break; } } count++; delay(10); if (count == 1000) { Serial.println("GSM not Found"); break; } } } void loop() { int analogValue1 = analogRead(analogPin1); int analogValue2 = analogRead(analogPin2); int analogValue3 = analogRead(analogPin3); if (analogValue1 < thresold) { x1 = 1; fault = x1; } if (analogValue2 < thresold) { x2 = x1 + 3; fault = x2; } if (analogValue3 < thresold) { x3 = x1 + x2 + 5; fault = x3; } switch (fault) { case 1: digitalWrite(ledPin, HIGH); Serial.print("AT+CMGF=1\r"); delay(1000); Serial.print("AT+CMGS=\"+919\"\r"); delay(1000); Serial.print("PHASE 1 HAS GONE"); delay(1000); Serial.write(0x1A); delay(1000); goto nsr; break; case 3: digitalWrite(ledPin, HIGH); Serial.print("AT+CMGF=1\r"); delay(1000); Serial.print("AT+CMGS=\"+919\"\r"); delay(1000); Serial.print("2 HAS GONE"); delay(1000); Serial.write(0x1A); delay(1000); goto nsr; break; case 4: digitalWrite(ledPin, HIGH); Serial.print("AT+CMGF=1\r"); delay(1000); Serial.print("AT+CMGS=\"+919\"\r"); delay(1000); Serial.print("1 AND 2 HAS GONE"); delay(1000); Serial.write(0x1A); delay(1000); goto nsr; break; case 5: digitalWrite(ledPin, HIGH); Serial.print("AT+CMGF=1\r"); delay(1000); Serial.print("AT+CMGS=\"+919\"\r"); delay(1000); Serial.print("3 HAS GONE"); delay(1000); Serial.write(0x1A); delay(1000); Serial.print("AT+CNMI=2,2,0,0,0"); goto nsr; break; case 6: digitalWrite(ledPin, HIGH); Serial.print("AT+CMGF=1\r"); delay(1000); Serial.print("AT+CMGS=\"+919\"\r"); delay(1000); Serial.print("1 AND 3 HAS GONE"); delay(1000); Serial.write(0x1A); delay(1000); goto nsr; break; case 8: digitalWrite(ledPin, HIGH); Serial.print("AT+CMGF=1\r"); delay(1000); Serial.print("AT+CMGS=\"+919\"\r"); delay(1000); Serial.print("2 AND 3 HAS GONE"); delay(1000); Serial.write(0x1A); delay(1000); goto nsr; break; case 10: digitalWrite(ledPin, HIGH); Serial.print("AT+CMGF=1\r"); delay(1000); Serial.print("AT+CMGS=\"+919\"\r"); delay(1000); Serial.print("ALL 3 HAS GONE"); delay(1000); Serial.write(0x1A); delay(1000); goto nsr; break; default: x1, x2, x3, fault = 0; digitalWrite(ledPin, LOW); break; } x1, x2, x3, fault = 0; digitalWrite(ledPin, LOW); do { int analogValue1 = analogRead(analogPin1); int analogValue2 = analogRead(analogPin2); int analogValue3 = analogRead(analogPin3); } while (analogValue1 < thresold || analogValue2 < thresold || analogValue3 < thresold); } do { int analogValue1 = analogRead(analogPin1); int analogValue2 = analogRead(analogPin2); int analogValue3 = analogRead(analogPin3); } while ((analogValue1 > th) && (analogValue2 > th) && (analogValue3 > th)); } nsr : if ((analogValue1 > th) && (analogValue2 > th) && (analogValue3 > th)) { digitalWrite(ledPin, HIGH); Serial.begin(9600); Serial.print("\r"); delay(1000); Serial.print("AT+CMGF=1\r"); delay(1000); Serial.print("AT+CMGS=\"+919\"\r"); delay(1000); Serial.print("ALL 3 Phase Restored"); delay(1000); Serial.write(0x1A); delay(1000); Serial.print("\r"); delay(1000); Serial.print("AT+CMGF=1\r"); delay(1000); Serial.print("AT+CMGS=\"+919\"\r"); delay(1000); Serial.print("ALL 3 Phase Restored"); delay(1000); Serial.write(0x1A); delay(1000); do { int analogValue1 = analogRead(analogPin1); int analogValue2 = analogRead(analogPin2); int analogValue3 = analogRead(analogPin3); } while ((analogValue1 > th) && (analogValue2 > th) && (analogValue3 > th)); } 

댓글

  • 코드 형식을 올바르게 지정하십시오. 나는 ' 거기에있는 것을 따를 수 없습니다.
  • 예, 스파게티 코드의 불쾌한 부분입니다 (정말 멋지게 말함).
  • 그리고 C ++ 포맷터 를 사용한 후 '이 ' 작동하지 않음
  • 단지 x1, x2, x3, fault = 0;가 이러한 변수를 0으로 설정해야합니까? 안 좋은 소식이 있습니다.

답변

별도의 함수를 만들고 싶습니다. nsr 및 goto 대신 사용합니다.

void nsr(void){ if ((analogValue1 > th) && (analogValue2 > th) && (analogValue3 > th)) { digitalWrite(ledPin, HIGH); Serial.begin(9600); Serial.print("\r"); delay(1000); Serial.print("AT+CMGF=1\r"); delay(1000); Serial.print("AT+CMGS=\"+919\"\r"); delay(1000); Serial.print("ALL 3 Phase Restored"); delay(1000); Serial.write(0x1A); delay(1000); Serial.print("\r"); delay(1000); Serial.print("AT+CMGF=1\r"); delay(1000); Serial.print("AT+CMGS=\"+919\"\r"); delay(1000); Serial.print("ALL 3 Phase Restored"); delay(1000); Serial.write(0x1A); delay(1000); do { int analogValue1 = analogRead(analogPin1); int analogValue2 = analogRead(analogPin2); int analogValue3 = analogRead(analogPin3); } while ((analogValue1 > th) && (analogValue2 > th) && (analogValue3 > th)); } } 

답변

goto nsr 

실행하지 않을 부분을 건너 뛰려면 부울을 사용하십시오. goto를 사용하는 것은 (거의) 결코 좋은 생각이 아닙니다.

{and}의 정렬이 잘못 되었기 때문에 정확히 무엇을 실행하고 싶은지 모르겠습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다