Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
warwas
HV Guru

liitunud: 06.07.2003
|
07.03.2012 01:55:42
Konfifaili lugemine (Arduino / C++) |
|
|
Üritan siin tekitada sellist lahendust, kus Arduinos olev rakendus oskaks oma tööks vajaikud parameetrid SD kaardil olevast failist sisse lugeda.
Oleks vaja funktsiooni, mis oskab konfifailist vajaliku rea üles leida. Rea enda parimise lahendus on mul juba olemas ja toimib.
Konf ise oleks stiilis:
parameeter1=123
parameeter2=456
parameeter3=789 |
Hetkeseisuga olen kokku klopsinud sellise asja:
c++:
|
char *readini(char* str) { if (!configFile.open(&root, "CONFIG.INI", O_RDONLY)) { error("Conf open failed"); } char *result = NULL; char param[50]; char delims[] = "="; int i = 0; int16_t c; while ((c = configFile.read()) > 0) { param[i] += (char)c; i++; if((char)c == '\n') { result = strtok(param, delims); if( strcmp (result,str) == 0) { configFile.close(); return (strtok(NULL, delims)); } clearStr(param); i = 0; } } } void clearStr (char* str) { for (int c = 0; c < strlen(str); c++) { str[c] = NULL; } }
|
Fail avatakse ja nämmutatakse kenasti rida haaval läbi, aga seda soovitud stringi üles ei leita
|
|
Kommentaarid: 247 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
3 :: |
224 |
|
tagasi üles |
|
 |
Smith
HV veteran

liitunud: 25.08.2002
|
07.03.2012 10:07:21
|
|
|
Kas faili esimese rea pealt ka ei leia?
_________________ Only the Central Computer knows the truth |
|
Kommentaarid: 158 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
145 |
|
tagasi üles |
|
 |
warwas
HV Guru

liitunud: 06.07.2003
|
07.03.2012 10:24:53
|
|
|
Smith kirjutas: |
Kas faili esimese rea pealt ka ei leia? |
Hea küsimus - ma proovisin pidevalt alumiste ridadega.
Vidin on kahjuks kodus, niiet alles õhtul saan proovida.
|
|
Kommentaarid: 247 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
3 :: |
224 |
|
tagasi üles |
|
 |
andreie
HV vaatleja

liitunud: 09.09.2006
|
07.03.2012 19:32:46
|
|
|
Muutuja "param" asub pinus ja seega pärast funktsioonist "readini" tagasi pöördumist asub taaskasutusse minevas mälualas. Seega, keegi ei garanteeri, kui ruttu või kui hilja see mälu muude andmetega üle kirjutatakse - võib-olla isegi kohe.
Kuna Sa nagunii C++'i kasutad, oleks lihtne lahendus kasutada C++'i standardteegi klassi std::string (päisefail: #include <string>); muutes selle jaoks funktsiooni "readini" tagastava väärtuse tüübi std::string'iks.
Tulevikule mõeldes pakun välja kaaluda mitte iseehitamist, vaid teekide kasutuselevõttu - näiteks libPropList, JSON või midagi muud samas stiilis. Seda muidugi juhul, kui on ette näha, et neid keerulisemaid võimalusi ka vaja läheb.
_________________ Unix survives only because everyone else has done so badly. |
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
warwas
HV Guru

liitunud: 06.07.2003
|
08.03.2012 01:01:11
|
|
|
Tänud vihjete eest!
Tundub, et andreie oli täiesti õigel teel. Kui kivisse ainult selle lugemise ja parsimise osa kirjutasin, siis kõik töötas. Kui aga ülejäänud koodi ka juurde panin, siis ilmselgelt mälukasutus kasvas ja tekkisidki anomaaliad.
Tegin selle esialgu String klassi abil ringi ja esialgu tundub toimivat:
c++:
|
String readini(char* str) { if (!configFile.open(&root, "CONFIG.INI", O_RDONLY)) { error("Conf open failed"); } String param; int i = 0; int16_t c; while ((c = configFile.read()) > 0) { param += (char)c; i++; if((char)c == '\n') { if(param.indexOf(str) == 0) { configFile.close(); int delimPos = param.indexOf('='); param = param.substring(delimPos+1, param.length()); return param; } param = 0; i = 0; } } }
|
Pean nüüd ainult veel oma parameetreid endid (IP->byte[], jms.) parsivad funktsioonid ringi tegema, et need ka stringe sööma hakkaks.
Kuna kõik see teema on minu jaoks veel suhtkoht uus ja võõras, siis esialgu veel C/C++ tumedatesse sügavustesse kaevuma ei hakkaks.
|
|
Kommentaarid: 247 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
3 :: |
224 |
|
tagasi üles |
|
 |
andreie
HV vaatleja

liitunud: 09.09.2006
|
08.03.2012 23:22:14
|
|
|
Teine variant on panna funktsioonile "readini" argumendina kaasa puhver "param". Siis Sa ei pea oma teisi funktsioone ringi tegema.
Mulle endale meeldib see variant vähem, sest teeb funktsiooni "readini" kasutamise keerulisemaks ja lisaks tuleb viitadega toimetamisel alati teha lisatööd kindlustamaks mälu vabastamist pärast kasutamise lõppu (mõnikord saab seda küll pinu kasutamisega lihtsustada).
_________________ Unix survives only because everyone else has done so badly. |
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
warwas
HV Guru

liitunud: 06.07.2003
|
09.03.2012 10:23:31
|
|
|
Tänud!
Kui aega saan, siis kaalun neid teisi variante kah.
|
|
Kommentaarid: 247 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
3 :: |
224 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|