作者: C_Law 時間: 2021-7-24 18:10 標題: (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
- bool myRedirect(float fScale, int iStartPos) {
- /*
- server.arg(1): 0 100000 0 99000 19200 16800 4300 9800 8500 12000 23000 34000;
- iStartPos begins at 17, position of the 1 of 19200 in server.arg(1);
- fScale = 100.00;
- */
- if (myDebug) Serial.println("\n\r\n\rEntering myRedirect()");
- bool Result = true;
- int i = 0;
- unsigned int uiTemp[4];
- while ((iStartPos < server.arg(1).length()) && (i <= 4) && Result) {
- uiTemp[i] = TrueValue(fScale, GetOneValue(server.arg(1), &iStartPos));
- if ((i < 4) && (uiTemp[i] > 255)) Result = false;
- else if ((i == 4) && (uiTemp[i] > 65535)) Result = false;
- if (myDebug) {
- Serial.print("i=");
- Serial.print(i);
- Serial.print(" uiTemp[");
- Serial.print(i);
- Serial.print("]=");
- Serial.print(uiTemp[i]);
- Serial.print(" Result=");
- if (Result) Serial.println("true");
- else Serial.println("false");
- }
- i = i + 1;
- }
- Serial.print("Final i=");
- Serial.println(i);
- /*
- Do something else
- */
- if (myDebug) Serial.println("Quit myRedirect()");
- return Result;
- }
- Entering myRedirect()
- i=0 uiTemp[0]=192 Result=true
- i=1 uiTemp[1]=168 Result=true
- i=2 uiTemp[2]=1 Result=true
- i=3 uiTemp[3]=4 Result=true
- i=4 uiTemp[4]=8081 Result=true
- i=5 uiTemp[5]=123 Result=true
- i=6 uiTemp[6]=234 Result=true
- i=7 uiTemp[7]=345 Result=false
- Final i=8
- Quit myRedirect()
- Entering myRedirect()
- i=0 uiTemp[0]=192 Result=true
- i=1 uiTemp[1]=268 Result=false
- Final i=2
- Quit myRedirect()
作者: kwliu 時間: 2021-7-24 18:42
唔識Arduino, 不過見第13行係"&&", 照計應該係or唔係and.
作者: C_Law 時間: 2021-7-24 19:14
本帖最後由 C_Law 於 2021-7-24 19:16 編輯
uiTemp[0~3] 係 IP-address,應該 0~255,所以係( (i<4) && (uiTemp[i]>255)) 時 Result 會係 false。即係後面將 168 改為 268 的例子。
作者: xiao 時間: 2021-7-24 22:03
本帖最後由 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
作者: C_Law 時間: 2021-7-24 22:14
應該係 ip-address 的 4 個 byte 及一個 Port no.,總共讀取 5 個數值,至於再後面的數值係其他用途,會由其他程序去讀。
用 For 都得,不過都想知道我這樣用 while 究竟出了什麼錯,得個知字。
作者: 亞基拉 時間: 2021-7-24 22:21
直頭吾行for/while loop la, 實際係check 4次 (line 13),第五次個range都吾同 (line 14)
Line 14仲有機會行五次,吾係淨係i=4先行,嘥code space/execution time
作者: marlin12 時間: 2021-7-24 22:22
unsigned int uiTemp[4]只預留了4個變數位置。
但是,當i = 4時,uiTemp[i]已經是第五個變數位置,這樣會寫花stack上面的其他變數。
作者: C_Law 時間: 2021-7-24 22:44
本帖最後由 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) 就正常運作了!
唔該晒各位師兄!

