(8# 已解決)Arduino(ESP8266) 的 while 問題

本帖最後由 C_Law 於 2021-7-25 00:11 編輯

以下的一段 Code,我係想從 server.arg(1) 搵出 19200 至 808100 的一段數值變做一條 Link http://192.168.1.4:8081。

由19200 到 808100,一共 5 個數值,理應由 i=0 做到 4 就做完。但執行時,while 似乎無理到 (i<=4) 的要求一直做落去。究竟錯了什麼?

ps.
GetOneValue() 係從 server.arg(1) 的 iStartPos 位置起抽一組數值出來,並傳會下一個 space 之後的位置做 iStartPos
TrueValue() 可視作將 GetOneValue/fScale
  1. bool myRedirect(float fScale, int iStartPos) {
  2.   /*
  3.     server.arg(1): 0 100000 0 99000 19200 16800 4300 9800 8500 12000 23000 34000;
  4.     iStartPos begins at 17, position of the 1 of 19200 in server.arg(1);
  5.     fScale = 100.00;
  6.   */
  7.   if (myDebug) Serial.println("\n\r\n\rEntering myRedirect()");
  8.   bool Result = true;
  9.   int i = 0;
  10.   unsigned int uiTemp[4];
  11.   while ((iStartPos < server.arg(1).length()) && (i <= 4) && Result) {
  12.     uiTemp[i] = TrueValue(fScale, GetOneValue(server.arg(1), &iStartPos));
  13.     if ((i < 4) && (uiTemp[i] > 255)) Result = false;
  14.     else if ((i == 4) && (uiTemp[i] > 65535)) Result = false;
  15.     if (myDebug) {
  16.       Serial.print("i=");
  17.       Serial.print(i);
  18.       Serial.print("   uiTemp[");
  19.       Serial.print(i);
  20.       Serial.print("]=");
  21.       Serial.print(uiTemp[i]);
  22.       Serial.print("   Result=");
  23.       if (Result) Serial.println("true");
  24.       else Serial.println("false");
  25.     }
  26.     i = i + 1;
  27.   }
  28.   Serial.print("Final i=");
  29.   Serial.println(i);
  30.   /*
  31.     Do something else
  32.   */
  33.   if (myDebug) Serial.println("Quit myRedirect()");
  34.   return Result;
  35. }
複製代碼
執行時,即使 i >=5,只要 Result 係 True,server.arg(1) 有幾長就一直的做落去,例如:
  1. Entering myRedirect()
  2. i=0   uiTemp[0]=192   Result=true
  3. i=1   uiTemp[1]=168   Result=true
  4. i=2   uiTemp[2]=1   Result=true
  5. i=3   uiTemp[3]=4   Result=true
  6. i=4   uiTemp[4]=8081   Result=true
  7. i=5   uiTemp[5]=123   Result=true
  8. i=6   uiTemp[6]=234   Result=true
  9. i=7   uiTemp[7]=345   Result=false
  10. Final i=8
  11. Quit myRedirect()
複製代碼
如果我將 server.arg(1) 入面的 16800 改為 26800(將會出現 Result = false),個 while 係識得停:
  1. Entering myRedirect()
  2. i=0   uiTemp[0]=192   Result=true
  3. i=1   uiTemp[1]=268   Result=false
  4. Final i=2
  5. Quit myRedirect()
複製代碼
為何個 while 會忽略了 i<=4?

唔識Arduino, 不過見第13行係"&&", 照計應該係or唔係and.

TOP

本帖最後由 C_Law 於 2021-7-24 19:16 編輯
唔識Arduino, 不過見第13行係"&&", 照計應該係or唔係and.
kwliu 發表於 2021/7/24 18:42


uiTemp[0~3] 係 IP-address,應該 0~255,所以係( (i<4) && (uiTemp[i]>255)) 時 Result 會係 false。即係後面將 168 改為 268 的例子。

TOP

本帖最後由 xiao 於 2021-7-24 22:13 編輯

若果確定只讀6筆 乾脆用for loop
IP array 最好指定8bit
int ,不同的cpu編譯器會解讀成不同的長度
或者自己試試看會不會overflow
https://github.com/esp8266/Ardui ... k/include/c_types.h

TOP

若果確定只讀6筆 乾脆用for loop
xiao 發表於 2021/7/24 22:03


應該係 ip-address 的 4 個 byte 及一個 Port no.,總共讀取 5 個數值,至於再後面的數值係其他用途,會由其他程序去讀。

用 For 都得,不過都想知道我這樣用 while 究竟出了什麼錯,得個知字。

TOP

直頭吾行for/while loop la, 實際係check 4次 (line 13),第五次個range都吾同 (line 14)

Line 14仲有機會行五次,吾係淨係i=4先行,嘥code space/execution time

TOP

unsigned int uiTemp[4]只預留了4個變數位置。

但是,當i = 4時,uiTemp[i]已經是第五個變數位置,這樣會寫花stack上面的其他變數。

TOP

本帖最後由 C_Law 於 2021-7-25 00:10 編輯
unsigned int uiTemp[4]只預留了4個變數位置。

但是,當i = 4時,uiTemp已經是第五個變數位置,這樣會寫花 ...
marlin12 發表於 2021/7/24 22:22


Ah~~~~似乎係這個問題!

不同語言的設定 array 方式未必一樣,X[4] 的 4可能係 0~3 一共 4 個的意思,又可能係  0~4、又可能係 1~4……。真係好易記錯。

用來寫緊個 ESP8266 的 Notebook 正在充電,等充完電再試試。

(更新)
問題真係出自設定 array。將第 10 行改為 unsigned int uiTemp[5](即係由 0~4) 就正常運作了!

唔該晒各位師兄!

TOP